gpt4 book ai didi

assembly - 了解 ATT 程序集(即时)

转载 作者:太空宇宙 更新时间:2023-11-04 02:10:25 24 4
gpt4 key购买 nike

假设我有以下 assembly 线

movl   $-1, %edi
movl $1, %edx

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

基本上,如果我要将此代码转换为 C 程序,我会将一些变量初始化为 -1 和 1,因为这是我的看法,也是我认为我感到困惑的地方。

我理解 immediate = "some constant"但这是什么意思?

最佳答案

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

  1. 立即值 - 在 AT&T 汇编程序中,它使用 $number,并将该特定值(数字)加载到寄存器中。请注意,number 不必是数值,例如,它可以是 movl $printf, %eax - 这将加载函数的地址 printf 到寄存器 eax

  2. 从另一个寄存器 movl %eax, %edx - 我们现在将 eax 值复制到 edx 中。

  3. 从固定的内存位置,movl myvar, %eax - myvar 的内容在 eax 中。

  4. 从另一个寄存器中的内存位置,movl (%eax), %edx - 现在,edx 具有该地址处的任何 32 位值在 eax 中。当然,假设它实际上是一个“好的”内存位置——如果不是,我们就会遇到段错误。

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

1)

int x = 42; 

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

2)

int x = 1;  
int y = 2;
...,
x = y; // movl %eax, %edx

3)

int x = myvar;

4)

int x = *myptr;

编辑:几乎所有作为移动指令“来源”的东西也可以作为算术运算的来源,例如 add $3, %eax 在 C 中等价于 x += 3;

关于assembly - 了解 ATT 程序集(即时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14900594/

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