当前位置:编程学习 > 网站相关 >>

x86汇编学习 ----- 八

 

转移指令大总结

1、概念:可以修改IP或者同时修改CS和IP的指令就称为转移指令。其作用就是控制CPU执行内存中某处代码指令

2、简单分类

     (1)、只修改IP的称为段内转移,由于转移指令对IP修改范围不同又将段内转移分为短转移和近转移。

           a、短转移修改8位位移。-128~127        [-2^7~2^7-1] 如jmp short 标号。

           b、近转移修改16位位移。-32768~32767   [-2^15~2^15-1]如jmp near ptr 标号

     (2)、同时修改CS和IP的称为段间转移

3、各种转移指令比较详细的解析。

      (1)、jmp short 标号===========转移到标号处执行指令。

            但是他的机器码并不是直接指向标号处的地址,而是标号处地址偏移量与该跳转指令的后一条指令的地址偏移量 的

            差--补码表示至于原因嘛,先说下CPU执行指令的过程。首先从CS:IP指向的单元内存中取出指令。读取的指令进入

           指令缓冲器。然 后(IP)=(IP)+指令长度,指向下一条指令,最后执行指令,然后循环这个过程。所以标号处指令的偏

            移量与转指令下一条指令偏移量的差。该条指令所能改变的偏移量是8位位移量,

      (2)、jmp near ptr 标号===============转移到标号处执行指令

           该指令和jmp short 标号 指令几乎完全一样,他们的转移原理以及作用是一样的,只是这条指令所能改变

            的偏移范围是16位偏移量。

     (3)、jmp far ptr 标号========转到标号处执行指令

            这条指令和jmp near ptr 标号指令也很像,这条指令是段间转移指令,也称为远转移指令。其实现的功能是

            (CS)=标号所在段的段地址,(IP)是标号所在段的偏移量,该条指令有5个字节。后面的四个字节就是指的CS

            和IP比如其机器码是EA 0B01 BD0B(小端法表示的机器),那么后四个字节的高字节是转移的段地址此时(CS)=0BBD

             而低字节是IP,那么此时(IP)=010B

     (4)、jmp reg(16位)

            这条指令就是将16位寄存器中得数值当做IP来用,而CS不变。

     (5)、jmp word ptr 内存单元地址

              这条指令也是段内转移指令。其是将内存单元地址处一个字作为目的偏移地址,内存单元地址可以使用任意寻址

             方式的任意格式给出。如

 

 

 

mov ax,0123h 

mov ds:[0],ax 

jmp word ptr ds:[0] 

                  执行后(IP)=0123h

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

             其作用是从所指的内存单元处去两个字,高地址处数据作为转移目的段地址,低地址处数据作为目的偏移地址。

             也就是(CS)=(内存地址单元+2)

             (IP)=(内存地址单元)

               比如以下指令

 

 

mov ax,0123h 

mov ds:[0],ax 

mov word ptr ds:[2],0 

jmp dword ptr ds:[0] 

              那么执行后

             (CS)=0000

            (IP)=0123h

            也就是目的是CS:IP=0000:0123

    (7)jcxz 标号 指令

          这条指令是一个条件转移指令,它是当(cx)=0时跳转到标号处,其转移在8位偏移量以内

    (8)loop 标号 循环指令

        这条指令和jcxz相反,loop是当(cx)!=0时跳转到标号处,但是loop也有特殊之处,

        每次执行loop S时会先进行dec cx(cx自减一)然后在进行判断, 其也只能转移在8位偏移量以内。

        好吧,写了这么多下面分析一个奇怪的程序

 

assume cs:code 

code 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 

code ends 

end start 

这个程序是否能够正常返回

答案是能的,大家一定觉得很奇怪吧,下面呢我就分析一下

这个程序中要懂得jmp short 标号 这个指令的跳转原理

首选先把它的可执行文件反汇编下,以确定每条指令的大小

 

-r 

AX=0000  BX=0000  CX=0023  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000 

DS=144F  ES=144F  SS=145F  CS=145F  IP=0005   NV UP EI PL NZ NA PO NC 

145F:0005 B80000        MOV     AX,0000 

-u 145f:0 

145F:0000 B8004C        MOV     AX,4C00 

145F:0003 CD21          INT     21 

145F:0005 B80000        MOV     AX,0000 

145F:0008 90            NOP 

145F:0009 90            NOP 

145F:000A BF0800        MOV     DI,0008 

145F:000D BE2000        MOV     SI,0020 

145F:0010 2E            CS: 

145F:0011 8B04          MOV     AX,[SI] 

145F:0013 2E            CS: 

145F:0014 8905          MOV     [DI],AX 

145F:0016 EBF0          JMP     0008 

145F:0018 B80000        MOV     AX,0000 

145F:001B CD21          INT     21 

145F:0

补充:综合编程 , 其他综合 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,