【发布时间】:2013-07-22 17:56:39
【问题描述】:
我是一名学生,刚开始学习汇编语言。为了更好地理解它,我只是用 C 写了一个简短的并将其转换为汇编语言。没想到有点看不懂。
代码是:
#include<stdio.h>
int main()
{
int n;
n=4;
printf("%d",n);
return 0;
}
而对应的汇编语言是:
.file "delta.c"
.section .rodata
.LC0:
.string "%d"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
andl $-16, %esp
subl $32, %esp
movl $4, 28(%esp)
movl $.LC0, %eax
movl 28(%esp), %edx
movl %edx, 4(%esp)
movl %eax, (%esp)
call printf
movl $0, %eax
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
.section .note.GNU-stack,"",@progbits
这些是什么意思?
【问题讨论】:
-
哪一部分给你带来了麻烦?我们无法解释每一行,如果你处于那个水平,你需要从阅读一本书开始,而不是直接跳入难以理解的东西。告诉我们您了解哪些部分以及您不了解哪些部分。
-
您的示例中有几个主要概念在逐行解释指令的过程中会丢失。如果您对组装说明知之甚少或根本不了解,您应该从基础开始获取一本书或一些在线资料。一旦您熟悉了指令的工作原理,就可以涵盖管理堆栈帧、寄存器/内存和函数调用约定等更大的概念。
-
其实我对汇编语言了解不多,只知道一些mov,add之类的。我最好选择你的意见。
-
可能只是堆栈帧操作的东西让你难过。从 movl $4, 28(%esp) 开始,它应该看起来很熟悉(与源代码比较时)。
-
您可以通过以下命令获得一个显示组合 C 和汇编语言的列表文件:
gcc -c -g -Wa,-a,-ad [other GCC options] foo.c > foo.lst组合列表将在 foo.lst 中。 Source