x86 中的字长混乱

Confusion in Word Size in x86

我在 x86 程序集中有以下代码,它试图在屏幕上打印 X:

mov ah , 0x0e
mov al , the_secret
int 0x10 
mov al , [the_secret]
int 0x10 
mov bx , the_secret
add bx , 0x7c00
mov al , [bx]
int 0x10 
mov al , [0x7c1e]
int 0x10 
jmp $ ; Jump forever.
the_secret :
db " X "
times 510-($-$$) db 0
dw 0xaa55

当我在GDB中检查上面的代码时,我发现jmp $命令存储在地址0x7c1b中。但是 GDB 在不同的地址显示不同的数据大小。例如:

(gdb) p/x *0x7c1e
 = 0x2058
(gdb) p/x *0x7c1b
 = 0x5820feeb
(gdb) p/x *0x7c1d
 = 0x205820

有时它给出2个字节有时4个字节或3个字节。它不应该总是打印 2 个字节,这是 x86 中的字长(因为我处于实模式)。为什么在这些地址显示不同大小的数据?
我还展示了在组装上述汇编代码后创建的十六进制转储:

7c00: b4 0e b0 1d cd 10 a0 1d 00 cd 10 bb 1d 00 81 c3
7c10: 00 7c 8a 07 cd 10 a0 1e 7c cd 10 eb fe 20 58 20
7c20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

它实际上每次都得到四个字节,只是,如果高位字节为零,它不会在输出中显示它们,出于同样的原因,你不会把七个写成 00000007.

例如,在打印出 6410 的两个字节值时,您会看到 0x40。如果两个字节的值是 1234510,您会看到 0x3039.

从您的十六进制转储中,您可以看到以下序列:

7c1b: eb fe 20 58 20 00 00

因此,在给定的地址,您会看到字节(以及未打印高位零字节的值):

7c1b: eb fe 20 58 (5820feeb)
7c1d: 20 58 20 00 (  205820)
7c1e: 58 20 00 00 (    2058)