Я столкнулся с этим сравнением при отладке:
| 38 19 | CMP BYTE PTR DS:[ECX], BL
Я установил на нем точку останова и увидел это (значения в hex):
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 является агностическим, то есть интерпретация результата сравнения как подписанного/неподписанного была чем-то, что будет делать следующая инструкция перехода (например, JG против JA). За сравнением следует JNE, который выполняется, поскольку ZF=0 и приводит к неправильным результатам.
CMP
устанавливает флаги правильно, и значения, которые вы показали, указывают на то, что ZF должен быть установлен, поэтому я на 99% уверен, что одно из описанных вами значений неверно. Я бы сначала проверил содержимое памяти, вы уверены, что вds:[ecx]
есть 55? Как вы получили этот номер? Это режим 32b с плоской моделью памяти (ds = тогда не важно)? - person Ped7g   schedule 19.01.2017CMP
правильно устанавливает флаги. Вините код, а не процессор. - person Weather Vane   schedule 19.01.2017CMP
, но если это не одноразовая ошибка блуждающего электрона из-за рентгеновского столкновения и т. д. (может случиться, с количеством HW в повседневной жизни есть шанс, что по крайней мере несколько ныне живущих людей хотя бы раз в жизни столкнутся с такой ситуацией ... хотя они, скорее всего, не заметят), это произвело бы так много плохих результаты, что вы никогда не дойдете до загрузки вашей ОС и запуска отладчика ... Так что, если вы не веритеcmp
, попробуйте еще раз, и все, ищите проблему вокруг. - person Ped7g   schedule 20.01.2017