汇编实现十六进制打印内存空间为0:0开始的十六个字节的内容
2019-06-28 本文已影响0人
wcry
以十六进制打印内存当中的数据具体思路是:
- 把内存中数据先取出;
- 将取出的数值,转换为字符;
- 判断是该字符表示的是数,还是字母;
- 进行相关处理,然后以字符形式打印。
具体代码如下:
code segment
start:
mov ax,0
mov ds,ax
mov bx,0
mov cx,16
s:
call tran
inc bx
loop s
mov ax,4c00h
int 21h
tran:
push cx
mov dl,[bx]
mov cl,4
shr dl,cl
and dl,0fh
call num_char
mov dl,[bx]
and dl,0fh
call num_char
pop cx
ret
num_char: ;判断
push ax
mov ah,2
add dl,'0'
cmp dl,'9'
jna print
add dl,7
print: ;打印
int 21h
pop ax
ret
code ends
end start
说明:当取出数据时,我们先要将十六进制数据转换为字符,可以add dl,'0'
或者是add dl,30h
,但是,无法表示A、B、C、D等,所以这个时候要进行判断,如果这个数字小于'9'即小于39h就说明这是一个数,如果大于就表示一个字母,对于字母要进行的处理就是add dl,7
。
知识点:
- 将一个数值转换为一个字符,只需要加上'0'
- 判断十六进制数,使用cmp即可
- jna表示不大于,即小于等于,jnb表示不小于,即大于等于
- 当是字母时,加上'0'得到它的ASII码,但并不是其本身,还需要加上7;如E表示14,加上'0'是3Eh,但是E的ASII码是45,加上7就是它真实的ASII码。