在Unix 和 Linux 系统中,汇编语言格式采用的较多的是 AT&T 格式。
C程序:
int g(int x)
{
return x + 27;
}
int f(int x)
{
return g(x);
}
int main(void)
{
return f(2016) + 2;
}
在Ubuntu 14.04 上汇编结果:
.file"main.c"
.text
.globlg
.typeg, @function
g:
.LFB0:
.cfi_startproc
pushq%rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq%rsp, %rbp
.cfi_def_cfa_register 6
movl%edi, -4(%rbp)
movl-4(%rbp), %eax
addl$27, %eax
popq%rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.sizeg, .-g
.globlf
.typef, @function
f:
.LFB1:
.cfi_startproc
pushq%rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq%rsp, %rbp
.cfi_def_cfa_register 6
subq$8, %rsp
movl%edi, -4(%rbp)
movl-4(%rbp), %eax
movl%eax, %edi
callg
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE1:
.sizef, .-f
.globlmain
.typemain, @function
main:
.LFB2:
.cfi_startproc
pushq%rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq%rsp, %rbp
.cfi_def_cfa_register 6
movl$2016, %edi
callf
addl$2, %eax
popq%rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE2:
.sizemain, .-main
.ident"GCC: (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4"
.section.note.GNU-stack,"",@progbits
去掉用于链接和版本信息后的计算机会执行的汇编代码:
g:
pushq%rbp
movq%rsp, %rbp
movl%edi, -4(%rbp)
movl-4(%rbp), %eax
addl$27, %eax
popq%rbp
ret
f:
pushq%rbp
movq%rsp, %rbp
subq$8, %rsp
movl%edi, -4(%rbp)
movl-4(%rbp), %eax
movl%eax, %edi
callg
leave
ret
main:
pushq%rbp
movq%rsp, %rbp
movl$2016, %edi
callf
addl$2, %eax
popq%rbp
ret
实验截图:
作者:冯峰
原创作品转载请注明出处