关于 _asm jmp 的有关问题

关于 _asm jmp 的问题
第一种指令:_asm jmp 0x00401000
第二种指令:
_asm
{
   mov eax,0x00401000;
   jmp eax;
}


在VC6中,两种指令执行的效果为什么不一样?

------解决方案--------------------
jmp 0x00401000   →  绝对远跳转
jmp eax          →  绝对间接近跳转

近跳转与短跳转。执行近跳转时,处理器跳转到目标操作数指定的地址(在当前代码段内)。目标操作数指定绝对偏
移量(相对于代码段基址的偏移量)或相对偏移量(相对于 EIP 寄存器中指令指针当前值的有符号位移量)。跳转
到 8 位相对偏移量 (rel8) 的近跳转称为短跳转。执行近跳转或短跳转时,CS 寄存器保持不变。

绝对偏移量在通用寄存器或内存位置(r/m16 或 r/m32)中间接指定。操作数大小属性确定目标操作数的大小(16
 位或 32 位)。绝对偏移量直接加载到 EIP 寄存器。如果操作数大小属性是 16,则 EIP 寄存器的两个高位字
节清除为零,得到大小最大为 16 位的指令指针。

在汇编代码中,相对偏移量(rel8、rel16 或 rel32)通常指定为标签,但是在机器代码级别,它的编码形式是
有符号的 8 位、16 位或 32 位立即数。此值会加到 EIP 寄存器中的值上。(这里,EIP 寄存器包含 JMP 指令
的后一条指令的地址)。使用相对偏移量时,操作码(对于短跳转与近跳转)与操作数大小属性(对于相对近跳转)
确定目标操作数的大小(8 位、16 位或 32 位)。