|
发表于 2020-3-10 10:07:01
|
显示全部楼层
;dtoc代码段
; 功能:将双字(32位)数字转换成对应的字符串存放到制定的内存地址
; 输入参数:ax------数据的低16位
; dx------数据的高16位
; ds------存储字符串的数据段地址
; si------存储字符串第一个字符的偏移地址
dtoc: push si ;
push ax
push bx
push cx
push dx ;寄存器压栈,保护上下文数据
mov bx, 0 ; bx记录字符串长度
s1: mov cx, 10d
call divdw ;ax/10, ax:商的低16位,dx:商的高16位 cx: 余数
add cx, 30h ;计算余数ASCII码
push cx ;将余数ASCII码压栈
inc bx ;数据位数加1
mov cx, ax ;判断商的低16位是否为0
jcxz s2 ;如果商低16位为0,跳转,判断商的高16位是否为0
jmp short s1
s2: mov cx, dx ;判断商的高16位是否为0
jcxz s3 ;如果商高16位也为0,跳转,存放最后一位余数
jmp short s1
s3: mov cx, bx ;将字符串长度作为循环次数赋给CX
s4: pop ax ;从栈顶弹出
mov ds:[si],al ;取字符ASCII码所在的低字节,放到数据段偏移地址si处
inc si ;si指向下一个字节
loop s4 ;循环,取出下一个字符,知道取出所有字符,cx=0
mov al, 0 ;在字符串末尾加上0,表示字符串结束
mov ds:[si], al
okdtoc:pop dx ;恢复上下文寄存器
pop cx
pop bx
pop ax
pop si
ret
想问下这一段的S4这个为啥pop的是ax,ascll码不是保存在cx吗,不是应该pop cx吗 |
|