1、jmp指令
jmp指令后面的操作目标可以有:标号、寄存器、内存地址,具体的格式如下:
jmp short 标号
jmp near ptr 标号
jmp far ptr 标号
jmp 16位reg
jmp word ptr 内存单元地址
jmp dword ptr 内存单元地址
jmp short和near,都是段内转移。其最终汇编成的机器码中,并不会带有标号的绝对地址,而是相对位移(标号处地址 - jmp指令后第一个字节的地址),不同的是,short时,相对位移在机器指令中用8位数表示,near时是16位。
jmp far ptr 标号,是段间转移,又称远转移。执行后,(cs) = 标号所在段的段地址;(ip) = 标号所在段中的偏移地址。其汇编后的机器码形如"EA 0B 01 BD 0B",执行后,cs=0BBDh,ip=010Bh,所以,这个转移,就是转移的目的地址在指令中。
jmp 16位reg,是段内转移。执行后,(ip) = 寄存器的值。"jmp ax",在含义上好似:"mov ip, ax",当然,后一条指令是不合法的。
jmp word ptr 内存单元,是段内转移。执行后,(ip) = (内存单元地址)。
jmp dword ptr 内存单元,是段间转移。执行后,(cs) = (内存单元地址+2),(ip) = (内存单元地址)。
另外,"jmp cs:[bx]"是合法的,其相当于"jmp word ptr cs:[bx]";而"jmp cs:[100]"是不合法的,"jmp word ptr cs:[100]是合法的。所以最好还是用"jmp word ptr cs:[bx]"这种写法比较好。
2、jcxz指令
jcxz指令,为有条件转移指令,是short转移,在对应的机器码中包含8位的转移位移,而不是目的地址。
指令格式:jcxz 标号。
操作:当(cx) == 0时,(ip) = (ip) + 8位位移;当(cx) != 0时,什么也不做,程序向下执行。
"jcxz 标号"的功能,相当于:
if(cx == 0) jmp short 标号
3、loop指令
loop指令,为循环指令,是short转移,在对应的机器码中包含8位的转移位移,而不是目的地址。
指令格式:loop 标号。
操作:(1)、 (cx) = (cx) - 1
(2)、 当(cx) != 0时,(ip) = (ip) + 8位位移;当(cx) == 0时,什么也不做,程序向下执行。
"loop 标号"的功能,相当于:
cx--;
if (cx != 0) jmp short 标号
4、。。。。