汇编语言——子程序的参数.
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MOV DX,0 MOV BX,4
DIV BX CMP DX,0 JNZ lab1 MOV AX,[yeaபைடு நூலகம்] MOV BX,100 DIV BX CMP DX,0 ;除以4 ;不能整除4则不是闰年,转 ;取回年份值 ;除以100
JNZ lab2 MOV AX,[year] MOV BX,400 DIV BX
;除以4,为预防溢出,用双字除以字
;不能整除4则不是闰年,转 ;取回年份值 ;除以100 ;不能整除100则是闰年,转
;除以400
lab1:CLC JMP lab3 lab2:STC lab3:POP DX POP CX POP BX RET jud ENDP
;把CF清0表示非闰年,设置出口参数 ;把CF置1表示是闰年,设置出口参数
约定参数存放地。如果约定用通用寄存器放参数,有可
能会出现寄存器不够使用的情况。而约定用变量存放参 数又要求在子程序和调用程序之外再写出变量定义,灵
活性较差。用堆栈传递参数就可以克服这些缺点。对于
调用者来说,传递给子程序的数据可以按字型(如果不 是字型,先要转换成字型)用PUSH指令压入堆栈中;对
于子程序来说,如何准确地取到栈中数据就是关键性问
_max PROC NEAR
PUSH BP MOV BP,SP MOV AX,WORD PTR [BP+6] ;取第1个参数到AX CMP AX,WORD PTR [BP+4] ;与第2个参数比较 JGE lab MOV AX,WORD PTR [BP+4] ;取第2个参数到AX ;暂时保存寄存器BP的值
6.3.3 带参数的子程序
【例6.5】编写一个子程序,对一个无符号的字型数组的
各元素求和。在调用子程序之前,已把数组的段地址放在
DS中,起始偏移地址放在寄存器SI中,数组元素个数(>0)放 在CX中。要求子程序把计算结果以双字的形式存放,高位
放在DX中,低位放在AX中。
【解】 sum PROC NEAR
对于DX中存放的年份值,需要先放到AX中,才能调用 子程序jud,然后以调用返回后的CF值决定是否把t数组中表 示2月份天数的[t+1]加1。程序段如下: MOV AX,DX CALL jud ADC BYTE PTR [t+1],0 ;原值+0+CF
4.用数据段中已定义的变量存放参数 用数据段中定义的变量作为参数传递的载体也是一种 常用方法。这种方法要求子程序与调用者之间约定好以哪 个变量或哪几个变量进行参数传递。具体做法是:对于用 作入口参数的变量,调用者在调用子程序的CALL指令之前, 先把变量赋以一定的值,然后以CALL指令转到子程序执行, 子程序则取出该变量中的数据进行处理;对用作出口参数
;不能整除100则是闰年,转
;除以400
DIV BX
CMP DX,0 JZ lab2
;除以400
lab2:INC BYTE PTR [day] ;是闰年,把天数加1,设置出 口参数 lab1 : POP DX POP CX POP BX
POP AX
RET Jud1: ENDP
5.用堆栈传递 参数传递不仅要在传递者之间约定数据的类型,还要
PUSH
XOR MOV
BX
AX,AX DX,AX
;保护用到的寄存器BX
;求和前先把存放结果的DX,AX清0
MOV s1: ADD ADC INC INC LOOP POP
BX,AX AX,[BX+SI] ;把一个元素加到AX中 DX,0 BX BX s1 BX ;恢复寄存器BX的值 ;BX加2,指向数组的下一元素 ;若有进位,DX加1
lab: POP BP
RET _max ENDP
;恢复寄存器BP的原值
1.通用寄存器传值
2.通用寄存器传地址
3.标志寄存器传递逻辑型数据 【例6.6】编写一个子程序,以放在 AX中的公元年份为 入口参数,判断该年是否为闰年。 另有一个应用程序,它已定义了一个字节型数组 t,依 次存放着12个月的每月天数,其中2月份的天数是 28。应用 程序已经在 DX中存放了年份值,利用前面编写的子程序, 编写程序段调整数组t中2月份的天数。
RET
sum ENDP
子程序说明应该包含如下4个部分:
(1)子程序的功能。用来指明该子程序完成什么样的 操作。 (2)入口参数。说明调用子程序前应该把什么样的数 据放在什么地方。
(3)出口参数。说明调用后从什么地方取得处理结果。
(4)破坏的寄存器。指出子程序中哪些寄存器没有被
保护。
6.3.4 参数传递的方法
题。下面的例6.8用一个实际例子说明在子程序中取得参 数值的具体方法。
【例 6.8 】用堆栈传递入口参数,编写子程序,把接收
的两个带符号整数中大的一个作为结果,出口参数放在AX 中。 【解】 ;功能:求两个带符号整数中大的一个 ;入口参数:调用前把两个带符号整数入栈 ;出口参数:AX
;破坏寄存器:无
的变量,也有赋值与取值两个阶段,子程序进行数据处理
后,把处理结果放到约定好的变量中,然后以RET指令返 回调用者,调用者可以从变量中取出处理结果使用。
【例6.7】用变量传递参数,编写例6.6要求的子程序。 【解】 ;功能:根据一个年份是否为闰年,设置该年2月份的天数 ;入口:DS段中的字型变量year = 公元年份 ;出口:DS段中的字节型变量day = 该年2月份天数 ;破坏寄存器:无 jud1 PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX MOV BYTE PTR [day],28 MOV AX,[year]
【解】子程序清单如下:
;功能:判断一个年份是否为闰年 ;入口:AX = 公元年份
;出口:CF,1表示是闰年,0表示非闰年
;破坏寄存器:AX jud PROC NEAR PUSH BX PUSH CX PUSH DX MOV CX,AX MOV DX,0 ;临时保存年份值
MOV BX,4
DIV BX CMP DX,0 JNZ lab1 MOV AX,CX MOV BX,100 DIV BX CMP DX,0 JNZ lab2 MOV AX,CX MOV BX,400 DIV BX CMP DX,0 JZ lab2