gpt4 book ai didi

c - 如何将数据保存在已知内存位置一次以便在 x86 程序集中多次重用?

转载 作者:行者123 更新时间:2023-11-30 14:47:57 26 4
gpt4 key购买 nike

我正在编写一个 intel x86 汇编程序来使用日志表计算对数。我在c程序中调用汇编函数。我不想每次调用时都将日志表中的所有值移动到内存中。我是在非模拟处理器上进行组装的新手,所以我什至不确定可以将其存储在哪里。 20,000 个 32 位整数。

如何在 C 程序开始时存储“大量”数据,以便我可以在汇编例程中访问它?如果我把它放在 .data 部分,每次我调用实际函数时它都会移动到内存吗?

编辑:这就是我调用该函数的方式

#include <stdio.h>
extern int doIt(float) asm("doIt");
int main(){
printf("%d\n", doIt(7.0));
printf("%d\n", doIt(4.0));
... //more calls of the sort
}

不确定c代码是否完全正确。在 doIt 中,我需要重复访问提到的表。

最佳答案

给出答案:

#include <stdint.h>

const int32_t table[10]; /* .rodata */

int32_t table[10]; /* .bss */

/*
* However, if you initialize with any (nonzero) values
* it goes to:
*/

int32_t table[10]={
0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000,0xaaaaaaaa
}; /* .data */

const int32_t table[10]={
0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000,0xaaaaaaaa
}; /* .rodata */

关于这些部分:.data.rodata存储在目标文件中,除非需要,否则可能不会加载到RAM中使用它们,或同一页面中包含的任何内容 -也许您可以使用链接描述文件更改此行为,我不知道-,并且 .bss 部分不会实际上存储任何数据,这就是为什么一旦初始化变量,它就会移动到 .data 并将其图像存储到目标文件中。大多数编译器会忽略初始化为零,因为 .bss 变量没有将其图像存储到目标文件中,因此加载程序在加载程序时无论如何都会将其空间填充为零。

然后,当您编译该对象时,您可以从 ASM 例程导入符号名称。

关于c - 如何将数据保存在已知内存位置一次以便在 x86 程序集中多次重用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50866731/

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