gpt4 book ai didi

c - C 代码中的 Asm 变量

转载 作者:太空狗 更新时间:2023-10-29 15:35:07 27 4
gpt4 key购买 nike

我正在阅读 John Viega 的 C 和 C++ 安全编程指南。有一个代码片段,我需要一些帮助才能理解:

asm(".long 0xCEFAEDFE \n"
"crc32_stored: \n"
".long 0xFFFFFFFF \n"
".long 0xCEFAEDFE \n"
);

int main(){
//crc32_stored used here as a variable
}

这些行到底是什么意思:"crc32_stored:\n", ".long 0xFFFFFFFF\n"?这是变量定义和初始化吗?

尝试编译书中的代码时出现以下错误:

error: ‘crc32_stored’ undeclared (first use in this function)

最佳答案

crc32_stored: 只是一个标签,在汇编程序中只是一个内存地址的别名。由于标签本身不占用目标代码中的任何空间,crc32_stored 表示的地址是 .long 0xFFFFFFFF 的地址,它组装成四个 FF 字节。在目标代码中,标签将显示为一个符号,这意味着几乎相同的东西(只是地址的别名)。

在 C 中,变量(在某种程度上)是表达同一事物的另一种方式:引用内存中特定地址的名称,但它具有额外的类型信息,即 intlong。您可以使用 int crc32_stored = 0xFFFFFFFF; 在 C 中创建一个变量(减去类型信息)等同于程序集 crc32_stored: .long 0xFFFFFFFF,但这会创建一个不同的另一个地址的别名。

您可以告诉 C 编译器不要为名称“crc32_stored”保留新地址,而只创建别名部分,然后将其与同名符号的地址耦合。这是通过使用“extern”存储类说明符的声明完成的,如 extern int crc32_stored。通过这个,您“ promise ”稍后链接到另一个将具有此符号的目标文件。

显然,您必须自己注意 C 类型信息是否与汇编代码的意图相匹配(即给定地址处有 4 个字节应被解释为带符号的 32 位整数)。

附录:如果没有额外的声明,符号在 C 代码中是不可见的,因为汇编程序部分是单独处理的。由于缺少类型信息,无法将符号自动导出为 C 代码。 (程序集标签甚至不包含有关它是指向数据还是代码的信息。)

关于c - C 代码中的 Asm 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33415463/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com