汇编语言学习笔记
五、汇编语言程序设计
顺序
分支
标号
循环
- 初始化:设置循环的初始状态
- 循环体:循环的工作部分及修改部分
- 控制条件:
- 已知次数(loop)
- 次数及特征值(loopz,loopnz)
- 不知道次数,其它条件
JS opr ; 结果为负转移,SF=1
JNS opr ; 结果为正转移,SF=0
JE/JZ opr ; 相等或为零转移,ZF=1
JNE/JNZ opr ; 不相等或不为零转移,ZF=0
子程序
子程序的设计方法
过程定义伪操作
procedure name PROC Attribute
...
procedure name ENDP
其中 Attribute 是可以是 NEAR 或 FAR。
如调用程序和过程在同一个代码段中,则使用 NEAR 属性;反之则要使用 FAR 属性。
如果定义的过程是 NEAR 属性的,那么对它的调用和返回也一定是 NEAR 属性的;反之则都是 FAR 属性的。
子程序的调用和返回
由 CALL
和 RET
指令完成子程序的调用和返回。特别要注意的是在子程序中使用堆栈时,应保证进栈和出栈的数据个数要相等,否则会造成程序无法正确返回。
call [near ptr] subp ; 段内调用
call far ptr subp ; 段间调用
保存与恢复寄存器
主程序和子程序都使用 CPU 中的寄存器。需要在子程序的开始将子程序要使用的寄存器的内容压入堆栈,在退出子程序前把这些寄存器的内容恢复原状。
(有些运算有隐含的寄存器,指令涉及的寄存器都要注意保存)用来传递参数的寄存器的内容则不需要保护。
子程序的参数传递
通过寄存器传送参数
主程序与子程序间传递的参数都在约定的寄存器中—传递单元在 CPU 内部。
在调用子程序前主程序将入口参数送约定寄存器中,子程序直接从这些寄存器中取得参数进行计算处理,经加工处理后得到的结果(出口参数)也放在约定寄存器中 ,返回主程序后,主程序直接到该寄存器中取得结果。该法简单﹑直观,信息传递快,但寄存器个数有限,所以适用于参数较少的情况
直接访问模块中的变量
如过程和调用程序在同一源文件(同一程序模块)中,则过程可直接访问模块中的变量。
通过堆栈传送参数或参数地址
入口和出口参数都放在堆栈中—传递单元在 SS 段。
调用前,入口参数由主程序送入堆栈,子程序从堆栈中取得这些参数进行处理,处理后的结果又送到堆栈中.返回主程序后,主程序从堆栈取得结果。此法不占用公共寄存器,也无需另外开辟单元,但因为子程序的返回地址也在堆栈中,所以一定要小心计算参数与地址,否则出错。
通过地址表传送参数地址
子程序的嵌套和举例
一个子程序作为调用程序去调用另外一个子程序,这种情况称为子程序的嵌套。
在子程序嵌套的情况下,如果一个子程序调用的子程序是其自身,称为递归调用。这样的子程序称为递归子程序。
高级汇编语言技术
宏汇编
定义后的宏指令就可以在源程序中调用,称为宏调用。宏调用的格式为
macro name [actual parameter list]
其中 actual parameter list 称为实元表。
当源程序被汇编时,汇编程序将对每个宏调用做宏展开。宏展开就是用宏定义体取代源程序中的宏指令名,而且用实元取代宏定义中的哑元
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于