目的:将四位十六进制数203B存放于起始地址为3500H的内存单元中,把它们转换为ASCII码后存入起始地址是350AH的内存单元中。
设计思路:十六进制数0H~9H加上30H即可得到相应的ASCII码,AH~FH加上37H即可得到相应的ASCII码。
程序
sstack segment
dw 64 dup(?)
sstack ends
code segment
assume cs:code
start: mov cx,0004h ;四位十六进制数所以要转换4个字符
mov di,3500h ;十六进制数源起始地址
mov dx,[di]
a1: mov ax,dx
and ax,000fh ;取最低位的十六进制数
cmp al,0ah
jb a2 ;将该数与0AH比较,小于0AH转a2;大于OAH顺序执行
add al,07h
a2: add al,30h ;十六进制转为相应的ASCII码
mov [di+0dh],al;将数据送入目的地址区(最低位对应存放在目的地址最低位)
dec di
push cx ;将cx入栈,保护cx中数据
mov cl,04h ;设置移位位数为4位
shr dx,cl ;将十六进制数右移4位
pop cx ;cx出栈
loop a1 ;判断所有十六进制数是否已经都转换完成
;将输入的十六进制的数值显示在屏幕上
mov si,offset [350AH]
mov cx,0004H
a3: mov dl,byte ptr[si]
mov ah,02H
int 21H
inc si
loop a3
mov ax,4c00h
int 21h
code ends
ends start
实验操作及结果:
(1)在3500H、3501H中存放四位十六进制数203B,即3500H单元存放3B,3501H单元存放20。
(2)最终的结果为地址350AH~350DH内容依次是32 30 33 42。
注意:dx为16位寄存器,在存储数据时,dl对应于存放3500地址单元中的数据,dh对应于存放3501地址单元中的数据。