目录
设计
定义:在编写汇编程序时,遵循某些程序设计理念能够提高效率,避免问题
模块化程序设计
定义:类比高级语言,将利用call与ret机制将功能不同的代码段整合成不同的子程序,降低耦合性提高聚合性
参数传递
定义:类比高级语言,当使用子程序、子函数时具有在母程序和子程序间传递某些参数的需求。参数传递有以下几种方案:用寄存器传递参数;用内存单元传递参数;用栈传递参数
示例1:用内存单元传递参数
PS:如上所示,可通过将内存空间的首地址存放在寄存器中,而后使用寄存器中的地址访问整段内存空间的方式一次性传递大量数据
示例2:用栈存储参数在子程序和母程序间传递
PS1:如上图1、2所示,可用栈来传递参数,如上图3所示,于子程序的mov bp,sp处栈内状态为所需传递参数在栈的最底下,因此需要令bp得到sp的值后分别+4和+6以取得传递的参数的值
PS2:如上图2的最后一行所示,在完成pop bp后,栈顶为ip,而ip之后还有a与b两个参数,为了从栈中清楚已不需要的a和b,使用ret 4来清除
PS3:在多次使用call进行嵌套调用子函数的情况下,栈段将被大量压栈的程序段地址占据,因此十分不建议在此种情况下利用栈段进行参数传递,其可能破坏子程序段调用的结构。
示例3:用寄存器存储参数在子程序和母程序间传递
PS1:如上图所示,可以用任意通用寄存器在子程序和母程序间传递参数,但有些寄存器在传递参数之外还有其他用途,如上图1的cx还需用于控制loop循环,因此在使用之前先用push cx将之原值保存入栈,在使用完成后再用pop cx出栈,就能在使用其传递参数的同时不影响原功能
PS2:如上图所示,可在字符数据的结尾加上一个0,如同C语言中字符串结尾为\0一般。使用jcxz识别到零,则代表一个字符串的结束
子程序框架
定义:同高级编程语言不同,汇编中的语句大多需要寄存器的参与,但寄存器是有限资源,当在母程序中调用子程序时,若子程序中的代码使用到了一些母程序中已赋值但还未使用完毕的寄存器,则会导致程序错误。因此需要一种能够避免此类冲突的标准化框架
示例1:子程序标准框架
PS:如上所示,当子程序的编写遵循该框架时,类似寄存器冲突的问题便不会出现。但因此框架下入栈和出栈操作是必须的,因此在程序开头定义足够大的栈段也是必须的
示例2:使用了框架的程序
PS:如上所示,在子程序中调用了cs和si两个寄存器,但只要遵循框架,在调用之前先入栈,在完成调用之后出栈,寄存器的使用便不会造成冲突
直接定址表
定义:在程序中建立一个保存数据对应关系或地址对应关系的表格,当程序中需要调用某些数据或某些地址时,通过检索表格给出答案。此种编程方式可提高程序运行效率并使程序易于扩充
示例1:建立数值-字符对照表实现显示字符
PS1:如上图1,第3行所示,建立一张存储十六进制各字符的表格,以table为起始地址时,偏移地址为0指向的是字符0、偏移地址为1指向的是字符1,以此类推。
PS2:如上图1,第30至34行所示,将数值的高位与低位分离并分别存放,后如上图1第35至43行,从表中取出数值对应的字符替换。最终进行显示,如上图2
示例2:建立数值-代码段对照表实现通过数值调用对应代码段
PS:如上图所示,通过建立table并将地址标号存储其中,便可实现改变ah中的值以调用不同地址标号处的子程序(类