assume cs:code
data segment
;保存转换后的ASCII
db 10 dup(0)
data ends
code segment
start:
mov ax,12666
mov bx,data
mov ds,bx
mov si,0
call dtoc
mov dh,8
mov dl,3
mov cl,2
call show_str
mov ax,4c00h
int 21h
dtoc:
push ax
push di
push cx
push dx
push si
mov di,0 ;记录入栈多少次,就是有多少位数
s1:
mov cx,10d ;除10
mov dx,0
div cx
mov cx,ax ;如果商为0,那么求值完成
jcxz s2
add dx,30h
push dx ;把求得的ACSII入栈
inc di
jmp short s1
s2:
add dx,30h ;最后一次也要记录
push dx
inc di
mov cx,di
s3:
pop ax
mov [si],al ;ACSII码只占用了低8位
inc si
loop s3
pop si
pop dx
pop cx
pop di
pop ax
ret
show_str:
push cx ;保存用到的寄存器
push si
push es
push di
push bx
mov ax,0b800h
mov es,ax
mov al,0a0h ;一行的总列数160字节
dec dh ;行号减1,因为是从0开始的
mul dh ;计算行开始偏移地址
mov bx,ax
mov al,2
mul dl ;计算列
sub ax,2 ;列也是从0开始,而且一个字符占两个字节
add bx,ax ;求出开始位置
mov di,0
mov al,cl
mov ch,0 ;高8位为0
s:
mov cl,ds:[si] ;判断是否到了字符结束
jcxz ok
mov es:[bx+di],cl
mov es:[bx+di+1],al
inc si
add di,2
jmp short s
ok:
pop bx
pop di
pop es
pop si
pop cx
ret
code ends
end start
王爽《汇编语言》实验10:编写子程序dtoc 解答
最新推荐文章于 2024-07-08 17:33:51 发布