【发布时间】:2015-11-04 11:49:27
【问题描述】:
我在 Assembler 中声明了一个整数,我在 C 中以下列方式使用它:
asm(
"number: \n"
".long 0xFFFFFFFF \n
);
extern int number;
int main(){
//do something with number
}
现在我想在 Assembler 中声明一个 32 字节的数组。我尝试了以下方法:
asm(
"number: \n"
".long 0xFFFFFFFF \n"
".long 0xFFFFFFFF \n"
".long 0xFFFFFFFF \n"
".long 0xFFFFFFFF \n"
".long 0xFFFFFFFF \n"
".long 0xFFFFFFFF \n"
".long 0xFFFFFFFF \n"
".long 0xFFFFFFFF \n"
);
extern unsigned char* number;
int main() {
printf("%x ", number[0]); //gives segmentation fault
}
我不太了解 Assembler,但我必须使用这个特定的变量。
【问题讨论】:
-
声明是不够的。您需要定义它。并且:你不能在 Assembler 中定义一个 integer;汇编程序没有数据类型的概念。如果那将是 32 位数据,您是否在 C 代码中将其声明为
char? (而且“我必须使用……有人用枪指着你?) -
您为什么认为
unsigned char *是对的?这对我来说毫无意义,根本。也许是extern int number[8];,但我真的很紧张。 -
如果你声明
unsigned char *number,那意味着number处的值代表了一个地址或一个指针。在这种情况下,该地址或指针是0xFFFFFFFF。然后,当您将其取消引用为number[0]时,您正在尝试引用地址0xFFFFFFFF中的任何内容,这是无效的。尝试"number: my_array\n"后跟"my_array:\n" prefacing your list of.long` 值。或者试试@unwind 建议的方法。 -
您想要 32 个 byte 值还是 32 个 bit 值?
-
@Linus,32 字节。根据 unwind 的评论,我将其声明为 extern unsigned char number[32]。
标签: c gcc assembly x86 inline-assembly