当前位置: 代码迷 >> 汇编语言 >> 请问一个加法输出有关问题
  详细解决方案

请问一个加法输出有关问题

热度:2489   发布时间:2013-02-26 00:00:00.0
请教一个加法输出问题
一个简单的加法,但考虑了很久都没想明白怎么才能输出结果.求指教.

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     ;显示器输出字符串    retdisp_number    endp
  相关解决方案