Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly x86中的单词大小混乱_Assembly_X86_Gdb - Fatal编程技术网

Assembly x86中的单词大小混乱

Assembly x86中的单词大小混乱,assembly,x86,gdb,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-($-$$)

我在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个字节。它不应该总是打印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
因此,在给定地址处,您可以看到字节(以及未打印高零字节的值):


谢谢……但既然我们在实模式下,x86的字大小不应该是16位吗?@sarthak,显然不是:-)我不确定实模式决定了
gcc
中整数的大小,而
p/x
命令只会“将值的位视为整数,并以十六进制打印整数”。如果
gdb
有一个类型可以使用,也许它可以找到它,但是
*0x7c1e
没有像
*myvar
那样的类型。这是我的猜测。
7c1b: eb fe 20 58 (5820feeb)
7c1d: 20 58 20 00 (  205820)
7c1e: 58 20 00 00 (    2058)