c - 将带有指针的简短 ASM 片段翻译成 C 代码
问题描述
这是一个与家庭作业相关的问题;我不是在寻找确切的答案,而是更多关于如何解决我的问题的指示。
简而言之,我的任务是将下面的 ASM 片段翻译成 C 代码:
fct:
movl 4(%esp), %edx ;L1
movl (%edx), %ebx ;L2
movl 4(%edx), %eax ;L3
addl %ebx,%eax ;L4
ret ;L5
fct
首先,我知道正确的签名是int fct(int *a)
。接下来,这里简要描述一下我认为每一行的作用:
fct
L1:将(我将称之为)的第一个参数的值arg
放入寄存器edx
,- L2:将寄存器指向的地址的值
edx
放入寄存器ebx
(即arg[0]
), - L3:将地址“寄存器指向的地址
edx
+4字节”处的值放入寄存器eax
(即arg[4]
), - L4:将值'寄存器中的值
eax
+寄存器中的值ebx
'放入寄存器eax
(即arg[4] + arg[0]
), - L5:返回寄存器中的值
eax
(即arg[4] + arg[0]
)。
其中,翻译成一些伪 C-ish 代码看起来像这样:
fct(*arg) {
d = arg
b = *d
a = *(d + 4)
a = a + b
return a
}
最后,这是我想出的 C 代码;我尝试对其进行格式化和编写,使其尽可能接近原始程序集。
int fct(int *arg) {
int *d = arg;
int b = *d;
int a = *(d + 0x4);
a += b;
return z;
}
我花了一个小时试图让它工作,但我的代码只适用于它应该通过的五个自动化测试之一(我无权访问)。任何帮助将非常感激。
解决方案
C 指针算术以指向的类型为单位,而不是字节。因此,由于int
x86-32 上是 4 个字节,所以您想要d+1
,而不是d+0x4
.
推荐阅读
- google-bigquery - BigQuery 插入更新嵌套字段
- c# - 用于 Unity 网络错误的 Fabric 问题
- clearcase - 用于获取目录中文件版本的清除工具命令(清除大小写)
- r - 如何在 Shiny R 中创建 highcharter 事件函数以创建“下拉函数”
- android - 我在生成发布 apk 时遇到问题我收到 AAPT 错误
- unity3d - 如何为我的 Mac OS 解决 Unity Shader Graph 2018.2 中的问题
- angular - 我无法理解语法:(
组件引用实例) - php - Codeigniter 加入命中
- angular - 为什么 .map 运算符在没有 .pipe (Angular + Angularfire2/auth) 的情况下无法工作?
- math.net - 拟合多项式显示函数