王爽《汇编语言》实验十10.3数值显示
程序员文章站
2024-02-02 15:42:04
...
assume cs:code
data1 segment
dw 123,12666,1,8,3,38
data1 ends
data segment
db 30 dup (0) ;该段存放转换后的字符串
data ends
code segment
start:mov ax,data1
mov es,ax
mov ax,data
mov ds,ax
mov si,0 ;寻址data段用
mov bx,0 ;寻址data1段用,现在指向第一个数123
mov cx,6 ;循环次数6,共6个word型数据
s:mov ax,es:[bx] ;将需要转换的数据暂存到ax中
push cx ;将循环次数CX暂存:入栈
call dtoc ;将ax中的数据转换为字符串,并存到data段中
pop cx ;将cx恢复
add bx,2 ;bx指向下一个数据
loop s ;(cx)=(cx)-1,循环把6个数据转换完成
mov byte ptr ds:[si+1],0 ;将最后一个字符串后放0,标志结束
mov dh,8
mov dl,3
mov cl,2
call showstr ;将字符串放到显存相关位置
mov ax,4c00h
int 21h
dtoc: push ax ;保护现场
push bx
push cx
push dx
mov bx,0 ;后面计数需要
dto: mov cx,ax
jcxz ok1 ;判断商是否为0,为0时结束转换,跳到ok1
mov dx,0
mov cx,10
div cx
add dx,30h ;dx中是余数,数字+30h转换为对应的ascll码
push dx ;将每一个数字的ascll码入栈
inc bx ;记录转换数字的位数
jmp short dto ;循环把一个数据全转换完成
ok1:mov cx,bx ;将循环次数赋给cx
s1:pop dx ;出栈一位数字的ascll码
mov ds:[si],dl ;将该位数字的8位的ascll码放入data段中
inc si ;si+1,准备传送下一个数字的ascll码
loop s1 ;将该数据的各个位的ascll码都传到data段中
mov al,20h
mov ds:[si],al ;在每个数据后面放一个空格的ascll码,以分开各个数据
inc si ;将si+1,否则下一个数据进入data段时,会把空格的ascll码覆盖
pop dx
pop cx
pop bx
pop ax
ret ;返回s,继续下一个数据的ascll码转换
showstr:push ax
push bx
push cx
push di
push si
push es
mov ax,data
mov ds,ax
mov si,0
mov ax,0b800h
mov es,ax
mov si,0
mov al,160
mul dh
mov bx,ax
mov dh,0
mov al,2
mul dl
add bx,ax
mov ah,cl
str:mov cl,ds:[si]
mov ch,0
jcxz ok2
mov ch,ah
mov es:[bx+di],cx
inc si
add di,2
jmp short str
ok2:pop es
pop si
pop di
pop cx
pop bx
pop ax
ret
code ends
end start