汇编语言——子程序的参数.

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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
相关文档
最新文档