assembler nasm. После sdq и деления вычитаем из регистра знака число и к результату добавляется 1, почему?

Linux, nasm, ld i386 Вот код:

mov eax, -100 ; в регистр eax ложу -100
cdq           ; указываю регистру edx знак eax, то есть в регистре edx теперь 0xFFFFFFFF
mov ebx, -2   ; в ebx ложу -2
idiv ebx      ; делю -100 на -2, теперь в регистре eax лежит 50
PUTCHAR al    ; это макрос, который выводит символ по таблице ascii (через код в регистре), 
              ; в al лежит 50 = 0x32, и выводит символ '2'
PUTCHAR 10    ; макрос выводит символ перевода строки
sub edx, 0xCA ; вычитаю из edx(0xFFFFFFFF) значение 0xCA, вот тут то и вопрос:
PUTCHAR dl    ; по идее 0xFFFFFFFF - 0xCA = 0x35 и это символ '5', 
              ; но мне выдает символ '6', якобы результат вычитания равен 0x36. Почему?
PUTCHAR 10    ; перевод строки
FINISH        ; завершение программы.

Если не выполнять деление:

mov eax, -100 ; в регистр eax ложу -100
cdq           ; указываю регистру edx знак eax, то есть в регистре edx теперь 0xFFFFFFFF
sub edx, 0xCA ; вычитаю из edx(0xFFFFFFFF) значение 0xCA
PUTCHAR dl    ; а теперь 0xFFFFFFFF - 0xCA = 0x35 и это символ '5' и мне верно его показывает. 
PUTCHAR 10    ; перевод строки
FINISH        ; завершение программы.

В общем вот. Почему так?


Ответы (1 шт):

Автор решения: Илья К

Когда ты выполняешь деление idiv ebx ты затираешь значение edx и он становиться равным нулю.

→ Ссылка