一个简单的加法,但考虑了很久都没想明白怎么才能输出结果.求指教.
data segment
num1 db 39
num2 db 17
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov al,[num1]
mov bl,[num2]
add al,bl
daa
;这里该怎么写代码才能正确输出得到的56呢?
mov ah,4ch
int 21h
code ends
end start
------解决方案--------------------
除10取模,倒序输出。
------解决方案--------------------
你想要这个输出结果干什么?显示就必须转换成BCD,自己做个小函数也行,就是十六进制变换,如果你想得到0x56H,用楼上的方法就行或者自己弄个小函数实现!
------解决方案--------------------
- Assembly code
;--------------------------------- ; 过程名:disp_number ; 功能:将bx中的无符号整数转换成十进制串并送屏幕输出 ; 输入参数:bx = 要转换并输出的数据(无符号整数) ; 返回:无 ;--------------------------------- disp_number proc near ;obuf是存放转换后的串的 ;首先将这个串的最后一个字节送入串结束符'$' mov si, offset sAscii+5 ;让si指向最后一个字节 mov byte ptr [si] ,'$' ;obuf的最后一位放'$' dec si ;修正si,使其指向要输出的数字串的个位数位置 mov cx,10 ;设置cx等于除数10 mov ax,bx ;bx即为要输出的数,送ax,作为被除数 again: mov dx,0 ;无符号数扩展,它下面用来存放余数 div cx ;dx:ax := ax/cx(结果:dx=余数,ax=商) add dl,30h ;把余数转换为相应的ASCII码 mov [si],dl ;存进相应的位置(因为是碾转除,dl第一次得个位,第二次得十位...) dec si ;调整存放ASCII数据的指针(注意是减1,即由个位调整为十位...) cmp ax,0 ;是0吗(经过碾转除以后,商可都除尽吗?0表示商没有了) jnz again ;是就跳转进入下一循环(即商还有就再进入循环做除法) ;否则没有了,就准备输出转换后的串 inc si ;修正输出的串的首地址(上面si向左移了一位,可是没用到,所以再调回来) mov dx,si ;首地址送dx mov ah,9 int 21h ;显示器输出字符串 ret disp_number endp