【发布时间】:2014-12-24 18:29:53
【问题描述】:
我有这个我似乎无法弄清楚的课堂作业。 关键是将这个程序集转换为 C(使用 GNU 汇编器 AT&T 语法汇编的代码):
.section .rdata,"dr"
LC0:
.ascii "%d\12\0"
.text
.globl _main
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $32, %esp
movl 12(%ebp), %eax
addl $4, %eax
movl (%eax), %eax
movl %eax, (%esp)
call _atoi
movl %eax, 24(%esp)
cmpl $4, 24(%esp)
je L2
cmpl $6, 24(%esp)
jle L3
cmpl $9, 24(%esp)
jg L3
L2:
movl 24(%esp), %eax
addl $20, %eax
movl %eax, 28(%esp)
jmp L4
L3:
cmpl $0, 24(%esp)
jne L5
movl $44, 28(%esp)
jmp L4
L5:
cmpl $-1, 24(%esp)
jne L6
movl $-44, 28(%esp)
jmp L4
L6:
movl $99, 28(%esp)
L4:
movl 28(%esp), %eax
movl %eax, 4(%esp)
movl $LC0, (%esp)
call _printf
movl $0, %eax
leave
ret
但是我总是迷失在 L2 上。似乎无论我们是否进入第一个 if 语句,我们都将始终执行标签 L2,这没有任何意义。我试图理解这一切,我得到的最接近的是这段 C 代码:
#include <stdio.h>
int main(int argc, char *argv[]){
int y = 0;
int x = atoi(*++argv);
if (x != 4){
if (x > 6 && x <= 9){
y = 20 + x;
}
else if (x == 0){
y = 44;
}
else if (x == -1){
y = -44;
}
else {
y = 99;
}
}
else{
y = 20 + x;
}
printf("%d %d", y, x);
}
有人可以帮忙解决我遇到的这个令人困惑的问题吗? 谢谢
【问题讨论】:
-
我想知道为什么会有这么多反对票?这是一个非常明智的问题。 OP 提供了问题、他的部分解决方案、他迷路的描述和一个明确定义的问题。请停止仅仅因为这是家庭作业而投反对票。
-
我同意。不应该允许人们在没有给出充分理由的情况下投反对票……有些人更倾向于搁置问题,从而阻碍了正常的讨论渠道。
标签: c if-statement assembly x86 reverse-engineering