汇编语言课件第6章子程序结构课件.
合集下载
《IBM PC 80X86汇编语言程序设计》PPT电子课件教案-第六章 子程序设计
《IBM PC 80X86汇编语言程序设计》
冶金工业出版社
第6章
1、子程序的概念和特点
子程序:把在程序中多次出现,具有独立功能 的程序段写成程序模块,该模块可被多次调用, 称之为子程序。
特点:①可重复使用(调用) ②具有通用性(可通过入口参数实现) ③可浮动性(存放位置灵活) ④可递归性和可重入性
第6章
第六章 子程序设计
一、子程序的定义 二、子程序的结构形式
三、子程序的设计和调用 四、子程序的参数传递方法 五、子程序的嵌套和递归调用 六、子程序的设计举例 七、多模块程序设计 八、汇编语言和高级语言的混合编程
《IBM PC 80X86汇编语言程序设计》
冶金工业出版社
第6章
一、子程序的定义
1、子程序的概念和特点 2、子程序的定义 3、子程序的调用和返回
《IBM PC 80X86汇编语言程序设计》
冶金工业出版社
第6章
2、子程序的定义
子程序的定义是由过程定义伪指令PROC和ENDP 来完成的。其格式如下:
过程名 PROC [NEAR/FAR]
┆
过程名 ENDP
其中PROC表示过程定义开始,ENDP表示过程定 义结束。过程名是过程入口地址的符号表示。
一般过程名同标号一样,具有三种属性,即段 属性、偏移地址属性以及类型属性。
《IBM PC 80X86汇编语言程序设计》
冶金工业出版社
第6章
3、子程序的调用和返回
❖ 调用
①段内直接调用
格式:CALL 子程序名
功能:将子程序返回地址(断点)入栈
SP←SP-2
(SP)←IP,
并转到子程序入口地址去执行子程序。
❖ 返回指令
第6章子程序结构
Exit : ret Decibin endp
;每次乘的
;结果在BX中
8
计算机科学与技术系
《汇编语言》
Binihex proc near
mov ch, 4 Rotate: mov cl, 4
rol bx, cl mov dl, bl and dl, 0fh add dl, 30h cmp dl, 3ah jl print add dl, 7h
;
SEGY SEGMENT
…
CALL SUBT
…
2022/2/20
SEGY ENDS
5
计算机科学与技术系
《汇编语言》
6.1.3 保护现场和恢复现场
例如:若子程序PROG中改变了寄存器AX,BX,CX,DX的值,则 可采用如下方法保护和恢复现场.
PROG
PROC
PUSH AX
PUSH BX PUSH CX
NEXT: ADD AX , [SI] ADD SI , 2 LOOP NEXT MOV SUM , AX POP DI POP SI POP CX POP AX RET
PROADD ENDP
CODE ENDS 11 END START
计算机科学与技术系
《汇编语言》
3 通过地址表传递参数 PROADD PROC NEAR
Stack ends
Code segment
assume cs:code, ds:data, ss:stack
Main proc far Begin: push ds
xor ax, ax push ax mov ax,data mov ds, ax lea bx, string push bx push num
;每次乘的
;结果在BX中
8
计算机科学与技术系
《汇编语言》
Binihex proc near
mov ch, 4 Rotate: mov cl, 4
rol bx, cl mov dl, bl and dl, 0fh add dl, 30h cmp dl, 3ah jl print add dl, 7h
;
SEGY SEGMENT
…
CALL SUBT
…
2022/2/20
SEGY ENDS
5
计算机科学与技术系
《汇编语言》
6.1.3 保护现场和恢复现场
例如:若子程序PROG中改变了寄存器AX,BX,CX,DX的值,则 可采用如下方法保护和恢复现场.
PROG
PROC
PUSH AX
PUSH BX PUSH CX
NEXT: ADD AX , [SI] ADD SI , 2 LOOP NEXT MOV SUM , AX POP DI POP SI POP CX POP AX RET
PROADD ENDP
CODE ENDS 11 END START
计算机科学与技术系
《汇编语言》
3 通过地址表传递参数 PROADD PROC NEAR
Stack ends
Code segment
assume cs:code, ds:data, ss:stack
Main proc far Begin: push ds
xor ax, ax push ax mov ax,data mov ds, ax lea bx, string push bx push num
汇编语言程序设计第六章 子程序结构
20016H
20018H
SP
BX AX
IP CS
2001AH
…
DX CX BX AX ENDP
2001CH 2001EH
20020H
11
6.1.3 保存与恢复寄存器
先看一个例子(如图): SUBT PROC FAR PUSH AX PUSH BX PUSH CX PUSH DX
POP POP POP POP RET SUBT
DX CX
20016H
20018H 2001AH
BX AX
IP CS
…
DX CX BX AX ENDP
2001CH 2001EH
20020H
8
下一页
6.1.3 保存与恢复寄存器
先看一个例子(如图): SUBT PROC FAR PUSH AX PUSH BX PUSH CX PUSH DX
POP POP POP POP RET SUBT
18
newchar: mov int sub jl cmp jg cbw ;(digit is now in ;multiply number xchg mov mul xchg add jmp exit: ret DEC2BIN endp ah,1 21h al,30h exit al,9d exit ;keybroad input ;call DOS ; ASCⅡ to binary ;jump if<0 ;is it >9d? ;yes,not dec digit ;byte in AL to word in AX
stack_seg
tos stack_seg ; dw label
segment 100 dup(?) Word;教材P132 ends
王爽《汇编语言》-第6章-包含多个段的程序PPT优秀课件
第6章 包含多个段的程序
• 掌握在程序中同时使用数据段、堆 栈段和代码段。
• 理解内存中不同段的分配原理。
1
补全下面程序将内存0:300H—0:31FH处的
数据复制到0:200H处。
XX 00300H
XX 00301H
XX 00302H
XX 00303H
XX 00304H
XX 00305H
XX 00306H
0C 87
DW—字M型OV数据CX,8
09 CS:0F
SD:B—字AA节DDDD型数ABX据X,,2CS:[BX]
BB 00
DD—双LO字O数P据S
00
格式:MOV AX,4C00H INT 21H
B8 00
CDOWD(EDB) EN数D据S 1,数据2,数据3,…… 00
END
.
.
5
ASSUME CS:CODE
00200H 00201H 00202H 00203H 00204H 00205H 00206H
. . . 0021EH 0021FH
2
补全下面程序将“mov ax,4c00h”之前的指令
复制到内存0:200H处。
DS:0 PSP DS:FF
XX CS:0 XX XX XX XX XX XX
.. .. ..
Start:
mov ax, cs
mov ss,ax
mov sp, 26(1Ah)
mov ax,0
mov ds,ax
mov bx,0
mov cx,8
S:
push [bx]
pop cs:[bx]
add bx,2
loop s
mov ax,4c00h
• 掌握在程序中同时使用数据段、堆 栈段和代码段。
• 理解内存中不同段的分配原理。
1
补全下面程序将内存0:300H—0:31FH处的
数据复制到0:200H处。
XX 00300H
XX 00301H
XX 00302H
XX 00303H
XX 00304H
XX 00305H
XX 00306H
0C 87
DW—字M型OV数据CX,8
09 CS:0F
SD:B—字AA节DDDD型数ABX据X,,2CS:[BX]
BB 00
DD—双LO字O数P据S
00
格式:MOV AX,4C00H INT 21H
B8 00
CDOWD(EDB) EN数D据S 1,数据2,数据3,…… 00
END
.
.
5
ASSUME CS:CODE
00200H 00201H 00202H 00203H 00204H 00205H 00206H
. . . 0021EH 0021FH
2
补全下面程序将“mov ax,4c00h”之前的指令
复制到内存0:200H处。
DS:0 PSP DS:FF
XX CS:0 XX XX XX XX XX XX
.. .. ..
Start:
mov ax, cs
mov ss,ax
mov sp, 26(1Ah)
mov ax,0
mov ds,ax
mov bx,0
mov cx,8
S:
push [bx]
pop cs:[bx]
add bx,2
loop s
mov ax,4c00h
第6章 子程序结构
Lea dx,string地址 地址(IP) 地址 Num string地址 地址
2010-12-28 ch6
从键盘取得十进制 保存到BX BX中 数,保存到BX中 显示回车和换行 用十六进制形式 显示BX BX中的数 显示BX中的数
7
计算机科学与技术系
《汇编语言》 汇编语言》
Decihex
segment
assume cs:Decihex Main proc far Repeat: push ds xor ax, ax push ax call decibin call crlf call binihex call crlf ret Main endp
通过堆栈传递地址或参数
计算机科学与技术系
《汇编语言》 汇编语言》
Binhex proc near push bp mov bp,sp push ax push di push bx push cx pushf mov ax, [bp+4] mov di, [bp+6] mov ch, 4 mov cl, 4 roat: rol ax ,cl mov bl, al and bl, 0fh add bl, 30h cmp bl, 39h jle next add bl, 7h 2010-12-28
;每次乘的 每次乘的
;结果在 中 结果在BX中 结果在
8
计算机科学与技术系
《汇编语言》 汇编语言》
Binihex proc near mov ch, 4 Rotate: mov cl, 4 rol bx, cl mov dl, bl and dl, 0fh add dl, 30h cmp dl, 3ah jl print add dl, 7h Print: mov ah, 2 int 21h dec ch jnz rotate ret 2010-12-28 Binihex endp
《汇编语言》课件
编程实例三:排序算法的实现
总结词:算法思想
VS
详细描述:通过汇编语言实现排序算 法,理解算法思想在编程中的运用, 提高编程思维和解决问题的能力。
06 汇编语言与高级语言的联 系与区别
编语言与高级语言的联系
同源关系
汇编语言和高级语言都源于计算机的二进制语言,它们都是为了 方便人类操作计算机而产生的。
子程序的返回值
子程序可以有一个或多个返回值,通过寄存 器或内存单元返回给主程序。
05 汇编语言编程实践
编程实例一:求两个数的和
总结词:简单运算
详细描述:通过汇编语言实现求两个数的和的程序,了解汇编语言的输入、存储、运算和输出指令。
编程实例二:求一个数的阶乘
总结词:循环结构
详细描述:通过编写求阶乘的汇编程序,掌握循环结构的实现方法,理解循环在计算中的重要性。
JE、JNE、JG、JL等条件跳转指令
根据条件跳转到指定地址。格式:JE/JNE/JG/JL destination。
子程序调用指令
CALL指令
调用子程序,并将返回地址压入堆栈。格式 :CALL procedure_address。
RET指令
从子程序返回,并弹出堆栈中的返回地址。 格式:RET。
04 汇编语言程序结构
04
03 汇编语言指令系统
数据传送指令
MOV指令
用于将数据从一个位置移动到另一个位 置。格式:MOV destination, source。
VS
PUSH和POP指令
用于在堆栈上存储和检索数据。格式: PUSH source / POP destination。
算术运算指令
要点一
ADD和SUB指令
[计算机]汇编 第6章 子程序结构
第6章 子程序结构
• 过程定义伪操作 • 子程序的调用与返回 • 保存与恢复寄存器 • 子程序的参数传送 • 子程序的嵌套与递归
2021/8/26
1
1
1. 过程定义伪操作
过程名 PROC NEAR ( FAR )
. . .
过程名 ENDP (1)NEAR属性:调用程序和子程序在同一代码段中
(段内调用) (2)FAR属性:调用程序和子程序不在同一代码段中
5
4. 子程序的参数传送
(1) 通过寄存器传送参数 (2) 通过存储器传送参数 (3) 通过地址表传送参数地址 (4) 通过堆栈传送参数或参数地址 (5) 多个模块之间的参数传送
2021/8/26
6
6
5. 子程序的嵌套与递归调用
子程序的嵌套:
主程序
…… call proc_A ……
子程序A
proc_A …… call proc_B …… Call proc_A ret
ends
segy
call
segy
segment
…… far ptr subt ……
ends
3
3
2. 子程序的调用与返回
子程序调用:隐含使用堆栈保存返回地址
2021/8/26
call near ptr subp
(1) 保存返回地址 (2) 转子程序
call far ptr subp
(1) 保存返回地址 (2) 转子程序
子程序返回:ret
(SP)→ (IP)
(SP)→ (IP) (CS)
4
4
3. 保存与恢复寄存器
subt proc far push ax push bx push cx push dx …… …… pop dx pop cx pop bx pop ax
• 过程定义伪操作 • 子程序的调用与返回 • 保存与恢复寄存器 • 子程序的参数传送 • 子程序的嵌套与递归
2021/8/26
1
1
1. 过程定义伪操作
过程名 PROC NEAR ( FAR )
. . .
过程名 ENDP (1)NEAR属性:调用程序和子程序在同一代码段中
(段内调用) (2)FAR属性:调用程序和子程序不在同一代码段中
5
4. 子程序的参数传送
(1) 通过寄存器传送参数 (2) 通过存储器传送参数 (3) 通过地址表传送参数地址 (4) 通过堆栈传送参数或参数地址 (5) 多个模块之间的参数传送
2021/8/26
6
6
5. 子程序的嵌套与递归调用
子程序的嵌套:
主程序
…… call proc_A ……
子程序A
proc_A …… call proc_B …… Call proc_A ret
ends
segy
call
segy
segment
…… far ptr subt ……
ends
3
3
2. 子程序的调用与返回
子程序调用:隐含使用堆栈保存返回地址
2021/8/26
call near ptr subp
(1) 保存返回地址 (2) 转子程序
call far ptr subp
(1) 保存返回地址 (2) 转子程序
子程序返回:ret
(SP)→ (IP)
(SP)→ (IP) (CS)
4
4
3. 保存与恢复寄存器
subt proc far push ax push bx push cx push dx …… …… pop dx pop cx pop bx pop ax
汇编语言-子程序23页PPT
汇编语言-子程序
1、战鼓一响,法律无声。——英国 2、任何法律的根本;不,不成文法本 身就是 讲道理 ……法 律,也 ----即 明示道 理。— —爱·科 克
3、法律是最保险的头盔。——爱·科 克 4、一个国家如果纲纪不正,其国风一 定颓败 。—— 塞内加 5、法律不能使人人平等,但是在法律 面前人 人是平 等的。 ——波 洛克
61、奢侈是舒适的,否则就不是奢侈 。——CocoCha nel 62、少而好学,如日出之阳;壮而好学 ,如日 中之光 ;志而 好学, 如炳烛 之光。 ——刘 向 63、三军可夺帅也,匹夫不可夺志也。 ——孔 丘 64、人生就是学校。在那里,与其说好 的教师 是幸福 ,不如 说好的 教师是 不幸。 ——海 贝尔 65、接受挑战,就可以享受胜利的喜悦 。——杰纳
1、战鼓一响,法律无声。——英国 2、任何法律的根本;不,不成文法本 身就是 讲道理 ……法 律,也 ----即 明示道 理。— —爱·科 克
3、法律是最保险的头盔。——爱·科 克 4、一个国家如果纲纪不正,其国风一 定颓败 。—— 塞内加 5、法律不能使人人平等,但是在法律 面前人 人是平 等的。 ——波 洛克
61、奢侈是舒适的,否则就不是奢侈 。——CocoCha nel 62、少而好学,如日出之阳;壮而好学 ,如日 中之光 ;志而 好学, 如炳烛 之光。 ——刘 向 63、三军可夺帅也,匹夫不可夺志也。 ——孔 丘 64、人生就是学校。在那里,与其说好 的教师 是幸福 ,不如 说好的 教师是 不幸。 ——海 贝尔 65、接受挑战,就可以享受胜利的喜悦 。——杰纳
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
80x86汇编语言程序设计
(SP)
(IP) (cx) (bx) (ax)
(SP)
main sub
堆栈段
ห้องสมุดไป่ตู้
sub code
2017/10/22
6.1子程序概述 6.1.1 过程的定义
过程定义由PROC与ENDP伪指令实现,形式如下: 过程名 PROC [NEAR|FAR]
<过程体>
过程名 ENDP
第6章 子程序结构
讲授要点
子程序的定义、调用与返回。
子程序的参数传递方法。
2017/10/22
80x86汇编语言程序设计
子程序调用和返回指令:
code segment main proc far …… call subp …… ret main endp subp proc near ……
code1 segment main proc far …… call far ptr subp …… ret main endp code1 ends
( (SP)+1,(SP) ) ← (IP) (IP) ← (IP) + 16位位移量
段内间接近调用:CALL DST 执行操作: (SP) ← (SP) - 2
( (SP)+1,(SP) ) ← (IP) (IP) ← (EA)
2017/10/22
80x86汇编语言程序设计
段间直接远调用:CALL DST 执行操作: (SP) ← (SP) - 2
段间带立即数远返回:RET EXP
2017/10/22 80x86汇编语言程序设计
例:带立即数返回
code main segment proc far …… push ax push bx push cx call sub …… ret endp proc near …… ret 6 endp ends
通常要保证RET指令执行前,栈顶内容正好是返回地址。
注意保护相关寄存器的值。通常,除了作为返回参数的寄存器 外,过程不应改变其它寄存器的值。
可以将过程定义放在单独的代码段中。若过程定义与主程序处 于同一代码段,则要保证其只有被调用时,才会执行。
code2 segment subp proc far ……
ret
subp endp code ends
ret
subp endp code2 ends
段内调用和返回
2017/10/22 80x86汇编语言程序设计
段间调用和返回
CALL 调用指令
段内直接近调用:CALL DST 执行操作: (SP) ← (SP) - 2
1.过程调用和返回指令 (1)CALL:过程调用 与JMP指令类似,CALL指令包括下列4种调用方式: 段内直接调用(Intrasegment/Direct Call) 段间直接调用(Intersegment/Direct Call) 段内间接调用(Intrasegment/Indirect Call) 段间间接调用(Intersegment/Indirect Call) 段内调用在同一代码段内进行,又称近(Near)调用; 段间调用可以在不同代码段之间进行,又称远(Far)调用。
对标志位的影响:无。
2017/10/22
80x86汇编语言程序设计
(2)RET指令RET(Return):过程返回 语法格式: RET ; 近返回或远返回
RET imm16
imm16 ; 近返回或远返回,并调整堆栈: SP = SP +
功能描述: RET:返回地址出栈,从而实现转移到返回地址处。其中, 远返回:POP 1个双字到CS:IP。 近返回:POP 1个字到IP。 RET imm16:在返回地址出栈后,CPU立即将imm16加到堆栈 指针SP。这种机制用来在返回前将参数从栈中移出。 对标志位的影响:无。 说明: RET由汇编程序根据其所在过程的类型( NEAR或FAR) 决定是近返回还是远返回。缺省为近返回。
2017/10/22
80x86汇编语言程序设计
语法格式: CALL ProcName 段内直接调用:IP进栈,IP = label的偏移地址; 段间直接调用:CS:IP 进栈,CS:IP = label的分段地址
功能描述: (1)返回地址进栈。 远调用:CS与IP(下一条指令的地址)依次进栈。 近调用:IP(下一条指令的16位偏移地址)进栈。 (2)转移到过程的第1条指令去执行。 远调用:根据操作数,将32位地址送CS:IP。 近调用:根据操作数,将16位偏移地址送IP。
( (SP)+1,(SP) ) ← (CS) (SP) ← (SP) - 2 ( (SP)+1,(SP) ) ← (IP) (IP) ← 偏移地址 (CS) ← 段地址
段间间接远调用:CALL DST 执行操作: (SP) ← (SP) - 2
( (SP)+1,(SP) ) ← (CS) (SP) ← (SP) - 2 ( (SP)+1,(SP) ) ← (IP) (IP) ← (EA) (CS) ← (EA+2)
2017/10/22 80x86汇编语言程序设计
RET 返回指令
段内近返回:RET 执行操作: (IP) ← ( (SP)+1,(SP) )
(SP) ← (SP) + 2
段内带立即数近返回:RET EXP 段间远返回:RET 执行操作: (IP) ← ( (SP)+1,(SP) )
(SP) ← (SP) + 2 (CS) ← ( (SP)+1,(SP) ) (SP) ← (SP) + 2
1. 过程名在整个程序中必须是唯一的。 2. 过程名本质上与标号一样,也具有3种属性:段地址、 偏移地址和类型(NEAR或FAR)。 3. PROC 后用关键字 NEAR 、 FAR 或空,以表示过程 的类型(缺省为NEAR)。
2017/10/22 80x86汇编语言程序设计
6.1.2 过程调用和返回
2017/10/22 80x86汇编语言程序设计
2.使用过程应注意的问题 在过程体内必须有一条RET指令被执行到。如果在过程内没有执 行到RET或其它转移指令,程序将继续执行ENDP后的指令。
正确选择过程的类型。通常基于下列原则:
• 若过程只在同一代码段中被调用,则定义为NEAR。 • 若过程可以在不同代码段中被调用,则定义为FAR。
(SP)
(IP) (cx) (bx) (ax)
(SP)
main sub
堆栈段
ห้องสมุดไป่ตู้
sub code
2017/10/22
6.1子程序概述 6.1.1 过程的定义
过程定义由PROC与ENDP伪指令实现,形式如下: 过程名 PROC [NEAR|FAR]
<过程体>
过程名 ENDP
第6章 子程序结构
讲授要点
子程序的定义、调用与返回。
子程序的参数传递方法。
2017/10/22
80x86汇编语言程序设计
子程序调用和返回指令:
code segment main proc far …… call subp …… ret main endp subp proc near ……
code1 segment main proc far …… call far ptr subp …… ret main endp code1 ends
( (SP)+1,(SP) ) ← (IP) (IP) ← (IP) + 16位位移量
段内间接近调用:CALL DST 执行操作: (SP) ← (SP) - 2
( (SP)+1,(SP) ) ← (IP) (IP) ← (EA)
2017/10/22
80x86汇编语言程序设计
段间直接远调用:CALL DST 执行操作: (SP) ← (SP) - 2
段间带立即数远返回:RET EXP
2017/10/22 80x86汇编语言程序设计
例:带立即数返回
code main segment proc far …… push ax push bx push cx call sub …… ret endp proc near …… ret 6 endp ends
通常要保证RET指令执行前,栈顶内容正好是返回地址。
注意保护相关寄存器的值。通常,除了作为返回参数的寄存器 外,过程不应改变其它寄存器的值。
可以将过程定义放在单独的代码段中。若过程定义与主程序处 于同一代码段,则要保证其只有被调用时,才会执行。
code2 segment subp proc far ……
ret
subp endp code ends
ret
subp endp code2 ends
段内调用和返回
2017/10/22 80x86汇编语言程序设计
段间调用和返回
CALL 调用指令
段内直接近调用:CALL DST 执行操作: (SP) ← (SP) - 2
1.过程调用和返回指令 (1)CALL:过程调用 与JMP指令类似,CALL指令包括下列4种调用方式: 段内直接调用(Intrasegment/Direct Call) 段间直接调用(Intersegment/Direct Call) 段内间接调用(Intrasegment/Indirect Call) 段间间接调用(Intersegment/Indirect Call) 段内调用在同一代码段内进行,又称近(Near)调用; 段间调用可以在不同代码段之间进行,又称远(Far)调用。
对标志位的影响:无。
2017/10/22
80x86汇编语言程序设计
(2)RET指令RET(Return):过程返回 语法格式: RET ; 近返回或远返回
RET imm16
imm16 ; 近返回或远返回,并调整堆栈: SP = SP +
功能描述: RET:返回地址出栈,从而实现转移到返回地址处。其中, 远返回:POP 1个双字到CS:IP。 近返回:POP 1个字到IP。 RET imm16:在返回地址出栈后,CPU立即将imm16加到堆栈 指针SP。这种机制用来在返回前将参数从栈中移出。 对标志位的影响:无。 说明: RET由汇编程序根据其所在过程的类型( NEAR或FAR) 决定是近返回还是远返回。缺省为近返回。
2017/10/22
80x86汇编语言程序设计
语法格式: CALL ProcName 段内直接调用:IP进栈,IP = label的偏移地址; 段间直接调用:CS:IP 进栈,CS:IP = label的分段地址
功能描述: (1)返回地址进栈。 远调用:CS与IP(下一条指令的地址)依次进栈。 近调用:IP(下一条指令的16位偏移地址)进栈。 (2)转移到过程的第1条指令去执行。 远调用:根据操作数,将32位地址送CS:IP。 近调用:根据操作数,将16位偏移地址送IP。
( (SP)+1,(SP) ) ← (CS) (SP) ← (SP) - 2 ( (SP)+1,(SP) ) ← (IP) (IP) ← 偏移地址 (CS) ← 段地址
段间间接远调用:CALL DST 执行操作: (SP) ← (SP) - 2
( (SP)+1,(SP) ) ← (CS) (SP) ← (SP) - 2 ( (SP)+1,(SP) ) ← (IP) (IP) ← (EA) (CS) ← (EA+2)
2017/10/22 80x86汇编语言程序设计
RET 返回指令
段内近返回:RET 执行操作: (IP) ← ( (SP)+1,(SP) )
(SP) ← (SP) + 2
段内带立即数近返回:RET EXP 段间远返回:RET 执行操作: (IP) ← ( (SP)+1,(SP) )
(SP) ← (SP) + 2 (CS) ← ( (SP)+1,(SP) ) (SP) ← (SP) + 2
1. 过程名在整个程序中必须是唯一的。 2. 过程名本质上与标号一样,也具有3种属性:段地址、 偏移地址和类型(NEAR或FAR)。 3. PROC 后用关键字 NEAR 、 FAR 或空,以表示过程 的类型(缺省为NEAR)。
2017/10/22 80x86汇编语言程序设计
6.1.2 过程调用和返回
2017/10/22 80x86汇编语言程序设计
2.使用过程应注意的问题 在过程体内必须有一条RET指令被执行到。如果在过程内没有执 行到RET或其它转移指令,程序将继续执行ENDP后的指令。
正确选择过程的类型。通常基于下列原则:
• 若过程只在同一代码段中被调用,则定义为NEAR。 • 若过程可以在不同代码段中被调用,则定义为FAR。