以十六进制打印内存空间为0:0开始的十六个字节的内容

248 阅读1分钟

以十六进制打印内存当中的数据具体思路是:

  1. 把内存中数据先取出;
  2. 将取出的数值,转换为字符;
  3. 判断是该字符表示的是数,还是字母;
  4. 进行相关处理,然后以字符形式打印。 具体代码如下:
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

知识点:

  1. 将一个数值转换为一个字符,只需要加上'0'
  2. 判断十六进制数,使用cmp即可
  3. jna表示不大于,即小于等于,jnb表示不小于,即大于等于
  4. 当是字母时,加上'0'得到它的ASII码,但并不是其本身,还需要加上7;如E表示14,加上'0'是3Eh,但是E的ASII码是45,加上7就是它真实的ASII码。