Ответ должен быть 0 с остатком 11. Но ответ заканчивается 104 и как-то с остатком 3.
Это означает, что AX
содержал значение 0x0F0B
вместо 0x000B
перед инструкцией div
.
W. Комментарий Чанга подразумевает причину этого:
В отличие от языков программирования более высокого уровня (таких как C), язык ассемблера позволяет центральному процессору напрямую что делать.
Поэтому программист должен убедиться, что типы данных используются правильно.
Ваша "переменная" bNum1
имеет длину в один байт. Это будет переменная типа unsigned char
на языке программирования C.
Однако инструкция mov ax, [bNum1]
будет обращаться к двухбайтовому значению в памяти. Это равняется типу данных unsigned short
в C.
Эта инструкция будет интерпретировать два байта, хранящиеся по адресу bNum1
, и адрес, следующий за этим адресом, как один 16-битный число.
Байт по адресу bNum1
равен 11, а байт по адресу, следующему за этим адресом (bNum2
), равен 15; эти два байта будут интерпретироваться как 0xF0B
.
Что делать
W. Чанг уже рекомендовал использовать dw
вместо db
.
На языке программирования C это приведет к изменению типа данных переменной bNum1
с unsigned char
на unsigned short
.
Однако вы, возможно, не захотите менять тип данных.
В этом случае вам потребуется преобразовать 8-разрядное число в 16-разрядное:
For беззнаковых чисел это просто делается путем установки старших 8 битов в ноль.
Для знаковых чисел процессоры x86 имеют инструкции с именем cbw
(от 8 до 16 бит) и cwd
(от 16 до 32 бит). К сожалению, это работает только с регистром AX
.
В следующих примерах показано, как 8-разрядное число в AL
преобразуется в 16-разрядное число в AX
:
Без подписи:
mov al, [bNum1]
mov ah, 0
Подпись:
; You want to load bNum6 to BX ...
mov al, [bNum6]
cbw
mov bx, ax
; ... and bNum5 to AX
mov al, [bNum5]
cbw