第九章 转移指令的原理

可以修改IP或者同时可以修改CS和IP的指令统称为转移指令。概括地讲,转移指令就是可以控制CPU执行内存中某处代码的指令。

8086CPU的转移指令可以分为下面几类:

  • 只是修改IP时,称为段内转移 比如:jmp ax
  • 同时修改CS和IP的,称为段间转移 比如:jmp 1000:0

由于转移指令对IP的修改范围不同,段内转移又分为:短转移和近转移

  • 短转移IP的修改范围为:-128~127
  • 近转移IP的修改范围为:-32768~32767

8086CPU的转移指令分为以下几类:

  • 无条件转移指令
  • 条件转移指令
  • 循环指令
  • 过程
  • 中断

这些转移指令的前提条件可能不同,但是它们转移的原理都是相同的,都是修改CS:IP的值来实现转移。我们在这一个章节里面主要是实现无条件转移指令jmp来理解CPU执行转移指令时候的基本原理。

9.1操作符offset

操作符offset在汇编语言中事有编译器处理的符号,它的功能是取得符号的偏移地址

assume cs:codesg
codesg segment
    start:mov ax,offset start
        s:mov ax,offset s
    codesg ends
end start

mov ax,offset start 相当于mov,ax 0

mov ax,offset s 相当于mov,ax,3

将s的段复制到s0

assume cs:codesg
codesg segment
    s:mov ax,bx
    mov si,offset s
    mov di,offset s0
    mov ax,cs:[si]
    mv cs:[di],ax
 s0:nop
    nop
codesg ends
end s

9.2jmp指令

jmp为无条件转移指令,可以只修改IP,或者同时修改CS和IP

jmp转移指令给出的两种信息:

(1)转移目的地址

(2)转移的距离

9.3根据位移进行转移的jmp指令

assume cs:codesg
codesg segment
    start:mov ax,0
            jmp short s
            add ax,1
        s:inc ax
codesg ends
end start

执行上面的代码之后,ax的值是1,跳过了add ax,1的执行。

jmp short 标号的功能为:(IP)=(IP)+8位位移。

jmp near ptr 标号的功能为:(IP)=(IP)+16位位移

9.4转移的目的地址在指令中的jmp指令

jmp far ptr 标号 实现的是段间转移,又称为远转移。

(CS)=标号所在的段地址

(IP)=标号在段中的偏移地址

assume cs:codesg
codesg segment
  start:mov ax,0
          mov bx,0
          jmp far ptr s
          db 256 dup(0)
        s:add ax,1
          inc ax
  codesg ends
  end start

9.5转移地址在寄存中的jmp指令

9.6转移地址在内存中的jmp指令

转移指令在内存中的转移有两种格式:

(1)jmp word ptr内存单元地址(段内转移)

mov ax,0123H
mod ds:[0],ax
jmp word ptr ds:[0]

(2)jmp dword ptr内存单元地址(段间转移)

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

9.7jcxz指令

jcxz为有条件转移指令,所有的有条件转移指令都是段转移,在机器代码中只是包含了转移的位移,而不是目的地址。

格式:jcxz 标号(如果(cx)=0,转移到标号处执行)

查询内存2000H段中第一个值为0字节的,将它的偏移地址存在dx

assume codesg
codesg segment
  start:mov ax,2000H
        mov ds,ax
        mov bx,0
       s:mov cl,[bx]
         mox ch,0
         inc bx
         jcxz ok
         jmp short s
       ok:mov dx,bx
         mov ax,4c00h
         int 21h
  code ends
end

9.8loop循环指令

loop指令指令为循环指令,所有的循环指令都是短转移。

共有 0 条评论

Top