用汇编语言定义 "variables"
Defining "variables" in assembly language
我明白这是一个非常愚蠢的问题,但我有一段时间想不出答案
如何在 GAS AT&T 汇编语言中正确声明和定义 "variables"?
例如,我想要 5 个字节的缓冲区、两个 1 字节的变量(初始值为 0)、2 字节的 0 变量和 2 字节的 10 变量。
这段代码不能正常工作,至少调试器说(在程序的第一行,在这些声明之后,只有 nop
指令)b
和 c
是大数字而不是零。
.bss
.lcomm r, 5
.data
a: .byte 0
b: .byte 0
c: .word 0
d: .word 10
这是您在 "Watches" window 中看到的内容:
a = 0 = 0x00 = 0x0000 = 0x00 0000 = 0x0000 0000
b = 167772160 = 16777216 * 10 = 0x1000000 * 0x0A = 0xA000000
c = 655360 = 65536 * 10 = 0x10000 * 0x0A = 0xA0000
d = 10 = 0x0A = 0x0000 000A
这是什么意思?这意味着您的编译器完成了它的工作,但您的调试器将 c
和 b
读取为双字(4 个字节)而不是字节。
当它读取 b
时,它读取其值 0x00
、c
的值 0x0000
和 d
的值 0x0A
在最上面,合起来就是 0xA000000
.
类似的事情发生在 c
。 a
很幸运,因为接下来的 4 个字节是零,所以 a
真的是零。
然而,情况并非总是如此。没有说 d
之后不能有任何垃圾,更不用说等于零的变量可能出现在 .bss
中(在完全不同的内存位置)。
我明白这是一个非常愚蠢的问题,但我有一段时间想不出答案
如何在 GAS AT&T 汇编语言中正确声明和定义 "variables"?
例如,我想要 5 个字节的缓冲区、两个 1 字节的变量(初始值为 0)、2 字节的 0 变量和 2 字节的 10 变量。
这段代码不能正常工作,至少调试器说(在程序的第一行,在这些声明之后,只有 nop
指令)b
和 c
是大数字而不是零。
.bss
.lcomm r, 5
.data
a: .byte 0
b: .byte 0
c: .word 0
d: .word 10
这是您在 "Watches" window 中看到的内容:
a = 0 = 0x00 = 0x0000 = 0x00 0000 = 0x0000 0000
b = 167772160 = 16777216 * 10 = 0x1000000 * 0x0A = 0xA000000
c = 655360 = 65536 * 10 = 0x10000 * 0x0A = 0xA0000
d = 10 = 0x0A = 0x0000 000A
这是什么意思?这意味着您的编译器完成了它的工作,但您的调试器将 c
和 b
读取为双字(4 个字节)而不是字节。
当它读取 b
时,它读取其值 0x00
、c
的值 0x0000
和 d
的值 0x0A
在最上面,合起来就是 0xA000000
.
类似的事情发生在 c
。 a
很幸运,因为接下来的 4 个字节是零,所以 a
真的是零。
然而,情况并非总是如此。没有说 d
之后不能有任何垃圾,更不用说等于零的变量可能出现在 .bss
中(在完全不同的内存位置)。