汇编语言参数传递(课堂PPT)
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(3) (bx)
(bx)x10+(ax);
(4) 重复(2)、(3)步,直到各位十进制数都转换为 止,结果放bx中。
11
程序结构:
开始 调用DECIBIN
调用CRLF 调用BINIHEX
调用CRLF 结束
12
主程序:
decihex segment
main proc far
assume cs:decihex
通常主程序和过程的设计是分开的,因而他们所使用的寄 存器往往会发生冲突。为解决这一冲突,一般地,应该在子
程序入口处将子程序中用到的寄存器内容压入堆栈保存,而 在返回到调用程序之前再恢复这些寄存器。如:
SUB1 PROC NEAR
PUSH AX
;进入后,压栈保护现场
PUSH BX ┋ POP BX
;处理部分 ;反序弹出,恢复现场
1、通过寄存器传送参数
最常用,但参数多时不宜使用。 (1)主、子程序之间通过寄存器传递参数 (2) 子程序之间通过寄存器传递参数
8
例6.1:从键盘输入一个十进制数并将其以十六进制形式 在屏幕上显示出来。
十进制
二进制数
十六进制数
decibin子程序 binihex子程序
功能:从键盘取得十进制数
转换,结果放BX 入口参数:键盘取得的十进
; put 10d dec in cx ; number times 10d ; (bx)*10 to (bx)
; add digit to number ; get next digit
14
; PROCEDURE TO CONVERT BINARY IN BX TO HEX ON CONSOLE SCREEN
例:从键盘输入数12345的计算步骤为:
步骤
成绩
5X1
=
5
4X10 =
40
3X100 =
300
2X1000 = 2000
1X10000 = 10000
求和 = 12345
10
键盘输入的十进制数 算法步骤:
二进制数的转换
(1) (bx)=0;
(2) 十进制数中的高位ASCII码转换为二进制数, 并放于ax中;
POP AX
RET
SUB1 ENDP
但是,如果是用来向主程序回送结果的寄存器,则不应该
保存其内容,否则会因为保存和恢复寄存器而破坏了应该向
主程序传送的信息。
6
四、主、子程序间的参数传递方法
原始数据、地址
主程序
子程序
处理结果
子程序
主程序
参数传递
入口参数:主程序调用子程序时,必须先将子程序所需要的 初始数据设置好,这些初始数据称为过程的入口参数。
第6章 子程序设计
1
子程序又称为过程,是完成特定功能的程序段。本身 不能被单独执行,必须通过调用的程序来执行才有意 义。子程序结构是模块化程序设计的基础。
一、过程定义伪指令
格式:
过程名 PROC ATTRIBUTE
┇
RET
[ NEAR / FAR ]
过程名 ENDP
过程入口的 符号地址
2
用户对过程属性的确定原则: (1)若调用程序和过程在同一个代码段中,则使用 NEAR属性; (2)若调用程序和过程不在同一个代码段中,则使用FAR属性。
pop ax
add bx, ax
jmp newchar
exit:
ret
decibin endp
;get digit from keyboard, and convert to
binary ,result is left in BX
;clear BX for number
; ASCII to binary ; jump if <0 ; is it >9 ? ; yes, not dec digit ; byte in AL to word in AX ; save ax
制数放AL 出口参数: 转换结果放入BX
把BX中的二进制数转换成十六进制数 并显示 要转换的二进制数在BX中
转换结果放入AL(以备显示)
BX在子程序之间传递参数
9
键盘输入的十进制数
二进制数的转换算ห้องสมุดไป่ตู้
法:从最高位起,每个数位先将ASCII字符转换为数字,
然后乘以该位的权,累加后就成为所要求的二进制数。
二、子程序的调用和返回
为方便用户的工作,80x86的汇编程序用PROC伪操作的类型 属性来确定CALL和RET指令的属性,即CALL和RET的属性由汇 编程序确定,用户只需正确选择PROC的属性就可以了。
子程序的调用采用指令CALL,其格式为: CALL 过程名
⑴ 段内调用
3
… ……
CSEG SEGMENT MAIN PROC FAR
ret
;在补充教材中补上
main endp
13
decibin proc near
mov bx, 0
newchar: mov ah, 1
int 21h
sub al, 30h
jl exit
cmp al, 9
jg exit
cbw
push ax
mov ax,bx
mov cx, 10
mul cx
mov bx,ax
出口参数:子程序执行完毕返回主程序时也必须将子程序运 行所得的结果送给主程序,这些回送的结果称为过程的出口 参数。
参数传递:过程入口参数的送入和出口参数的送出称为主程 序和过程间的参数传递,也称过程通信。过程通信通常有四 种方法:
7
1、通过寄存器传递参数 2、通过变量传递参数 3、通过地址表传递参数 4、通过堆栈传递参数
⑵ 段间调用
SEGX SEGMENT
SUBT PROC FAR
……
CALL SUBT
RET SUBT ENDP
RET MAIN ENDP SUBT PROC NEAR
RET SUBT ENDP CSEG ENDS
…
CALL SUBT SEGX ENDS SEGY SEGMENT
;第一次调用
……
CALL SUBT ;第二次调用
SEGY ENDS CALL far ptr SUBT(8086) 4
(3) 子程序的返回 由RET指令实现过程的返回功能,由于CALL时,已
使返回地址如栈,所以RET时应使返回地址出栈。因此, 在执行RET前,SP应指向进入子程序时的返回地址,这 样,才能使返回地址出栈,正确返回到主程序。
5
三、保存与恢复寄存器(现场保护与恢复)
start: push ds
sub ax,ax
push ax
call decibin ; keyboard to binary
call crlf
; print cr and lf
call binihex ; binary to screen
call crlf
; print cr and lf
jmp start