第二章80X86指令系统3

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

无条件转移指令
JMP指令控制程序无条件地跳转到目的单 元,使用JMP指令可有三种格式: ⑴ JMP SHORT label 短转移(short jump) ⑵ JMP NEAR PTR label 近转移(near jump) ● JMP label 直接转移(direct jump) ● JMP reg 寄存器间接转移(register indirect jump) ● JMP WORD PTR OPR 存储器间接转移 (memory indirect jump) ⑶ JMP FAR PTR
在介绍这些寻址方式之前,先解释三个表 示转移距离(称为位移量)的操作符: SHORT、NEAR、FAR。 SHORT表示位移量在-128~127字节之 间(一字节表示)。 NEAR表示在同一段内转移,位移量在32768~32767字节范围内(两字节表示)。 FAR表示转移距离超过±32K字节,或是 在不同段之间转移。
条件转移指令是在满足了规定的条 件后才控制程序转移的一类指令 所有条件转移指令都是短转移指令, 转移的目标地址必须在当前IP地址的- 128至+127字节范围之内,因此条件转 移指令是2字节指令。
P72 P73 P74
计算转向地址的方法和无条件短转移 指令是一样的 例 1050:0000 B86610 MOV AX,1040
● JMP label 直接转移(direct jump)
执行操作:(IP) ← OFFSET label = (IP)当前+16位位移量
转移的目标地址在指令中可直接使用符号 地址,由于位移量为16位,它的转移范围应 是-32768至+32767,也就是说,近转移指 令可Baidu Nhomakorabea转移到段内的任一个位置。
循环指令采用相对寻址方式,Label距离循环指令的下一条 指令必须在-128~+127B之内。
LOOP指令的功能可以用Jcc指令实现:
DEC JNZ CX Label ; CX←CX-1 ; 若(CX)≠0(也就是ZF=0),转移到Label
1050:0003 1050:0005 1050:0008 1050:000D 1050:000F 1050:0010 1050:0011 1050:0013 1050:0016 1050:0018 8ED8 MOV DS,AX B90500 MOV CX,0005 BB0000 MOV BX,0000 0207 AGAIN: ADD AL,[BX] 43 INC BX 49 DEC CX 75FA JNZ AGAIN A20500 MOV [0005],AL B44C MOV AH,4C CD21 INT 21
补P34 补P41
循环控制指令
LOOP Label ; CX←CX-1,若(CX)≠0,转移到Label
LOOPZ/LOOPE Label ; CX←CX-1,若(CX)≠0且ZF=1,转移到Label LOOPNZ/LOOPNE Label
; CX←CX-1,若(CX)≠0且ZF=0,转移到Label
SHORT转移,称为短转移,位移量 用一个字节(8位)来表示。 NEAR转移,称为近转移,位移量用 16位表示,因为程序控制仍然在当前代 码段,所以只修改IP的值,CS的值不变。 FAR转移,称为远转移,因为程序 控制超出了当前代码段,所以CS和IP都 必须修改为新的值。
因为CS:IP寄存器总是指向下一条将要 执行的指令的首地址(称为当前值) ,当转移指 令执行后,必须修改IP或CS、IP的值。当转
P71
因为是段间转移,CS和IP都要更新, 这个新的段地址和偏移地址由指令操作 码之后的连续两个字提供,所以只要将 指令中提供的转向偏移地址装入IP,转 向段地址装入CS,就完成了从一个段到 另一个段转移的工作。
段间间接寻址(Intersegment indirect addressing) 这种寻址方式仍然是用相继两个字的内 容装入IP和CS来达到段间的转移目的的, 但这两个字的存储器地址是通过指令中的 数据寻址方式(除立即寻址方式和寄存器 寻址方式外)来取得的。 执行的操作:(IP) (EA) (CS) (EA+2)
移指令给出位移量时,用IP当前值加上 位移量即为新的IP的值。或者转移指令 给出新的段地址和偏移地址.
与转移地址有关的4种寻址方式就是告 诉CPU如何修改CS和IP的值,以达到控制 程序转移的目的。
段内直接寻址(Intrasegment direct addressing) 这种寻址方式在指令中直接指出转 向地址,如: JMP SHORT NEXT
⑴ JMP SHORT label 短转移(short jump) 执行操作:(IP) ← (IP)当前+8位位移量
⑵ JMP NEAR PTR label 近转移 (near jump) 近转移是JMP指令的缺省格式,可以 写为"JMP label"。它可在当前代码段内转 移,机器指令的操作码是E9,位移量是16 位的带符号补码数。指令中的转向地址可 以是直接寻址方式、寄存器寻址方式、寄 存器间接方式和存储器寻址方式。
短转移的目标地址(或称转向地址)相对 于当前IP值的位移量在-128至+127字节之 间,当前IP值是指JMP指令的下一条指令的 地址(如图所示)。对短转移JMP,机器指 令的第一个字节为操作码EB,第二个字节为 位移量00~FF,这是一个带符号的补码数。 转向地址的计算方法为:(IP)当前+8位位移 量。操作符SHORT指示汇编程序将JMP指令 汇编成一个2字节指令。
第 2章
8086指令系统3
与转移地址有关的寻址方式
程序中指令的执行顺序是由CS:IP来决 定的,程序转移类指令可改变IP或CS、IP 的内容,从而控制指令的执行顺序,实现 指令转移、程序调用等功能。
与数据有关的寻址方式最终确定的 是一个数据的地址,而这里介绍的与转 移地址有关的寻址方式最终确定一条指 令的地址。顺序执行的指令地址是由指 令指针寄存器IP自动增量形成的,而程 序转移的地址必须由转移类指令和CALL 指令指出,这类指令表示转向地址的寻 址方式包括:段内直接寻址、段内间接 寻址、段间直接寻址、段间间接寻址。
⑶ JMP FAR PTR label 远转移(far jump) 执行操作:(IP) ← label的段内偏移地址 (CS) ← label所在段的段地址 远转移实现的是段间的跳转,即从当前代 码段跳转到另一个代码段中,这意味着指令执 行后,不仅要改变IP的值,CS也会得到一个 新的段地址。
条件转移指令(conditional jump)
段间直接寻址(Intersegment direct addressing) 段间直接寻址和段内直接寻址类似,指 令中直接给出转向地址,不同的是,在符号 地址之前要加上表示段间远转移的 操作符 FAR PTR。 指令格式如下: JMP FAR PTR OPR 执行的操作:(IP) OPR的段内偏移地址 (CS) OPR所在段的段地址
根据指令中的寻址方式,确定一个寄存 器或一个存储单元,其内容就是指定转向的 有效地址。因为程序的转移仍在同一段内进 行,所以只需将IP修改成新的转向地址,CS 不变。段内转移指令中的NEAR PTR是可以 缺省的。 注意:这种寻址方式以及以下的两种段 间寻址方式都不能用于条件转移指令。也就 是说,条件转移指令只能使用段内直接寻址 的8位位移量,而JMP和CALL指令则可用四 种寻址方式中的任何一种。
000D是标号AGAIN的地址,指令"JNZ AGAIN "的机器代码是75FA,75是操作码, FA是位移量。当CPU读取JNZ指令后,IP寄存 器自动加2(JNZ的指令长度)指向了下一条 指令(MOV),此时IP的当前值是0013。计 算转向地址时,(IP)当前+位移量 = 0013+ FA = 0013+FFFA = 000D,这正是AGAIN的 偏移地址。实际上FA是-6的补码,8位的FA 与16位的0013相加时,FA符号扩展成为FFFA, 相加的结果为000D。
0013正是标号NEXT的地址。JMP指 令执行后,将IP寄存器修改为0013,代码 段寄存器CS不变。紧接着CPU根据CS:IP 的指示,取出1060:0013中的ADD指令开 始执行,这样实现了程序的转移。
段内间接寻址(Intrasegment indirect addressing)
这种寻址方式在指令中用数据寻址方 式(除立即寻址方式外)间接地指出转 向地址.转向的有效地址是一个寄存器或 是一个存储单元的内容.如: JMP BX JMP [BX][SI] 执行的操作:(IP) (EA) ?

段内直接寻址方式
1060:000D EB04 JMP SHORT NEXT IP当前值→1060:000F … … 1060:0011 … … 1060:0013 0207 NEXT: ADDAL,[BX] CPU在执行JMP指令时,IP指向了下一条 指令,其值为000F,JMP SHORT NEXT指令 的机器语言为EB04,EB为操作码,04为位移 量,所以转向的有效地址应为: 000F + 0004 = 0013
为了说明寻址两个字单元,指令中必 须加上双字操作符DWORD。指令格式如下: JMP DWORD PTR [SI] JMP DWORD PTR[TABLE+BX]
程序中指令的执行顺序是由CS:IP来决 定的,程序转移类指令可改变IP或CS、IP 的内容,从而控制指令的执行顺序,实现 指令转移、程序调用等功能。
假设: (DS)= 2000H,(BX)= 1256H, (SI)= 528FH,(232F7H)= 3280H, (264E5H)= 2450H。
例 JMP BX 则执行该指令后(IP)= ?
则执行该指令后(IP)= 1256H
例 JMP [BX][SI] 则指令执行后(IP)=? =(16d ×(DS)+(BX)+(SI)) =(20000H + 1256H + 528FH) =(264E5H) = 2450H
例 假设程序进行两个带符号数的比较, 并根据比较结果转移,其中(AL)=80H, (BL)=01,请指出下面两组指令的转向地 址。 ⑴ CMP AL,BL JL XY ⑵ CMP AL,BL JB XY
答:⑴ 转向目标地址XY;⑵不能实现转移。 执行CMP指令时,(AL)-(BL)=80-01=7F, 条件码设置为:SF=0,OF=1,CF=0。执行JL 指令时,测试转移条件:SF异或 OF = 0异或 1 =1,说明满足(AL)<(BL)的转移条件,因此, (IP)←XY的偏移地址,程序即转移到XY单元执 行新的指令。 JB指令的转移条件为CF=1,而CMP的执行 结果使CF=0,所以不能引起转移。
执行的操作:(IP) 执行的操作:(IP) (IP)+8位位移量 (IP)+16位位移量
JMP NEAR PTR AGAIN
其中,NEXT和AGAIN均为转向的符号 地址。在机器指令中,操作码之后给出的 是相对于当前IP值的位移量(转移距离), 所以,转向的有效地址是当前IP值与指令 中给出的位移量(8位或16位)之和。 注意:这种寻址方式适用于条件转移及 无条件转移指令,当用于条件转移指令时, 位移量只允许8位。
● JMP reg 寄存器间接转移(register indirect jump) 执行操作:(IP) ← (reg) 转移的目标地址在寄存器中,例如 指令"JMP BX"执行的结果,将BX的内 容送给IP。
● JMP WORD PTR OPR 存储器间接转移 (memory indirect jump) 执行操作:(IP) ← (PA+1,PA) 存储器的物理地址PA由指令中的寻址方 式确定,JMP指令执行的结果,把PA单元的 字内容送到IP寄存器中。例如"JMP WORD PTR [DI]",物理地址PA = (DS)×16+(DI), 指令执行的结果是(IP)= (PA+1,PA)。
相关文档
最新文档