2015-09-27 4 views
2

Основного вопроса:Неправильного результата после деления знакового целого числа

Я написал следующий блок кода:

DATASEG 

Result db ? 
Modulo db ? 

var3 db -9 
var4 db 2 


CODESEG 

start: 

    mov ah, 0 
    mov al, [var3] 
    mov bl, [var4] 
    div bl 
    mov [Result], al 
    mov [Modulo], ah 

я получаю неправильный результат для -9/2. Результат: «7B», кажется, что он относится к «F7» как 247.

Как я могу сделать это правильно, все еще определяя var3 как databyte (db)?

Или, есть ли другой способ?

Спасибо за ответы

+3

См [справочную страницу для 'DIV'] (http://x86.renejeschke.de/html/file_module_x86_id_72. HTML). он говорит * unsigned divide *. – lurker

+4

Подсказка по кодированию языка сборки: если инструкция, похоже, не делает то, что вы ожидаете, прочитайте инструкцию по набору инструкций * тщательно *. Обычно эта инструкция выполняет то, что она предназначена, и проблема заключается в вашем понимании этого. –

ответ

3

Вы должны использовать idiv для выполнения знакового деления.

div не будет правильно обрабатывать отрицательное число в var3

mov al, [var3] 
cbw 
idiv byte ptr [var4] 

Из ваших комментариев я вижу, что вы не любите cbw инструкции и что вы не хотите использовать короткий код инструкция разделения. Вы всегда можете закодировать это нравится:

mov al, [var3] 
mov ah, FFh  ;Only if you 'know' var3 has a negative value! 
mov bl, [var4] 
idiv bl 
mov [Result], al 
mov [Modulo], ah 

В качестве альтернативы и по-прежнему избегая cbw:

movsx ax, byte ptr [var3] 
mov bl, [var4] 
idiv bl 
mov [Result], al 
mov [Modulo], ah 
+0

Я заменил его «idiv», я получаю тот же результат, «01» в ах и «7B» в al – tilikompowaa

+0

, все равно это делается не с помощью команды «cbw»? и тем самым только «аль» будет состоять из «F7»? – tilikompowaa

+0

Даже с 'cbw' будет AL = F7h. 'cbw' просто поместит FFh в AH. Если вы хотите, то просто замените 'cbw' на' mov ah, FFh' –

Смежные вопросы