2013-04-24 2 views
0

Ожидается, что вывод ниже кода сборки будет 6, но он будет равен 3. Что случилось?, где остаток переходит в операцию div (X86 tasm ассемблер)

data_seg segment 
msg1 db "hi",10,13,"$" 
msg3 db 26 
num db 10 
data_seg ends 
code_seg segment 
assume cs:code_seg, ds:data_seg 
start: 
     mov ax,data_seg     ;init 
     mov ds,ax 

    loop1: 
     mov ah,0 
     mov al,msg3 
     div num 
     mov ah,02 
     int 21h 
    term: 
     mov ah,4ch   ;termination code      
     mov al,0 
     int 21h 
code_seg ends 
end start 
+3

Вздохнуть ... посмотреть, что 'div' делит на что. В вашем случае оставшаяся часть находится в 'ah' ... поэтому вы быстро сбиваете ее. 'mov dl, ah' может исправить вас. –

+2

О да ... если вы ожидаете увидеть число, 'add dl, '0'' ... –

+0

Остальное будет ах, а не dl. Только что проверил – manoj

ответ

4

От documentation:

беззнаковое двоичное деление аккумулятора на источник. Если делитель источника является байтовым значением, то AX делится на src, а коэффициент помещается в AL , а остаток в AH. Если исходным операндом является слово значение, то DX: AX делится на src, а коэффициент сохраняется в AX , а остаток в DX.

+0

спасибо .. это решено – manoj

1

функция DOS AH=02h ожидает код символа в DL регистре.
Ваша операция деления word(AX)/byte(10) -> quot(AL)+res(AH) и не изменяется DL.

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