汇编输出数字

16位汇编80X86BX里有一个数,怎么以十进制显示在屏幕上?
2024-12-13 15:44:54
推荐回答(2个)
回答1:

你先把BX内容传送到AX,然后再调用下列过程即可。
;------------------------------
PRINTAX PROC ;以10进制输出AX中的无符号整数.
MOV BX, 10 ;按10进制输出.
OR AX, AX
JZ _0_
LOOP_P:
XOR DX, DX
DIV BX
MOV CX, AX ;商.
OR CX, DX
JZ _E_ ;若商与余数都为0则结束递归.
PUSH DX ;保存DX中的余数.
CALL LOOP_P ;递归.
POP DX ;恢复余数.
ADD DL, '0' ;变成ASCII码.
JMP _1_
_0_: MOV DL, '0' ;是0则直接输出.
_1_: MOV AH, 2
INT 21H
_E_: RET
PRINTAX ENDP
;------------------------------

回答2:

;刚写好的,帮你加了点注释,可以运行,已经测试过了,有什么问题可以留言给我,希望对你好有帮助!^_^~~

assume cs:code,ds:data,ss:stack

data segment
x dw 1234
y dw 100 dup(?) ;存放数字的ASCII码
data ends

stack segment
dw 16 dup(?)
stack ends

code segment
start:
mov ax,data
mov ds,ax
mov dx,ds:[2] ;把数的高16位放到dx中
mov ax,ds:[0] ;把数的低16位放到ax中
mov si,0

s: mov cx,10
call divdw ;调用divdw程序
push dx
add cl,30h ;把数字转换为ASCII码,这样就能显示了
mov ds:[si+4],cl ;把ASCII码放到内存中
pop dx
push ax
push dx
add ax,dx
jz goOut
pop dx
pop ax
inc si
jmp s

goOut:
mov dl,ds:[si+4]
mov ah,2
int 21h
cmp si,0
jz ok
dec si
jmp goOut

ok: mov ax,4c00h
int 21h

;参数: (ax)=dword型低16位数据
; (dx)=dword型高16位数据
; (cx)=除数
;返回: (dx)=结果的高16位,(ax)=结果的低16位
; (cx)=余数
;32位除16位,可以防止溢出!

divdw: ;子程序定义开始,功能是分离各个数字出来
push ax
mov ax,dx
mov dx,0
div cx
mov bx,ax
pop ax
div cx
mov cx,dx
mov dx,bx
ret ;子程序定义结束

code ends
end start