Я наткнулся на это сравнение при отладке:x86 сборка - CMP не устанавливая флаг нуля правильно
| 38 19 | CMP BYTE PTR DS:[ECX], BL
я поставил точку останова на нее и увидел это (значения в шестнадцатеричном):
ECX = 00838430
BYTE PTR[ECX]=[00838430]=55
EBX = 00000055 (BL = 55)
EFLAGS = 00000314 (CF=0 OF=0 SF=0 ZF=0 AF=1 PF=1)
Итак, я ожидал, что после выполнения этого сравнения будет установлен флаг нуля, поскольку байт, на который указывают ECX и BL, равен. Однако то, что произошло вместо этого было то, что флаг переполнения был установлен и ZF остался значение 0. После сравнения:
EFLAGS = 00000A06 (CF=0 OF=1 SF=0 ZF=0 AF=0 PF=1)
Почему он ведет себя, как это? Связано ли это с целыми числами с подписью/без знака? Я думал, что CMP является агностиком, т. Е. Интерпретирует результат сравнения, поскольку signed/unsigned является чем-то, что будет делать следующая инструкция перехода (например, JG vs JA). За сравнением следует JNE, который берется из-за ZF = 0 и вызывает неправильные результаты.
Обычно 'CMP' ли установить флаги правильно, и значения, которые вы сделали шоу указывают ZF должен быть установлен, так что я 99% уверен, что одна из ценностей ты описывающими неверен. Я бы сначала проверил содержимое памяти, уверены ли вы, что в 'ds: [ecx]'? Как вы получили этот номер? Является ли этот 32b-режим с плоской моделью памяти (ds = не важно тогда)? – Ped7g
Пожалуйста, помните, что 'CMP' * * * устанавливает флаги правильно. Вините код, а не процессор. –
Ну, технически у вас может быть поврежден процессор, производящий неправильные флаги после 'CMP', но если это одноразовый провал блуждающего электрона из-за столкновения рентгеновских лучей/и т. Д. (может случиться, с количеством HW в повседневной жизни шанс состоит в том, что по крайней мере немногие в настоящее время живущие люди, по крайней мере, однажды в их жизни столкнутся с такой ситуацией ... хотя они, скорее всего, не заметят), это вызовет так много плохих результаты, которые вы никогда не получите до загрузки вашей ОС и запущенного отладчика ...Поэтому, если вы не верите 'cmp', попробуйте его еще раз, и все, ищите проблему вокруг. – Ped7g