assume cs:code,ds:data
data segment
src: dw 123,12666,1,8,3,38
dest: dw 6 dup (0)
data ends
code segment
start: mov ax,data
mov ds,ax
mov si,0
mov di,offset dest
mov cx,6
call dtoc
mov dh,12
mov dl,20
mov cl,10010100b
mov si,offset dest
call show_str
mov ax,4c00h
int 21
;将10进制数转换为其ascii码的表示
;@param cx 待处理数字的个数
;@param ds:[si] 指向待处理数据的首地址
;@param ds:[di] 指向目的地址的首地址
dtoc: mov bx,10 ;除数
mov ax,0
push ax ;标记,下面pop时,遇到0则停止
for_read:mov ax,ds:[si] ;最外层循环,根据cx值确定循环次数
for_get_assic:div bx ;次循环,获得10进制数的每一位的ascii码值
cmp ax,0 ;如商为0,则说明此数已处理完毕,继续处理下一个数
push dx
mov dx,0 ;保存第N位的值
je write
jmp for_get_assic
write: pop ax ;向目的地址写入10进步数的ascii码表示
cmp ax,0
je continue ;如果ax=0(以上设的标记),则说明此数处理完毕,继续处理下一个数
add al,30h ;10进制数与其ascii值的对应关系,如1的ascii为1+30h=31h
mov ds:[di],al ;向目的地址写入
inc di
jmp write
continue:mov ax,0
push ax
add si,2
loop for_read
pop ax ;ax=0
mov ds:[di],al
ret
show_str:push dx
push cx
push ax
push ds
push si ;保存寄存器内容
dec dh
mov al,0a0h
mul dh
mov bx,ax
dec dl
mov dh,0
mov ax,2
mul dx
add bx,ax ;计算字符串的第一个字符在显存中相对于0b800h的位移
mov dx,bx
mov ax,0b800h
mov es,ax
mov di,0
;循环显示字符串
s: mov al,byte ptr ds:[si]
mov ah,0
cmp ax,0
je return ;若字符为0则返回
mov ah,cl
mov bx,dx
add bx,di
mov es:[bx],ax
inc si
add di,2
jmp s
return: pop si
pop ds
pop ax
pop cx
pop dx
ret
code ends
end start
【汇编】将十进制数转换为对应的ascii码值
最新推荐文章于 2022-11-09 14:57:07 发布