首页 > 代码库 > 汇编语言笔记 转移指令的原理

汇编语言笔记 转移指令的原理

?8086CPU转移指令分类

  • 无条件转移指令(如:jmp)
  • 条件转移指令
  • 循环指令(如:loop)
  • 过程
  • 中断

   

?操作符offset

offset在汇编语言中是由汇编器处理的符号,它的功能是取标号的偏移地址。

   

?jmp指令

类型

功能

示例

jmp short 标号

(段内短转移)

assume cs:codecode segmentstart: mov ax, 0    jmp short s    add ax, 1s:    inc axcode endsend start

jmp near ptr 标号

(段内近转移)

  

jmp far ptr 标号

(段间转移)

assume cs:codecode segmentstart: mov ax, 0    mov bx, 0    jmp far ptr s    db 256 dup (0)code endsend start

jmp 16位reg

(段内转移)

设置:(IP)=(16位reg)

编译器根据情况判断段内short/near转移

  

jmp word ptr 内存单元地址

(段内转移)

mov ax, 0123Hmov ds:[0], axjmp word ptr ds:[0]

jmp dword ptr 内存单元地址

(段间转移)

mov ax, 0123Hmov ds:[0], axmov word ptr ds:[2], 0jmp dword ptr ds:[0]

jmp 2000:0100

(段间转移)

   

  • 举例说明:

   

?条件转移指令和循环指令

所有的有条件转移指令和循环指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址,而不是目的地址。对IP的修改范围都为:-128~127。

类型

功能

jcxz

(条件转移指令)

loop

(循环指令)

  

   

?根据位移进行转移的指令

1 jmp short 标号2 jmp near ptr 标号3 jcxz 标号4 loop 标号

等几种汇编指令,它们对IP的修改是根据转移目的地址和转移起始地址之间的位移(补码)来进行的,而不是在对应的机器码包含转移的目的地址。

分析一个奇怪的程序:

 1 assume cs: codesg 2  3 codesg segment 4         mov ax, 4c00h 5         int 21h 6              7 start:     8         mov ax, 0 9 s:      nop  ;jmp short s110         nop11             12         mov di, offset s13         mov si, offset s214         mov ax, cs:[si]15         mov cs:[di], ax16             17 s0:     jmp short s18         19 s1:     mov ax, 020         int 21h21         mov ax, 022             23 s2:     jmp short s124         nop25 26 codesg ends27 28 end start 

通过debug查看汇编指令,就可以知道这个程序为什么可以正常退出啦

汇编语言笔记 转移指令的原理