x86中的Word大小混乱

时间:2015-02-08 09:35:16

标签: assembly x86 gdb

我在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
$5 = 0x2058
(gdb) p/x *0x7c1b
$6 = 0x5820feeb
(gdb) p/x *0x7c1d
$7 = 0x205820

有时它会产生2个字节,有时是4个字节或3个字节。它不应该总是打印2bytes,这是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

1 个答案:

答案 0 :(得分:2)

实际上每次都有四个字节,只是如果高位字节为零,它就不会在输出中显示它们,原因与你不会将7写为00000007的原因相同。

例如,在打印出64 10 的双字节值时,您会看到0x40。如果双字节值为12345 10 ,则会看到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)