转移指令的原理
刚开始的时候就学了转移指令,例如 jmp bx。现在就系统的学习一下。首先转移分为短转移和近转移,短转移修改ip的范围是-128--127近转移的范围--32768--32767.这说的是段内转移的情况,而按照专一的类型又分为:无条件转移(jmp转移)条件转移指令 循环指令 中断等。
首先认识一个操作符 offset
这是一个由编译器处理的符号,它能够取得标号处的偏移地址。例如以下程序
assume cs:code
code segment
start: MOV ax,offset start
s: MOV ax,offset s
code ends
END start
code segment
start: MOV ax,offset start
s: MOV ax,offset s
code ends
END start
offset分别取得了start 和s的偏移地址 0 和3
mov ax, offset start 相当于指令mov ax, 0 start是代码段中的标号,呵呵由于offset取得的是偏移地址而不是短地址所以就是0了呗,同理解释s
jmp转移指令应用到程序中
jmp short 标号(转到标号处执行指令)由于有short这个转移是短转移,例如下面的程序。
assume cs:code
code segment
start: MOV ax,0
JMP short s
ADD ax, 1
s: INC ax
MOV ax,4c00h
int 21h
code ends
END start
code segment
start: MOV ax,0
JMP short s
ADD ax, 1
s: INC ax
MOV ax,4c00h
int 21h
code ends
END start
由debug看出我们直接执行了inc ax 而没有执行add ax,1由此可知转移成功。。其实就是改变了IP 的内容,来进行转移。
当然我们使用的jmp指令不仅能在标号处进行转移,以前我们也是用debug进行过jmp 寄存器的操作。 这就是进行-32768--32766(16)的转移了,另外我们还可以在内从中进行转移,例如下边的指令
mov ax,0123h
mov ds:[0],ax
jmp word ptr ds:[0]
我们看出了 此几条语句中我们用到了段超越前缀,单位操作符 ptr
jcxz指令有条件转移,所有的有条件转移都是短转移,指令格式 jcxz 标号
转移的条件是 cx==0档cx不为零时继续向下执行
程序举例 利用jcxz指令,实现在内存2000h段中查找第一个值为零的字节,找到后将他的偏移地址存到dx中。程序如下
assume cs:code
code segment
start : MOV ax,2000h
MOV ds,ax
MOV bx,0
MOV ch,0
s: MOV al,byte ptr [bx]
MOV cl,al
jcxz ok
INC bx
JMP short s
ok: MOV dx,bx
MOV ax, 4c00h
int 21h
code ends
END start
code segment
start : MOV ax,2000h
MOV ds,ax
MOV bx,0
MOV ch,0
s: MOV al,byte ptr [bx]
MOV cl,al
jcxz ok
INC bx
JMP short s
ok: MOV dx,bx
MOV ax, 4c00h
int 21h
code ends
END start
呵呵本课结束了,敬请期待续集,精彩内容更在 http://sela365.com/space.php?do=blog&view=me