【发布时间】:2018-07-17 13:46:11
【问题描述】:
我要将以下 AT&T x86 程序集转换为 C:
movl 8(%ebp), %edx
movl $0, %eax
movl $0, %ecx
jmp .L2
.L1
shll $1, %eax
movl %edx, %ebx
andl $1, %ebx
orl %ebx, %eax
shrl $1, %edx
addl $1, %ecx
.L2
cmpl $32, %ecx
jl .L1
leave
但必须遵守以下骨架代码:
int f(unsigned int x) {
int val = 0, i = 0;
while(________) {
val = ________________;
x = ________________;
i++;
}
return val;
}
我可以看出sn-p
.L2
cmpl $32, %ecx
jl .L1
可以解释为while(i<32)。我也知道x存储在%edx中,val存储在%eax中,i存储在%ecx中。但是,我很难将while/.L1 循环中的程序集转换为适合提供的骨架代码的浓缩高级语言。例如,shll、shrl、orl 和 andl 是否可以简单地使用它们的直接 C 等效项 (<<,>>,|,&) 编写,或者有一些更细微的差别?
是否有用于汇编到 C 转换的标准化指南/“备忘单”?
我知道汇编到高级别的转换并不总是一目了然,但汇编代码中肯定有一些模式可以一致地解释为某些 C 操作。
【问题讨论】:
-
移位不是必要'位运算符。一个公认的用法是
x<<1代表“乘以2”。 C 编译器甚至可以将显式乘以 2 的幂转换为移位。 -
This playground 可能会有所帮助。
-
@usr2564301 “位运算符”实际上是运算符
| & ^ << >> ~(及其复合赋值版本)的标准名称。无论程序如何使用它们。 -
“是否有用于汇编到 C 转换的标准化指南/“备忘单”?几乎不。通常是相反的方式。 :-)
标签: c assembly reverse-engineering att