实验相关文件

exp7.zip

简化段定义

来看一个简化段定义:

.model small ; 储存模型

.stack ; 默认1024字节

.data ; 数据段
	msg db 'Good afternoon, good evening, and good night!$'

.code ; 代码段
	.startup ; 自动设置ds、ss、sp

	mov ah, 09h ; 打印字符串
	lea dx, msg
	int 21h

	.exit ; 自动生成退出指令
end

使用Windows下6.11版本的masm编译出1.exe,然后进入DOS下debug反汇编。

<aside> 🌈 如果忘记了如何使用6.11版本的masm编译,请参考实验一

</aside>

观察反汇编出的.code代码段,可以发现:

.startup被编译成了一些设置dssssp寄存器的指令。

Untitled

.exit被编译成了那个每次都得写的mov ah, 4ch中断退出。

Untitled

可见,汇编伪代码,大都就是一些简化写法,让编译器去生成那些啰里吧嗦的话。

<aside> 🌈 如果你用过C语言的宏,也许会发现它们有点像,都会在预编译阶段被编译器展开。

</aside>

子程序定义

一些常用的代码段,应该定义成子程序,避免反复书写,提高源码可读性。

打印字符

比如,在.code代码段定义一个打印字符的子程序:

print_char proc  ; 打印字符dl
	push ax ; 保护ax

	mov ah, 02h
	int 21h

	pop ax
	ret
print_char endp