首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >了解ATT程序集(立即)

了解ATT程序集(立即)
EN

Stack Overflow用户
提问于 2013-02-16 01:58:54
回答 1查看 1.4K关注 0票数 1

假设我有以下装配线

代码语言:javascript
运行
复制
movl   $-1, %edi
movl   $1, %edx

我到底在%edi/%edx寄存器中存储了什么内容。

基本上,如果我把这段代码转换成C程序,我会不会把一些变量初始化为-1和1,因为这就是我看到它的方式,这也是我感到困惑的地方。

我理解immediate =“一些常量”,但这是什么意思呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-16 02:21:32

有四种方法可以将某些内容加载到寄存器中:

  1. Immediate value -在AT&T汇编程序中,它使用$number,并将特定的值(数字)加载到寄存器中。请注意,number不必是数字值,例如,可以是movl $printf, %eax -这会将函数printf的地址加载到寄存器eax中。来自另一个寄存器movl %eax, %edx
  2. -我们现在将eax值复制到edx中。从固定内存位置movl myvar, %eax执行
  3. - myvar的内容在eax中。从另一个寄存器中的内存位置
  4. -现在,edxeax中的地址处具有任何32位值。当然,假设它实际上是一个“好”的内存位置--如果不是,我们就有了一个段错误。

如果这是C代码,代码可能看起来有点像这样:

1)

代码语言:javascript
运行
复制
int x = 42; 

int (*printfunc)(const char *fmt, ...) = printf;

2)

代码语言:javascript
运行
复制
int x = 1;  
int y = 2; 
..., 
x = y;     // movl  %eax, %edx

3)

代码语言:javascript
运行
复制
int x = myvar;

4)

代码语言:javascript
运行
复制
int x = *myptr;

编辑:几乎所有作为move指令的“源”的东西都可以作为算术运算的源,比如add $3, %eax将等同于x += 3;的C语言。

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

https://stackoverflow.com/questions/14900594

复制
相关文章

相似问题

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