简介 :
需要将一个在内存中的二进制数转换成十进制的 ASCII 码显示出来
: 备注
由于该题目难度较大 , 因此分解成几部分来完成
本节课先来实现将 数据段 中的数据转换成 ascii 码
然后将结果保存在另一段内存中
下节课只需要来实现将内存中的 ascii 码显示出来即可
代码实现 :
assume cs:code,ds:datasrc,ss:stack
; 保存源数据
datasrc segment
dw 1234, 5678, 65535, 0
datasrc ends
; 保存源数据的 ascii 码
datadst segment
db 128 dup(0)
datadst ends
stack segment
db 128 dup(0)
stack ends
code segment
start:
; 初始化数据段寄存器
mov ax, datasrc
mov ds, ax
; 初始化目标数据段寄存器
mov ax, datadst
mov es, ax
; 初始化原 , 目标寄存器
mov si, 0
mov di, 0
; 初始化段寄存器
mov ax, stack
mov ss, ax
mov sp, 128
; 调用函数
call get_ascii
jmp finish
;===============================================================================
; 功能 : 读取源数据段中的所有数据 , 然后将其转换成 ASCII 码后 , 移动到 datadst 段中
get_ascii:
; 遍历所有 dw 数据( 2 字节)
mov cx, 4
each_number:
push cx
; 设置被除数
mov dx, 0 ; 高 16 位
mov ax, ds:[si] ; 从源中读取数据 , 低 16 位
; 设置除数
mov bx, 10
each_bit:
; 计算余数
div bx
; 结果 ax 为商 , dx 为余数 (由于除数是 10 , 因此余数必然小于 10 , 因此 dl 中即为余数)
; 现在将结果加上 30H (变成 ASCII 码) 移动到 目标数据段寄存器:[偏移地址] 中
add dl, 30H
mov es:[di], dl
inc di
; 判断商是不是 0 , 如果是 , 则说明这个数字已经转换完毕
mov cx, ax
jcxz next_number
; 继续进行除法运算 , 直到 商 为 0
mov dx, 0
jmp each_bit
next_number:
; 移动源偏移地址到下一个数字
add si, 2
; 在目标偏移地址的字符串中加一个 tab 键
mov byte ptr es:[di], 9 ; tab 的 ascii 码是 9
inc di
pop cx
loop each_number
ret
finish:
mov ax, 4C00H
int 21H
code ends
end start