在 x86 架构,ljmp 指令用于执行远跳转,该指令的操作数是一个远指针,由一个16位的段选择器和一个16位的偏移量组成,因此实模式下ljmp 指令的字节码长度是5个字节
。
- 1个字节:操作码(opcode),对于 ljmp 指令,操作码是 EA
- 第2个和第3个字节:16位的偏移量(offset),在内存中以小端序存储
- 第4个和第5个字节:16位的段选择器(segment selector),在内存中也以小端序存储。
然而,与16位实模式不同的是,在32位模式下,偏移量是32位的,而段选择器仍然是16位的。因此,在32位模式下,ljmp 指令的字节码长度是7个字节。
对于指令 ljmp $0x3630,$0xf000e05b
,其字节码表示如下:
EA 5B E0 00 F0 30 36
在32位保护模式下,跳转后 IP=0xF000E05B, CS=0x3630 ;
但是BIOS是运行在实模式下的,只读取了五个字节
IP= E05B,CS=0xF000,最终地址为CS:IP=0xFE05B