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
补充:综合编程 , 其他综合 ,