微机原理--控制转移指令

mac2025-06-03  80

转移指令

1.JMP(unconditional jump)无条件转移

程序转移到目的操作数指定的地址执行,不需要满足任何条件.

操作数可以是标号、立即数,也可以是寄存器操作数或存储器操作数

  Short jump  段内直接短转移

  Near   jump  段内直接近转移

  Far     jump   段间转移

  Indirect jump  间接转移(段内、段间)

 1)Short Jump 段内直接短转移

相对转移

指令给出一个语句标号label

但机器指令操作数不是地址,而是此标号相对于当前IP的偏移量,用8位补码表示。

转移范围 相对于当前IP  -128 +127

2)Near Jump 段内直接近转移

相对转移, short jump

3字节指令

1个字节操作码,两个字节的操作数(偏移量disp.

类似于Short jump,指令给出一个语句标号,此标号地址相对于当前IP的偏移量为16位补码

转移范围  同一代码段中

               相对于当前IP -32768+32767

3)Far Jump 段间直接转移

指令给出的标号地址在另一代码段中

5字节指令

第一字节:操作码

23字节:偏移地址 → IP

45字节:段地址 → CS

4)Indirect Jump 间接转移指令

4.1)段内直接转移,操作数为16位寄存器

 

寄存器内容为转移目标地址的偏移地址

指令将16位寄存器的内容作为偏移地址取代原来IP的内容,实现段内转移。

ExampleJMP  AX   

4.2)段内间接转移,操作数为16位存储器操作数

操作数为16位存储器操作数

存储单元的内容是转移目标地址的偏移地址.

指令将存储器中的字数据作为偏移地址取代原来IP的内容,实现段内转移。

操作数可采用寻址存储器操作数的所有寻址方式

Example

JMP  TABEL [BX]

JMP  ALPHA_WORD

JMP  WORD  PTR  [BP][SI]

常用于多分支转移。

4.3)段间间接转移

指令的操作数是一个32位(double word)的存储器操作数

低字为偏移地址取代原来IP的内容,高字为段地址给CS,实现段间转移。

操作数可采用寻址存储器操作数的所有寻址方式

2.条件转移指令 Conditional Jump

全部为short jump. 

转移范围:当前IP -128+127

条件转移指令测试标志位: SF, ZF, CF, PF and OF.

如果条件满足,转移到目标地址;

条件不满足,顺序执行下一条指令。

 

两个无符号数比较后根据其比较结果形成的4条条件转移指令

此类指令一般跟在比较或减法指令后面

两个带符号数比较后根据其比较结果形成的4条条件转移指令

一般跟在比较或者减法指令后面

助记符

测试条件

转移条件

JG/JNLE

SF=OF and

ZF=0

目标操作数 > 源操作数则转移

Jump if greater than

JGE/JNL

SF=OF

目标操作数 ≥ 源操作数则转移

Jump if greater than or equal

JL/JGE

SF≠OF and

ZF=0

目标操作数<源操作数则转移

Jump if less than

JLE/JNG

SF≠OF or

ZF=1

目标操作数 ≤ 源操作数则转移

Jump if less than or equal

 根据CFZFSFOFPF的状态形成的10条条件转移指令

循环控制指令

1.LOOP 无条件循环

CX作为计数器,相当于DEC CXJNZ指令的结合.

转移范围同条件转移指令,Short Jump

指令的执行过程:

CX-1

CX ≠ 0, 转移到语句标号处执行(循环)

CX = 0, 顺序执行下一条指令

2.LOOPE/LOOPZ (相等/为0时循环)

转移条件:

CX ≠ 0,且比较结果相等或减法运算结果为0 CX=0,或结果不等/不为0时,退出循环.

执行时,先CX-1,然后判断。

CX0,且ZF=1,转移

如任一条件不满足,则顺序执行下一条指令。

3.LOOPNE/LOOPNZ(不等/不为0时循环)

执行时,先CX-1,然后判断。

CX0,且ZF=0,转移。

如任一条件不满足,则顺序执行下一条指令。

过程调用及返回指令 

过程具有特定功能,且在程序中反复使用的程序段.

过程设计完成后,保存在存储器中某个固定的区域,由其他程序或过程多次调用执行。节省存储空间,简化程序设计。

CALL 指令调用过程

RET 指令从过程返回.

调用过程时,需要将断点地址保存到堆栈中

CALL指令的执行把下一条指令的地址(断点)压入堆栈(PUSH.

RET 将堆栈中保存的地址弹出到CSIP中,程序返回,继续执行CALL指令的下一条指令

1.CALL(call a procedure)子程序调用指令

CALL指令在程序转移上类似于无条件转移指令

区别在于CALL指令将断点地址(返回地址)保存入堆栈

1)Near CALL 段内直接调用

指令长度为3个字节;

1字节: 操作码

2, 3字节: 16位的偏移量

形式上类似于段内直接近转移指令,指令给出转移地址(子程序入口地址)与本指令下一条指令地址(断点地址)之间的16位相对偏移量。

将断点的偏移地址保护入堆栈。

2)Far CALL 段间直接调用

类似于段间直接转移,调用的过程与本指令不在同一个逻辑段内,可实现整个存储器范围内的程序转移.

指令长度为5个字节

First: 操作码

2, 3 bytes: 调用过程的偏移地址

4, 5 bytes: 调用过程的段基址

需保护CSIP

3)Near Indirect CALL 段内间接调用 

类似于段内间接转移,需保护IP

4)Far Indirect CALL 段间间接调用

类似于段间间接转移,需保护CSIP

2.RET( Return from procedure)子程序返回指令

段内返回,将堆栈指针寻址的16位数恢复到IP;

段间返回,将堆栈指针寻址的32位数恢复到IPCS中;

子程序调用指令成对使用,在过程中由PROC定义。

 1)Return from Near Procedure

从近过程返回

将堆栈指针寻址的16位数据(偏移地址)恢复到IP

带立即数返回,是RET指令的另一种形式

首先将偏移地址恢复到IP寄存器中,并将堆栈指针SP的内容加上指令给出的立即数pop_value

pop_value的值: 064KB

从远过程返回

Removes a 32-bits number (far return) from the stack and place it into CS and IP

近过程与远过程返回指令格式相同

区别在于近RET在近过程体内,而远RET在远过程体内

中断指令

中断指令

硬件中断: 由外部信号引起

软件中断:由指令或内部事件引起

1.矢量中断INT

N: 中断类型号

    0255

   共有256

 2.溢出中断INTO

INTO检测溢出标志OF,属于条件中断

  OF=0不执行任何操作;

 如OF=1,启动类似于中断类型号为4INT n 的中断过程。

 3.中断返回IRET

处理器控制指令

1.标志位控制指令

1)CLC     ;CF ← 0

将进位标志CF清0

2)STC     ; CF ← 1

将进位标志CF置1

3)CMC    

将进位标志CF取反

4)CLD      ; DF ← 0

将进位标志DF清0

5)STD      ; DF ← 1

将进位标志DF置1

6)CLI       ; IF ← 0

将中断标志IF清0

7)STI       ; IF ← 1

将中断标志IF置1

2.外部同步指令

用来使CPU与外部事件同步

1)暂停指令WAIT

2)交权指令ESC

3)封锁指令LOCK

4)暂停指令HLT

3.空操作指令NOP (no operation)

 

 

     

 

 

 

 

最新回复(0)