第九章 转移指令的原理
《控制转移类指令》课件

这个PPT课件将帮助你全面了Байду номын сангаас控制转移类指令,包括指令的作用、分类以及 使用方法。让我们一起探索控制转移类指令的奥秘吧!
什么是控制转移类指令?
控制转移类指令是计算机指令的一种,用于改变程序执行的顺序。通过这些 指令,我们可以实现条件跳转、无条件跳转和子程序的调用与返回。
CALL指令用于调用子程序,类似于函数的调用,在子程序执行完毕后会返回 到调用的位置。
无条件转移指令可以使用JUMP(跳转)指令来实现,将程序的控制转移到指定的地址。
有条件转移指令的使用方法
有条件转移指令可以根据不同的条件(如大于、小于、等于)来判断,并根 据条件的结果执行相应的跳转指令。
JUMP指令的用法
JUMP指令用于无条件跳转,可以直接将程序的执行控制转移到指定的地址。
CALL指令的用法
控制转移指令的作用
控制转移指令可以在程序运行时根据特定条件改变代码的执行路径,从而实 现程序的灵活控制和条件判断。
分类:无条件转移指令
无条件转移指令可以直接改变程序的执行顺序,不受任何条件限制。
有条件转移指令
有条件转移指令可以根据特定的条件判断结果,决定是否执行跳转。
无条件转移指令的使用方法
汇编语言王爽第三版检测点答案带目录

汇编语言王爽第三版检测点答案带目录在学习汇编语言的过程中,王爽老师的《汇编语言(第三版)》无疑是一本备受推崇的经典教材。
而对于学习者来说,检测点的答案能够帮助我们更好地巩固知识,查漏补缺。
接下来,我将为大家详细呈现这本教材中各个章节检测点的答案,并附上清晰的目录,方便大家查阅和学习。
第一章基础知识检测点 11(1)1 个 CPU 的寻址能力为 8KB,那么它的地址总线的宽度为。
答案:13 位。
因为 8KB = 8×1024 = 2^13B,所以地址总线的宽度为 13 位。
检测点 12(1)8086 CPU 有根数据总线。
答案:16 根。
(2)8086 CPU 有根地址总线。
答案:20 根。
检测点 13(1)内存地址空间的大小受的位数决定。
答案:地址总线。
(2)8086 CPU 的地址总线宽度为 20 位,其可以寻址的内存空间为。
答案:1MB。
因为 2^20 = 1048576B = 1MB。
第二章寄存器检测点 21(1)写出每条汇编指令执行后相关寄存器中的值。
mov ax,62627 AX = 62627mov ah,31H AH = 31H,AX = 31627mov al,23H AL = 23H,AX = 3123H检测点 22(1)给定段地址为 0001H,仅通过变化偏移地址寻址,CPU 的寻址范围为到。
答案:00010H 到 1000FH。
(2)有一数据存放在内存 20000H 单元中,现给定段地址为 SA,若想用偏移地址寻到此单元。
则 SA 应满足的条件是:最小为,最大为。
答案:最小为 1001H,最大为 2000H。
第三章内存访问检测点 31(1)下面的程序实现依次用内存 0:0~0:15 单元中的内容改写程序中的数据。
完成程序。
assume cs:codesgcodesg segmentdw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987Hstart: mov ax,0mov ds,axmov bx,0mov cx,8s: mov ax,bxmov bx+16,axadd bx,2loop smov ax,4c00hint 21hcodesg endsend start检测点 32(1)下面的程序将“Mov ax,4c00h ”之前的指令复制到内存 0:200 处。
控制转移类指令

13
(2)RET imm16指令
带立即数的返回指令,中的16位立即数称为弹出值,RET指令 在完成返回操作后,还须作SP←SP+imm16,即删除栈中 imm16个字节的内容。
例:下列程序段表示由于在RET指令中规定了弹出值,使控制 从子程序返回后栈顶位置恢复到正常状态。
;主程序 MOV AX,N1 PUSH AX MOV AX,N2 PUSH AX CALL PROG_A MOV SUM,AX
例: JMP EBX
;段内转移,EIP=EBX
JMP FWORD PTR [EBX]
;段间转移,目标地址为[EBX]指向的48位虚拟地址,
;CS=其中的高16位,EIP=其中的低32位
2009年6月2日星期二
4
在64位模式下,指令指针为RIP。JMP指令的执行分为相对转移和绝对 转移两种情况:
若为相对转移,则用RIP寄存器与机器码中的位移量字段相加的和 修改RIP值,此时位移量字段不能超过32位,并将其符号扩展为 64位再相加;
指令格式:RET 或 RETimm16 用以返回到调用这个子程序的断点处,作为子程
序或过程的最后一条指令,。 若是段内返回,则把栈顶的一个字弹出至IP,
恢复调用时断点处的偏移地址; 若为段间返回,则除了弹出IP外,还要从当
前栈顶继续弹出一个字到CS,恢复断点处的 段地址。
2009年6月2日星期二
CALL WORD PTR [BX] ;EA在字存储单元中
2009年6月2日星期二
10
⑶段间直接调用(CALL FAR PTR DST)
操作:PUSH CS
;CS入栈
PUSH IP
;IP入栈
(IP)←偏移地址 ;IP由指令中的偏移地址取代
第9章 转移指令的原理

段内间接转移
• 格式:
–jmp 16位寄存器 –jmp word ptr 内存单元地址
• 功能:用16位寄存器或者16位 的内存单元内容修改IP的值 • 例如:
–mov ax,0123H –mov ds:[0],ax –jmp word ptr ds:[0]
段间间接转移
• 格式:jmp dword ptr 内存单元地址 • 功能:从内存单元地址处开始存放两个 字,高地址处的字是转移的目的段地址, 低地址处是转移的目的偏移地址
–(CS)=(内存单元地址+2) –(IP)=(内存单元地址)
• 例如:
– mov – mov – mov – jmp ax,0123H ds:[0],ax word ptr ds:[2],0 dword ptr ds:[0]
条件转移指令——jcxz指令
• 格式:jcxz 标号 • 功能:若(cx)=0,转到标号处执行, 否则执行下一条指令 • 操作:当(cx)=0,(IP)=(IP)+8位 位移
loop指令
• 也是一种条件转移指令,所有的 循环指令都是短转移 • 格式:loop 标号 • 操作:(cx)=(cx)-1 • 若(cx) ≠0,(IP)=(IP)+8位位移
–8位位移=“标号”处地址-loop指令 后的第一个字节的地址 –8位位移的范围是-128~127,补码表 示 –8位位移由编译程序在编译时算出
–assume cs:codesg –codesg segment – start:mov ax,offset start – s:mov ax,offset s –codesg ends –end start
mov ax,3
问题9.1
填写指令,使该程序在运行中将s处的一条指 令复制到s0处 assume cs:codesg codesg segment s: mov ax,bx mov si,offset s mov di,offset s0 _______________ _______________ s0:nop nop codesg ends end start
第09章 转移指令的原理

问题9.1分析
(1)s和s0处的指令所在的内存单元的地址是 多少? cs:offset s 和cs:offset s0。 (2)将s处的指令复制到s0处,就是将 cs:offeet s 处的数据复制到cs:offset s0处; (3)段地址已知在cs中,偏移地址offset s和 offset s0已经送入si和di中; (4)要复制的数据有多长? mov ax,bx指令的长度为两个字节,即1个字。
当(cx)=0时,什么也不做(程序向下执行)。
9.7 jcxz指令
我们从 jcxz的功能中可以看出,指令 “jcxz 标号”的功能相当于: if((cx)==0) jmp short 标号;
(这种用C语言和汇编语言进行的综合描 述,或许能使你对有条件指令理解得更 加清楚。)
9.8 loop指令
9.3 依据位移进行转移的jmp指令
实际上,指令“jmp short 标号”的功能 为(IP)=(IP)+8位位移。
(1)8位位移=“标号”处的地址-jmp指令 后的第一个字节的地址; (2)short指明此处的位移为8位位移; (3)8位位移的范围为-128~127,用补码表 示 (如果你对补码还不了解,请阅读附注2) (4)8位位移由编译程序在编译时算出。
内存单元地址可用寻址方式的任一格式给出。
9.6 转移地址在内存中的jmp指令
示例:
mov ax,0123H mov ds:[0],ax jmp word ptr ds:[0] 执行后,(IP)=0123H mov ax,0123H mov [bx],ax jmp word ptr [Байду номын сангаасx] 执行后,(IP)=0123H
转移指令的原理课件.doc

第九章转移指令的原理1. 可以修改IP,或同时修改CS和IP 的指令统称转移指令。
概括地讲,转移指令就是可以控制CPU执行内存中某处代码的指令。
2.8086CPU的转移行为有以下几种:(1) 只修改IP 时,称为段内转移。
例如:jmp ax(2) 同时修改CS和IP 时,成为段间转移。
例如:jmp 1000:03. 由于转移指令对IP 值修改范围的不同,段内转移又分为:短转移和近转移。
(1) 短转移IP 的修改范围是-128~127(2) 近转移IP 的修改范围是-32768~327674.8086CPU的转移指令分为以下几类:(1) 无条件转移指令(如:jmp)(2) 条件转移指令(3) 循环指令(如:Loop)(4) 过程(5) 中断这些转移指令的前提条件可能不同,但转移的基本原理是相同的。
5. 操作符offset 是一个伪指令,它的功能是取得标号的偏移地址。
案例:将s 处的一条指令复制到s0处assume cs:codesgcodesg segments: mov ax,bx ;mov ax,bx 占两个字节mov si,offset s ; 得到标号s 所在的偏移地址赋值给simov di,offset s0 ; 得到标号s0所在的偏移地址赋值给dimov ax,cs:[si]mov cs:[di],axs0: nop ;nop 占一个字节nopcodesg endsend6.jmp 为无条件转移,可以只修改IP,也可以同时修改CS和IP 的值jmp 指令要给出两个信息:(1) 转移的目的地址。
(2) 转移的距离(段间转移,段内转移的短转移和近转移)7.jmp short 标号(转到标号处执行)这种指令实现的是段内短转移。
jmp 指令中的" 标号"是代码段中的标号,指明了指令要转移的目的地,转移指令结束,CS:IP 指向标号处的指令。
8.CPU在执行jmp 指令时并不需要指明转移的目标地址。
程序设计语言 编译原理(第三版)第9章

TOP 32
d
31
c
30
v
29
u
28
2
27
11
SP 26 25
返回地址 17
24
d
23
c
22
v(形参)
21
u(形参)
20
2(形参个数)
19
11
18
返回地址
17
11
16
i
15
b(形参)
14 1(形参个数)
13
0
12
返回地址
11
5
10
i
9
c
8
0
7
0
6
返回地址
5
0
4
x
3
a
2
0
1
返回地址
0
0
25
9.5 嵌套过程语言的栈式实现
0
0
过程S中调 用Q时
过程P中 调用S时
23
过程Q中调用R时
TOP
24
d
23
c
22
v(形参)
21
u(形参)
20 2(形参个数)
19
11
18 返回地址
SP
17
11
16
i
15
b(形参)
14 1(形参个数)
13
0
12
返回地址
11
5
10
i
9
c
8
0
7
0
6
返回地址
5
0
4
x
3
a
2
0
1
返回地址
0
0
转移指令的原理

转移指令的原理转移指令的原理1.0 操作符offset操作我offset在汇编语⾔中是由编译器处理的符号,伪指令,它的功能是取得标号的偏移地址将start的代码复制到s0中去assume cs:codecode segmentstart: mov ax, bx ;这⾥占两个字节mov si, offset start ;将start的偏移地址送⼊si中 0000Hmov di, offset s0 ;将s0的偏移地址送⼊di中mov ax, cs:[si] ;通过物理地址将数据送⼊ax,在通过ax送到di中mov cs:[di], axs0: nop ;nop 占⼀个字节nopmov ax, 4c00Hint 21Hcode endsend start1.1 Jmp指令jmp为⽆条件跳转指令,只可以修改ipjmp指令需要给出两种信息转移的地址转移的距离(段内转移,段内短转移,段内近转移)assume cs:codecode segmentstart: mov ax, 0jmp short sadd ax, 1s: inc axmov ax, 4c00Hint 21Hcode endsend startjmp short 标号(转移到标号处执⾏命令)这种jmp格式指令实现的是段内短转移,它对ip的修改范围为-128~127,也就是说,它向前可以越过128个字节,向后的话最多可以越过127个字节assume cs:codecode segmentstart: mov ax, 0jmp short ptr sdb 256 dup(0) ;这⾥定义256个空字节 short是跳不过去的,编译不会通过,可以改成near ptr, far ptrs: inc axmov ax, 4c00Hint 21Hcode endsend start汇编与机器码的对照可以看到在汇编指令中出现的idata,不论它是⼀个数据还是偏移地址,它都会在对应的机器指令中出现,因为它是cpu执⾏的机器指令,他必须要处理的数据或地址,下图是上⾯程序对应的机器代码CPU是如何进⾏转移的尼?通过以上可以CPU 不需要⽬的地址也可以实现对地址的修改ip指向03H 将指令读取到指令缓存区,ip⾃增2变成05H,执⾏执⾏后,EB是jmp的机器码,向后在跳3个字节,ip等于08H,这个时候执⾏inc ax将ax⾃增1jmp short 标号的功能是(ip)= (ip)+8位偏移 8位位移是由程序在编译的时候算出的jmp near ptr 标号说明,段内近转移 16位位移16位位移的范围是-32768~327671.2 转移指令的⽬的地址之前的jmp,其机器码中并没有转移的⽬的地址,⽽是相对于当前ip的转移偏移jmp far ptr 标号实现的段间转移,⼜称段转移far ptr 指明了指令中标号的段地址和偏移地址改变了CS:IPassume cs:codecode segmentstart: mov ax, 0jmp far ptr sdb 256 dup(0)s: inc axmov ax, 4c00Hint 21Hcode endsend startjmp far ptr可以看出机器码是包含要跳转的地址,没有相对于当前ip的计算转移偏移1.3 jmp 寄存器相当于 jmp near ptr 标号1.4 转移地址在内存中的jmpjmp word ptr 内存单元地址功能:内存单元存储的⼀个字就是转移的⽬的地的偏移地址因为word是16位的只能完成段内转移,进⾏16位位移代码⽰例mov ax, 1234Hmov ds:[0], axjmp word ptr ds:[o] ;这⾥跳转的为CS:1234Hjmp dword ptr 内存单元地址(段间转移)功能:从内存单元地址存放2个字,⾼地址对应段地址,低地址对应偏移地址因为dword是32位的可以完成段间转移CS=内存单元地址+2IP= 内存单元地址代码⽰例mov ax, 1234Hmov ds:[0], axmov ds:[2], 0jmp word ptr ds:[0] ;这⾥跳转的为CS:IP = 0000:1234H1.5 jcxz 指令 jmp cx is zerojcxz 如果cx为0则跳转是⼀个有条件的跳转指令,所有的有条件转移指令都是短转移,对应的机器码包含转移的位移,⽽不是⽬的地址,对IP的修改都是-128~1271.6 loop指令loop为循环指令,所有循环都是短转移,对应的机器码是转移的位移,⽽不是物理地址cx为0 则向下执⾏在内存2000H段中查找第⼀个值为0的字节,找到后将偏移地址放⼊dx中assume cs:codecode segmentstart: mov ax, 2000Hmov ds, axmov bx, 0s: mov cl, [bx]mov ch, 0jcxz okinc bx ;⾃增1 去找下⼀个内存单元的数据loop sok: mov dx, bxmov ax, 4c00Hint 21Hcode endsend start1.7 根据位移进⾏转移的意义前⾯讲到:jmp short 标号jmp near ptr 标号jcxz 标号loop 标号⼏种指令,他们对ip的修改都是根据转移⽬的地址和起始地址之前的位移进⾏的,他们对应的机器码不包含转移⽬的地的地址,⽽是包含到⽬的地的位移距离这样的设计,⽅便了程序段在内存中的浮动装配如果这些指令码中是包含物理地址,则就对程序段在内存中的偏移地址有了严格的限制1.8 编程题学蒙蔽先停停。
汇编条件转移指令

汇编条件转移指令汇编语言是一种底层的计算机语言,它直接操作计算机硬件,因此在编写高效的程序时,掌握汇编语言是非常重要的。
条件转移指令是汇编语言中的一种重要指令,它可以根据特定的条件来改变程序的执行流程。
本文将介绍汇编条件转移指令的基本概念、语法和使用方法。
一、基本概念条件转移指令是一种根据特定条件来改变程序执行流程的指令。
在程序执行过程中,如果满足特定条件,就会跳转到指定的地址继续执行,否则就会继续执行下一条指令。
条件转移指令通常用于实现程序的分支和循环结构。
二、语法格式条件转移指令的语法格式如下:```Jcc destination```其中,Jcc表示条件转移指令的助记符,cc表示条件码,destination表示跳转的目标地址。
条件码是由前缀字母J和后缀字母S、Z、P、O、C、N等组成的,它们分别表示以下条件:- JS:符号位为1(即负数)- JZ:零标志位为1- JP:奇偶标志位为1- JO:溢出标志位为1- JC:进位标志位为1- JN:负数标志位为1三、使用方法条件转移指令的使用方法如下:1. 判断条件在使用条件转移指令之前,需要先判断特定条件是否满足。
条件通常是通过比较指令来实现的,比如CMP指令可以比较两个操作数的大小关系,并设置相应的标志位。
2. 编写条件转移指令根据需要跳转的条件,选择相应的条件转移指令,并将跳转的目标地址作为操作数填写到指令中。
3. 执行条件转移指令当条件转移指令被执行时,会根据特定条件判断是否跳转到目标地址。
如果条件满足,则跳转到目标地址继续执行,否则继续执行下一条指令。
四、示例代码下面是一个简单的示例代码,演示了如何使用条件转移指令实现一个简单的分支结构:```MOV AX, 5CMP AX, 10JL less_thanMOV BX, 10JMP endless_than:MOV BX, 5end:```该代码首先将AX寄存器的值设置为5,然后使用CMP指令比较AX的值和10的值。
微机原理与接口技术3-9控制转移指令

例: JMP 0120H JMP SHORT LPI ;直接转向0120H ;转向LPI
JMP NEAR PTR BBB ;转向BBB 由于是段内转移,故转移后CS内容保持不变
②段内间接转移 转移的目标地址(偏移量)由寄存器或存储单元的内 容给出。 例:JMP SI 若指令执行前(SI)=1200H,则指令执行后, (IP)=1200H,于是转向代码段的偏移地址1200H处执行。
(2)条件转移指令Jcc
格式为:
Jcc Label
; Label是转移的目标地址
Jcc指令包括下列3类: (1)测试单个标志位。
(2)用于带符号数比较。
(3)用于无符号数比较。
条件转移指令只能是段内直接转移,且指令的 转移范围为指令所在位置的-128~+127字节。
i 根据单个标志位设置的条件转移指令
出的位移量加到IP上。
②段内间接调用
子程序的偏移地址在寄存器或存储器中。
格式:CALL mem16/reg16 CALL执行时,它首先将IP内容压栈,然后把指定的寄 存器/存储器的内容送入IP。
例: CALL AX ;调用地址由AX给出 CALL WORD PTR[SI] ;调用地址由存储器给出.
在汇编语言中,段内间接寻址通常写成: JMP WORD PTR[BX+DI] 表示所取得的目标地址是一个字(16位偏移地址)。
③段间直接转移 在指令中直接给出要转移到的目的段地址和 偏移地址。
例:JMP 2000:1000H
执行时,(IP)←1000H,(CS)←2000H 注:直接地址为符号地址时,段间直接转移指令中 的符号地址前应加操作符FAR PTR。
•JL/JNGE •JLE/JNG
转移指令的原理

转移指令的原理可以修改IP,或者同时修改cs和ip的指令统称为转移指令。
8086cpu的转移⾏为有以下⼏类:只修改ip,称为段内转移,如jmp ax同时修改cs和ip,称为段间转移,如jmp 1000:0根据转移指令对于ip的修改范围不同,所以段内转移⼜分为:短转移和近转移短转移IP的修改返回为-128~127近转移IP的修改范围为-32768~327678086cpu的转移指令分为以下⼏类:⽆条件转移指令(如:jmp)条件转移指令(jcxz)循环指令(loop)过程中断不同转移指令的转移条件可能不同,但是转移的基本原理是相同的操作符offsetoffset是在汇编语⾔中是由编译器处理的符号,功能为取得标号的偏移地址。
也就是相对于代码段的偏移地址,就是直接IP值了。
jmp指令jmp为⽆条件转移指令,可以只修改IP,也可以同时修改cs和ip。
jmp指令需要给出两种信息:转移的⽬的地址转移的距离(段间转移,段内短转移,段内近转移)不同的给出⽬的地址的⽅法不同,和不同的转移位置,对应有不同格式的jmp指令。
依据位移进⾏转移的jmp指令1. jmp short 标号 (IP)=(IP)+8位位移这种格式的jmp指令实现的是段内短转移。
对ip的修改范围限定为-128~127之间,可以看出正好是⼀个字节能够表⽰的范围。
2. jmp near ptr 标号 (IP)=(IP)+16位位移于jmp short功能相同,只不过他实现的是段内近转移。
简单来说就是转移的距离拉长(虽然仍然是在段内)⼩贴⼠:可以看到jmp short与jmp near ptr(段内转移)并没有直接将转移的⽬的地址直接写⼊机器指令中。
⽽是将⼀个相对偏移地址写⼊了机器指令。
(但是debug在对应的汇编指令中会看到偏移地址)具体来说就是将标号地址相对于jmp指令的下⼀条指令的地址写⼊了机器指令。
也就是说,cpu在执⾏jmp指令的时候并不需要转移的⽬标地址。
微机原理与接口技术:转移指令

说明转移范围,以当前 IP 为中心,转移范围-32768~+32767。
说明:在编程时 NEAR 与 SHORT 通常省略,编译时由汇编程序自己计算。如果用了
NEAR 或 SHORT,在编译时有时会提示不正确的属性限制。所以 JMP LABEL 是最常见
的形式。
由于 LABEL 对应一条指令,是这条指令的符号地址,所以以上三种 JMP 形式又称为
表 3-1 条件转移指令
指令名称 进位转移 无进位转移 等于或为零转移 不等于或非零转移 奇偶校验为偶转移 奇偶校验为奇转移 结果为负转移 结果为正转移 溢出转移 不溢出转移 大于则转移 大于或等于则转移 小于则转移 小于或等于则转移 大于则转移 大于或等于则转移 小于则转移 小于或等于则转移 CX内容为0转移
JMP WORD PTR[BX+DI],从[BX+DI]指明的内存区域连续取出两个字节传送给 IP,程序转 移到 CS:IP 处继续执行。操作数可以采用各种寻址方式。
以上两种 JMP 形式又称为段内间接转移,编程时要注意操作数必须是 16 位。
【例题 3-17】
…
MOV DI, 0
JMP DONE
JMP FAR NEXT JMP 8000:2000H JMP DWORD PTR [DI]
2.条件转移指令
条件转移指令先测试条件,若条件成立则执行转移操作;若不成立则不转移并顺序执行 下一条指令。所有的条件转移指令转移范围-128~+127,属于段内短转移,都不影响状态标 志位。
指令格式: JCC OPRD 功能:若条件成立则转移到 OPRD 处执行,IP IP+位移量。 说明:J 是 JUMP 的缩写,CC 表示转移的条件,OPRD 通常是标号。
汇编语言第九章转移指令的原理

汇编语⾔第九章转移指令的原理转移指令:可以修改IP,或者同时修改CS和IP的指令称为转移指令。
只修改IP时,称为段内转移,段内转移根据IP的修改范围⼜分为短转移(short)和近转移(near);短转移IP的修改范围为8位补码表⽰的范围:-128~127.近转移IP的修改范围为16位补码表⽰的范围:-32768~32767(向前为负,向后为正)同时修改IP和CS时,称为段间转移,⼜称远转移(far)。
转移指令分类:1. ⽆条件转移指令,jmp,其他转移指令⼤多可以基于jmp写出2. 有条件转移指令,jcxz3. 循环转移指令,loop4. 过程5. 中断操作符offset:offset的功能是获取标号的偏移地址EA,标号指的是s、start、data⼀类的名称。
⽆条件转移指令jmp:jmp给出的两种信息:转移的⽬的地址,由标号给出转移的距离(段间转移,段内短转移short,段内近转移near)1. 短转移、近转移jmp指令jmp short 标号(该指令本⾝占两个字节)翻译成机器码为 EBXX,XX为转移位移量的补码表⽰,向前为负向后为正。
没有表达出绝对的⽬的地址,只给出了相对的位移。
位移量XX = 标号处的地址 - jmp指令后⼀个字节的地址,short指明位移量为8位。
(IP)=(IP)+ XX()8位位移类似的还有 jmp near ptr 标号(也可写成jmp s 省略near ptr)(该指令本⾝占三个字节)翻译成机器码为 E9XXXX 其位移量⽤两个字节表⽰,ptr可以看作是长度声明。
(IP)=(IP) + XXXX 16位位移2.远转移jmp指令jmp far ptr 标号(该指令本⾝占五个字节)翻译成机器码为 EAXXXX YYYY,XXXX为偏移地址,前两个X为低位,后两个X为⾼位;YYYY 为段地址,前两个Y为低位,后两个Y为⾼位。
向前转移:编译器中有⼀个地址计数器AC,编译器读到标号s时记下AC的值as,读到jmp时记下AC的值aj,再⽤aj - ac算出位移量disp-128 < disp < 127 时,近转移、远转移统统转化成短转移,机器码为EB disp(占两个字节)disp超出上述范围,得⽤16位补码表⽰时,短转移将产⽣编译错误,近转移和远转移正常执⾏向后转移:向后转移时,编译器先读到jmp指令,记下aj,但没有as,⼀时⽆法计算位移量disp,这时会对jmp指令进⾏⼀个预处理,预处理不管转移类型,统⼀当作短转移,但预留的空间不同对于短转移,编译器⽣成EB和1个nop指令,相当于预留⼀字节,⽤于存放8位disp对于近转移,编译器⽣成EB和2个nop指令,相当于预留两字节,⽤于存放16位disp对于远转移,编译器⽣成EB和4个nop指令,相当于预留四字节,⽤于存放段地址和偏移地址当编译器往后读到as时,计算disp = as - aj-128 < disp < 127 时,近转移、远转移统统转化成短转移,机器码为EB disp,多余的预留空间闲置disp超出上述范围,得⽤16位补码表⽰时,短转移将产⽣编译错误,近转移和远转移正常执⾏,在预留的位置添上相应代码即可3.转移信息在寄存器或者内存中的jmp指令jmp 16位寄存器(只能是16位寄存器,因为相当于mov ip ,res,寄存器位数要对应)。
控制转移类指令PPT课件

控制转移类指令
微机原理
JMP —— 无条件转移指令
• 段间直接远转移
JMP FAR LABEL ; LABEL 为 CS目的:IP目的
• 段间间接远转移
JMP DWORD [BX] ; CS目的:IP目的 在地址 [BX] 中
注:段间转移方式 —— CS变、IP变
当前CS=210×01H6 21000H
控制转移类指令
微机原理
JXX指令与状态标志位 —— ZF、CF
•与ZF有关的条件转移指令
JE/JZ —— 两数相等/两数相减不为零(ZF = 0) JNE/JNZ —— 两数有等/两数相减为零(ZF = 1)
•与CF有关的条件转移指令
JAE/JNB —— 高于或等于/不低于(CF = 0) JNC —— 无进位/无借位(CF = 0) JB/JNAE —— 低于/不高于也不等于(CF = 1) JC —— 有进位/有借位(CF = 1)
微机原理
代码段1
当前IP =1500H
JMP 0C 02 00 65
转移目标的偏移地址 转移目标的段地址
新CS=6500H
×16 65000H
代码段2
新IP = 020CH
转移至此
…
控制转移类指令
微机原理
段内间接转移与段间间接远转移讨论
• JMP [BX] ;指令错误,未确定[BX]中的数据类型
段内直接短转移 —— rel8
JMP SHOR LABEL
错误的 rel8
注:rel8 < 80H
正确的 rel8
IP目的 ← IP当前 + rel8 LABEL IP目的 ← IP源 + rel8 + 2
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
问题9.1
9.2 jmp指令
无条件转移指令
它指出两种信息:
转移的目的地址 转移的距离
9.3 依据位移进行转移的jmp指令
jmp short 标号
段内短转移,它对IP的修改范围是-128~127。 也就是说,它向前转移时可以最多越过128个 字节,向后转移时最多越过127个字节。 标号:指代码段中的标号,指明了指令要转移 的目的地,转移指令执行后,CS:IP指向标号处 的指令
9.8 LOOP 指令
LOOP指令是循环指令,所有的循环指令 都是短转移,在对应的机器码中包含转 移的位移,而不是目的地址。对IP的修 改范围是 -128 ~ 127。
LOOP 指令
LOOP
操作:
标号
1、(CX) = (CX) – 1 2、如果(CX) ≠0, (IP) = (IP) + 8位位移
寻址方式:
立即数寻址 直接寻址 寄存器间接寻址 寄存器相对寻址 基址变址寻址 相对基址变址寻址
第九章 转移指令的原理
转移指令
可以修改IP,或同时修改CS和IP的指令统 称为转移指令。 转移指令就是可以控制CPU执行内存中某 处代码的指令。
转移指令
段内转移:只修改IP,例如 jmp ax
实验9 学习在屏幕上显示字符
mov ax, 4c00h int 21h end start
code ends
9.9 根据位移进行转移的意义
方便程序段在内存中的浮动装配
9.10 编译器对转移位移超界的 检测
jmp short 标号 jmp near 标号 loop 标号 jczx 标号
实 验 8
assume cs: codesg codesg segment mov ax, 4c00h int 21h start: mov ax, 0 s: nop nop mov di, offset s mov si, offset s2 mov ax, cs:[si] mov cs:[di], ax s0: jmp short s s1: mov ax, 0 int 21h mov ax, 0 s2: jmp short s1 nop codesg ends end start
jmp 16位寄存器
功能: (IP) = (16位寄存器)
9.6 转移地址在内存中的jmp指令 jmp word ptr 内存单元地址
段内近转移
jmp dword ptr 内存单元地址
段间转移 从内存单元地址处开始存放两个字,高地址处的字是转 移的目的段地址,低地址处是转移的目的偏移地址。
assume cs:code data segment dd 12345678h data ends code segment start: mov ax, data mov ds, ax mov bx, 0 mov [bx], ____ mov [bx+2], ____ jmp dword ptr ds:[0] code ends end start
短转移:修改IP的范围为 -128~127 近转移:修改IP的范围为 -32768~32767
段间转移:同时修改CS和IP,例如jmp 1000:0
转移指令
无条件转移指令 条件转移指令 循环指令 过程 中断
9.1 操作符 offset
offset 在汇编语言中是由编译器处理的符 号,它的功能是取得标号的偏移地址。
依据位移进行转移的jmp指令
jmp near ptr 标号
jmp near ptr 标号 的功能是: (IP) = (IP) + 16位位移
(1)16位位移 = “标号”处的地址 - jmp指 令后的第一个字节的地址 (2)near 指明此处的位移为16位位移 (3)16位位移的范围为-32768~32767,用补 码表示 (4)16位位移由编译程序在编译时算出。
检测点9.1 (1)
assume cs;code data segment ? data ends code segment start: mov ax, data mov ds, ax mov bx, 0 jmp word ptr [bx+1] code ends end start
检测点9.1 (2)
理解 jmp short 标号 的机器码
jmp short 标号 的功能是: (IP) = (IP) + 8位位移
(1)8位位移 = “标号”处的地址 - jmp指 令后的第一个字节的地址 (2)short 指明此处的位移为8位位移 (3)8位位移的范围为-128~127,用补码表示 (4)8位位移由编译程序在编译时算出。
jcxz 指令
jczx 标号
操作: 当(CX) = 0 时, (IP) = (IP)+8 位位移 当(CX) me cs:code code segment start: mov ax, 2000h mov ds, ax mov bx, 0 s: ___________ ___________ ___________ ___________ jmp short s ok: mov dx, bx mov ax, 4c00h int 21h code ends end start
检测点9.1 (3)
2000:1000 BE 00 06 00 00 00 00 …
mov ax, 2000h mov es, ax jmp dword ptr es:[1000h] (CS)= ? , (IP)= ?
9.7 jcxz 指令
条件转移指令 所有的条件转移指令都是短转移,在对 应的机器码中包含转移的位移,而不是 目的地址。 对IP的修改范围为: -128 ~ 127
依据位移进行转移的jmp指令
jmp short 标号 段内短转移 jmp near ptr 标号 段内近转移
9.4 转移的目的地址在指令中 的jmp指令
jmp far ptr 标号
在该类指令的机器码中包含了标号所在 段的段地址和标号在段中的偏移地址
9.5 转移地址在寄存器中的jmp 指令
(1)8位位移 = “标号”处的地址 -LOOP指令 后的第一个字节的地址 (2)8位位移的范围为-128~127,用补码表示 (3)8位位移由编译程序在编译时算出。
检测点9.3
assume cs:code code segment start: mov ax, 2000h mov ds, ax mov bx, 0 s: mov cl, [bx] mov ch, 0 __________ inc bx loop s ok: dec bx mov dx, bx