И этот дамп регистров имеет место до idiv
(или после того, как GDB перехватывает SIGFPE, что должно быть то же самое)?
У вас это задом наперед: ZF = 1 означает, что условие "равно" правда . (Так что меньше или равно setle
тоже верно). Так что setle cl
должно дать вам 1
.
С R10 = 1, R10D = 1 также. R10D & R10D != 0
поэтому ZF должен быть очищен. Таким образом, r10d
равно НЕ <= 0, поэтому <code>setle помещает 0
в CL, и вы получаете #DE
исключение деления.
С этим исходным кодом NASM:
mov r10d, 1
xor ecx,ecx
mov eax, 0x64
test r10d,r10d
setle cl
cdq
idiv ecx
Встроенный в Linux stati c исполняемый файл с nasm -felf64 foo.asm
&& ld foo.o -o foo
(точка входа по умолчанию находится в верхней части раздела .text), я запустил его в GDB (потому что это было быстрее, чем продумывать все детали, и я хотел посмотреть, были ли EFLAGS изменены ошибочным idiv).
Используйте команду GDB starti
, чтобы начать сверху, и пошагово. (С layout reg
).
Прямо перед idiv
, я получаю EFLAGS = [ IF ]
, ecx = 0
. (С r10d = 1
).
Как и ожидалось, R10D> 0 (не <= 0) приводит к ECX = 0. </strong>
После попытки пройти мимо idiv
или использования continue
, EFLAGS = [ RF IF ]
. Так что ваш дамп реестра GDB не имеет смысла, если только другой ЦП или ОС не может сделать что-то другое с FLAGS в случае ошибки.