原文地址: http://www.cnblogs.com/dennisOne
☞8086CPU转移指令分类
- 无条件转移指令(如:jmp)
- 条件转移指令
- 循环指令(如:loop)
- 过程
- 中断
☞操作符offset
offset在汇编语言中是由汇编器处理的符号,它的功能是取标号的偏移地址。
☞jmp指令
类型 |
功能 |
示例 |
jmp short 标号 (段内短转移) |
assume cs:code code segment start: mov ax, 0 jmp short s add ax, 1 s: inc ax code ends end start |
|
jmp near ptr 标号 (段内近转移) |
|
|
jmp far ptr 标号 (段间转移) |
assume cs:code code segment start: mov ax, 0 mov bx, 0 jmp far ptr s db 256 dup (0) code ends end start |
|
jmp 16位reg (段内转移) |
设置:(IP)=(16位reg) 编译器根据情况判断段内short/near转移 |
|
jmp word ptr 内存单元地址 (段内转移) |
mov ax, 0123H mov ds:[0], ax jmp word ptr ds:[0] |
|
jmp dword ptr 内存单元地址 (段间转移) |
mov ax, 0123H mov ds:[0], ax mov word ptr ds:[2], 0 jmp 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 s1 10 nop 11 12 mov di, offset s 13 mov si, offset s2 14 mov ax, cs:[si] 15 mov cs:[di], ax 16 17 s0: jmp short s 18 19 s1: mov ax, 0 20 int 21h 21 mov ax, 0 22 23 s2: jmp short s1 24 nop 25 26 codesg ends 27 28 end start
通过debug查看汇编指令,就可以知道这个程序为什么可以正常退出啦