Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.03.2024, 14:17   #1
iXNomad
Пользователь
 
Регистрация: 06.01.2021
Сообщений: 45
По умолчанию Почему неправильно срабатывает ZF флаг при сравнении

Объясните пожалуйста, не понимаю, почему у меня включается флаг ZF после сравнения cl, где лежит 19 с числом 20, после чего естественно срабатывает прыжок на завершение с ошибкой.



Вот исходник, сейчас пытаюсь отлаживать.

Вот функция:
Код:
check_exp_format:
        push rbp
        mov rbp, rsp
        push rsi
        push rbx

        xor ax, ax
        xor rbx, rbx
        xor rcx, rcx

        mov rsi, [rbp+16]
        mov bl, [rsi]          ; loading the first byte
        cmp bl, "q"
        jz near .q_fine
        cmp bl, "Q"
        jz near .q_fine
        cmp bl, "-"
        jz .setminus1flag
        cmp bl, "0"
        jl near .q_err
        cmp bl, "9"
        jg near .q_err
        jmp .skipminus1flag
.setminus1flag:
        inc ah
.skipminus1flag:
        
        mov cl, ah              ; operand1 sign shift
        mov bl, [rsi+rcx]
        cmp bl, "0"             ; it has to start with a digit
        jl near .q_err
        cmp bl, "9"
        jg near .q_err
.seekforoperation:
        inc cl
        sub cl, ah
        cmp cl, 20              ; max 64bit operand consists of 19 digits + '-' sign
        jz .q_err
        add cl, ah
        mov bl, [rsi+rcx]
        cmp bl, "+"
        jz near .closefound
        cmp bl, "-"
        jz near .foundsub
        cmp bl, "*"
        jz near .foundmul
        cmp bl, ":"
        jz near .founddiv
        cmp bl, "/"
        jz near .founddiv
        cmp bl, "^"
        jz near .foundpow
        cmp bl, "0"
        jl near .q_err
        cmp bl, "9"
        jg near .q_err
        jmp .seekforoperation

.foundsub:
        inc al
        jmp near .closefound
.foundmul:
        add al, 2
        jmp near .closefound
.founddiv:
        add al, 3
        jmp near .closefound
.foundpow:
        add al, 4
.closefound:
        shl al, 4
        add al, cl

        shl ah, 1
        inc cl
        add rsi, rcx
        xor cl, cl
        mov bl, [rsi]           ; now checking the first byte of operand2
        cmp bl, "-"
        jz .setminus2flag
        cmp bl, "0"
        jl near .q_err
        cmp bl, "9"
        jg near .q_err
        jmp .skipminus2flag
.setminus2flag:
        inc ah
        inc rsi
.skipminus2flag:        
        
                               
        mov bl, [rsi+rcx]        ; now proceeding operand2
        cmp bl, "0"             ; but we need at least one digit
        jl .q_err
        cmp bl, "9"
        jg .q_err
.seekfortheend:
        inc cl
        cmp cl, 20
        jz .q_err
        mov bl, [rsi+rcx]
        test bl, bl
        jz .q
        cmp bl, 10
        jz .q
        cmp bl, "0"
        jl .q_err
        cmp bl, "9"
        jg .q_err
        jmp .seekfortheend

.q: 
        pop rbx
        pop rsi
        mov rsp, rbp
        pop rbp
        ret
.q_fine:
        push qword 0
        call _exit
.q_err:
        push qword 1
        call _exit
Я вообще с индексацией немного запутался, что у меня где, думаю наверно до 19 индекса по идее надо проверять, но тут меня отладчик просто сбил с толку вообще.

Последний раз редактировалось iXNomad; 24.03.2024 в 14:23.
iXNomad вне форума Ответить с цитированием
Старый 02.04.2024, 05:06   #2
Nif-naf
Форумчанин
 
Аватар для Nif-naf
 
Регистрация: 05.09.2016
Сообщений: 133
По умолчанию

понять можно. Предпологается вычитание из левого поля. Если число меньше нуля то и флаг будет
Немного о GoAsm.

Последний раз редактировалось Nif-naf; 02.04.2024 в 05:10.
Nif-naf вне форума Ответить с цитированием
Старый 03.04.2024, 05:26   #3
Nif-naf
Форумчанин
 
Аватар для Nif-naf
 
Регистрация: 05.09.2016
Сообщений: 133
По умолчанию

Более того если а<с, то jb, если а=с то je, a jz это из области .bss. Более того много могет не робить вааще
Немного о GoAsm.
Nif-naf вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему не срабатывает обработка ошибки? Kronos913 Общие вопросы Delphi 5 04.07.2021 03:05
Паскаль.Почему условие не срабатывает? Max$$ Помощь студентам 12 26.09.2017 20:10
Почему не срабатывает preg_replace? Karyuudo Помощь студентам 3 20.09.2015 01:16
Не срабатывает счетчик при сравнении textbox'сов paver C# (си шарп) 2 28.03.2014 14:52
почему неправильно? Tolian92 Паскаль, Turbo Pascal, PascalABC.NET 0 27.03.2012 02:04