对于我的家庭作业,我应该转换这个C代码
#define UPPER 15
const int lower = 12;
int sum = 0;
int main(void) {
int i;
for (i = lower; i < UPPER; i++) {
sum += i;
}
return sum;
}
进入gcc程序集。我已经将它编译成第一次研究代码,然后单手操作(显然手工翻译看起来会有很大的不同)。这是我收到的汇编代码:
.file "upper.c"
.globl lower
.section .rodata
.align 4
.type lower, @object
.size lower, 4
lower:
.long 12
.globl sum
.bss
.align 4
.type sum, @object
.size sum, 4
sum:
.zero 4
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $12, -4(%rbp)
jmp .L2
.L3:
movl sum(%rip), %edx
movl -4(%rbp), %eax
addl %edx, %eax
movl %eax, sum(%rip)
addl $1, -4(%rbp)
.L2:
cmpl $14, -4(%rbp)
jle .L3
movl sum(%rip), %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (SUSE Linux) 4.8.1 20130909 [gcc-4_8-branch revision 202388]"
.section .note.GNU-stack,"",@progbits
现在我想知道是否有人能给我一些像
这样的例子这样的事情让我可以了解汇编代码的构造方式。谢谢!
答案 0 :(得分:2)
如果我理解你的问题,请回答:
问:构造函数i,lower,upper和sum在代码中的位置是什么?
lower
位于.rodata
部分(只读数据部分)。它的值在程序加载阶段由linux加载程序初始化为值.long 12
。 lower
构造函数是一个linux加载器。它只是从二进制映像加载lower
值。
.globl lower
.section .rodata
.align 4
.type lower, @object
.size lower, 4
lower:
.long 12
sum
位于.bss
部分内(包含静态分配变量的数据段)。它的值由_init
函数初始化,在程序执行开始时调用它。它的值为零(.zero 4
)。位于.bss
部分内的每个变量的初始值均为零(link to wiki's article for .bss)。
.globl sum
.bss
.align 4
.type sum, @object
.size sum, 4
sum:
.zero 4
upper
是常数。编译器没有将它的声明放入程序集中。此处有upper-1
(如$14
)的引用:
.L2:
cmpl $14, -4(%rbp)
i
是一个堆栈临时变量。使用相对%rbp
的地址访问它的值(%rbp
是指向当前函数堆栈帧的指针)。没有明确声明i
进入装配。 i
没有明确的堆栈保留(主要序言中没有sub $0x8,%rsp
之类的指令),我认为,因为main不会调用其他函数。以下是i
初始化的代码(注意编译器知道lower
初始值为$12
并在lower
初始化期间删除了对i
的访问权限:
movl $12, -4(%rbp)
问:其中一些表达式i = lower或i&lt; UPPER位于
i = lower
:
movl $12, -4(%rbp)
jmp .L2
i < UPPER
:
.L2:
cmpl $14, -4(%rbp)
jle .L3
i++
:
addl $1, -4(%rbp)
sum += i;
:
movl sum(%rip), %edx
movl -4(%rbp), %eax
addl %edx, %eax
movl %eax, sum(%rip)
return sum;
(%eax
寄存器用于保存函数返回值 - 有关此内容的更多信息:X86 calling conventions):
jle .L3
movl sum(%rip), %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
问:for循环开始的地方
从这里开始:
movl $12, -4(%rbp)
jmp .L2