首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在汇编文件中使用C标头中的数据结构

在汇编文件中使用C标头中的数据结构
EN

Stack Overflow用户
提问于 2020-11-04 23:38:41
回答 1查看 42关注 0票数 1

我实际上正在学习汇编语言(在Linux上工作),我的问题是:我有一个包含如下链表的C头文件

代码语言:javascript
运行
复制
typedef struct s_list
{
  void *data;
  struct s_list *next;
} t_list;

我想要做的是在我的汇编.s文件中通过我想在我的C程序中使用的函数与它交互,例如在我的C程序中:

代码语言:javascript
运行
复制
void *someData = someValue;
t_list *someList = NULL;
someList = listAddBack(somelist, someData);

我可以在我的汇编文件中直接包含我的头文件吗?或者我必须在我的汇编文件中声明与struc相同的结构,然后在这里执行我的函数吗?顺便说一下,很抱歉我的英语不好,我不是以英语为母语的人。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-05 07:43:52

汇编没有像struct那样的约定,为了使用C中的结构,你必须首先知道你的C程序是如何在内存中放置结构的,由于结构的重新排序,这些结构在实现甚至编译之间可能会有很大的不同。你将不得不在Assembly中手动构造和读取你的结构。

但是,如果您只是想使用在示例中布局的结构,那么您就走运了,因为C标准规定结构的第一项始终是内存中的第一项,而且由于在该结构中只有两项,因此您可以确定下一项在哪里。

假设我们正在处理x86,并且edi是指向s_list的指针

代码语言:javascript
运行
复制
mov eax, DWORD [edi] ; eax now holds the data pointer
mov ebx, DWORD [edi + 4] ; 4 bytes is the size of a dword, which in turn is the size of all pointer types in x86, so if we look 4 bytes beyond the pointer to the `s_list` we will find the value for the pointer to next

如果你想以另一种方式思考这一点,试着看看你用C写的代码,不使用struct anywhere来写它,这会让你对它在汇编语言中是如何工作的有一个概念。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64683132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档