王爽《汇编语言》 第10章 call和ret指令
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
源程序 Assume cs:code Stack segment db 8 dup (0) db 8 dup (0) Stack ends Code segment Start: mov ax,stack mov ss,ax mov sp,16 mov ax,1000 call s mov ax,4c00h int 21h S: add ax,ax ret Code ends End start
3、转移地址在寄存器中的call指令 、转移地址在寄存器中的 指令 格式: 位的寄存器) 格式: call reg(16位的寄存器) 位的寄存器 功能: 将当前IP压栈 用寄存器中的值修改IP 压栈, 功能: 将当前 压栈,用寄存器中的值修改
实现近转移。 实现近转移。 例10-4 下面的程序执行后,AX中的数值为多少? 下面的程序执行后, 中的数值为多少? 中的数值为多少
jmp 指令 标号 二、call指令
执行call指令的功能相当于: 指令的功能相当于: 执行 jmp far ptr 标号 指令的功能相当于 1、push ip或push cs、push ip; 、 jmp 或 、 ; reg 2、修改当前 或ip和cs指向目的地址。 指向目的地址。 、修改当前ip或 dword) ptr [内存 jmp word( 和 指向目的地址 内存] ( ) 内存 Call指令的主要格式: 指令的主要格式: 指令的主要格式
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 I
P 00
下面的程序执行后, 中的数值为多少? 例10-5 下面的程序执行后,ax 和 bx 中的数值为多少?
ss:0
00 19 00 00 00 C S 00 00 00 00 00 00 00 00 00 18 00 00 00 C 00 00 S
S:POP AX :
2、转移的目的地址在指令中的call指令 、转移的目的地址在指令中的 指令 格式: 格式: call far ptr 标号 功能: 将当前CS、 压栈 压栈, 功能: 将当前 、IP压栈,用标号所在地址修
实现远转移。 改CS和IP实现远转移。 和 实现远转移 下面的程序执行后, 中的数值为多少 中的数值为多少? 例10-3 下面的程序执行后,AX中的数值为多少?
•根据位移转移 •转移的目的地址在指令中 转移的目的地址在指令中 •转移地址在寄存器中 转移地址在寄存器中 •转移地址在内存中 转移地址在内存中
1、依据位移进行转移的call指令 、依据位移进行转移的 指令 格式: 格式: call 标号 功能:将当前IP压栈 压栈, 功能:将当前 压栈,IP=IP+16位的位移 位的位移 转移到标号处执行。 量,转移到标号处执行。
例10-2 下面的程序执行后,AX中的数值为多少? 下面的程序执行后, 中的数值为多少 中的数值为多少?
内存地址 1000:0 : 1000:3 : 1000:6 : 1000:7 : 机器码 B8 00 00 E8 01 00 40 58 汇编指令 MOV AX,0 , CALL S INC AX
二、call指令 指令
执行call指令的功能相当于: 指令的功能相当于: 执行 指令的功能相当于 1、push ip或push cs、push ip; 、 或 、 ; 2、修改当前 或ip和cs指向目的地址。 指向目的地址。 、修改当前ip或 和 指向目的地址 Call指令的主要格式: 指令的主要格式: 指令的主要格式
补全程序, 处开始执行指令。 例10-1.补全程序,实现从内存 补全程序 实现从内存1000:0处开始执行指令。 : 处开始执行指令 assume cs:code 返回指令ret和retf 一、返回指令 segment 和 stack 格式: 格式:ret db实现近转移,相当于 ;实现近转移,相当于pop ip 16 dup(0) ends 格式:retf; 实现远转移,相当于pop ip ,pop cs 格式: stack实现远转移,相当于 ; code segment start: mov ax,stack mov ss,ax mov sp,16 mov ax, ret和retf指令执行时,将当前堆栈内 指令执行时, 和 指令执行时 push ax ip 或 ip和 , 容分别出栈给 mov ax, 和cs,以实现指令 push 的近或远转移。 的近或远转移。 ax retf code ends end start
内存中的情况(设程序从 处装入) 内存中的情况(设程序从1000:0处装入) : 处装入
1000:0000 1000:0008
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1001:0000 1001:0003 1001:0005 1001:0008 1001:000B 1001:000E 1001:0011 1001:0013 1001:0015
问题10-1 问题 下面程序返回前,BX中的值为多少? 下面程序返回前, 中的值为多少? 中的值为多少 assume cs:code code segment start: mov ax,1 mov cx,3 call s mov bx,ax mov ax,4c00h int 21h s: add ax,ax loop s ret code ends end start
第10章 call和ret指令 章 和 指令
• • • • • ret和 retf 指令 和 call指令 指令 ret和call指令配合完成子程序调用 和 指令配合完成子程序调用 mul乘法指令 乘法指令 模块化程序设计
assume cs:code assume cs:code stack segment stack 返回指令 segment 一、返回指令ret和retf 和 db 16 dup(0) db 16 dup(0) 格式: 格式 ends 实现近转移,相当于pop stack stack :ret ;实现近转移,相当于ends ip code segment 格式: 格式 segment 实现远转移,相当于pop ip ,pop cs ; code :retf; 实现远转移,相当于 mov ax,4c00h mov ax,4c00h int 21h int 21h start: mov ax,stack start: mov ax,stack mov ss,ax mov ss,ax mov sp,16 mov sp,16 mov ax,0 mov ax,0 push cs push ax push ax mov bx,0 mov bx,0 ret retf code ends code ends end start end start
内存地址 1000:0 : 1000:3 : 1000:8 : 1000:9 : 机器码 B8 00 00 9A 09 00 00 10 40 58 汇编指令 MOV AX,0 , CALL FAR PTR S INC AX S:POP AX : ADD AX,AX , POP BX ADD AX,BX ,
• 两个相乘的数位数相同,8位乘法(乘数和被乘数都为 位乘法( 两个相乘的数位数相同, 位乘法 乘数和被乘数都为8 Mov ax,100 位数); 位乘法(乘数和被乘数都为16位 );16位乘法 位数); 位乘法(乘数和被乘数都为 位。) Mov bx,10000 • 8位乘法中,一个乘数默认在 中,另一个由指令给出, 位乘法中, 位乘法中 一个乘数默认在AL中 另一个由指令给出, Mul bx 16位的结果默认保存在 中。 例:计算 位的结果默认保存在AX中 位的结果默认保存在 计算100×10 × • 16位乘法中,一个乘数默认在AX中,另一个由指令给出, 位乘法中,一个乘数默认在 中 另一个由指令给出, 位乘法中 Mov al,100 32位的结果中高位保存在 中,低位在 中。 位的结果中高位保存在DX中 低位在AX中 位的结果中高位保存在 Mov bl,10 Mul bl
assume cs:code :0001 4、转移地址在内存中的call指令 指令 stack 、转移地址在内存中的 segment :0002 dw 8 :0003 格式:dup(0) call 内存单元] 格式:ends word (dword) ptr [内存单元 内存单元 stack :0004 code 功能: 将当前 将当前IP或 、 压栈 压栈, 功能:segment 或IP、CS压栈,用内存单元中 :0005 start: 的字或双字修改 或IP和CS。 mov ax,data 的字或双字修改IP或 和 。 :0006 mov ss,ax :0007 mov sp,16 :0008 mov word ptr ss:[0] , offset s :0009 mov ss:[2] , cs call dword ptr ss:[0] :000A nop :000B s: mov ax,offset s :000C sp sub ax, ss:[0ch] :000D AX=0001h mov bx,cs :000E sp BX=0000h sub bx,ss:[0eh] :000F code ends :0010 sp end start
•根据位移转移 根据位移转移
Call 标号 Call reg(16位) 位 Call word(dword) ptr [内存 内存] 内存
•转移的目的地址在指令中 Call far ptr 标号 转移的目的地址在指令中 •转移地址在寄存器中 转移地址在寄存器中 •转移地址在内存中 转移地址在内存中
配合使用( 三、call和ret配合使用(实现子程序调用) 和 配合使用 实现子程序调用)
B8 00 8E D0 BC 10 B8 E8 E8 05 B8 00 CD 21 03 C0 C3
序: 和 实现子程序 实现子程序: 使用 • 子程序的格式框架: 子程序的格式框架:
标号: 标号: 指令
assume cs:code code segment start: call s1 mov ax,4c00h int 21h call s2 ret s2: ret Code ends End start
s1: • 具有子程序的源程序的框架: 具有子程序的源程序的框架:
ret
四、乘法指令mul 乘法指令 格式: 格式:mul reg mul [内存单元 内存单元] 内存单元 功能:字节( 位 或字( 位 的无符号相乘。 功能:字节(8位)或字(16位)的无符号相乘。 计算100× 说明: 说明: 例:计算 ×10000
内存地址 1000:0 : 1000:2 : 1000:5 : 1000:6 : 机器码 B8 06 00 FF D0 40 汇编指令 MOV AX,6 , CALL AX INC AX MOV BP,SP , ADD AX,[BP] ,
下面的程序执行后, 中的数值为多少 中的数值为多少? 例10-5 下面的程序执行后,AX中的数值为多少? ss(ds):0 :0001 Assume转移地址在内存中的 cs:code 4、转移地址在内存中的call指令 、 指令 :0002 Stack segment :0003 格式: call 内存单元] 格式:dup(0) word (dword) ptr [内存单元 内存单元 dw 8 :0004 Stack ends 功能: 将当前IP或 、 压栈 压栈, 功能: 将当前 或IP、CS压栈,用内存单元中 :0005 Code segment 的字或双字修改IP或 和 。 的字或双字修改 或IP和CS。 :0006 Start: mov ax,stack mov sp :0007 mov ss,ax , 10h :0008 mov sp,16 , 0123h mov ax :0009 mov ds,ax :000A mov ax,0ds:[0] , ax mov :000B call word ptr ds:[0eh] :000C inc mov word ptr ds:[2] , 0 ax :000D inc ax call dword ptr ds:[0] :000E sp inc ax :000F Code ends 执行后IP=? CS=? 执行后 ? ? :0010 sp End start