我同意Unwind先生的回答,但在某种程度上,这种方式可能对您有所帮助:
文件名x.c:
int main(){
register int i=0;
i++;
printf("%d",i);
}
Run Code Online (Sandbox Code Playgroud)
汇编代码:
~$ gcc x.c -S
Run Code Online (Sandbox Code Playgroud)
输出文件名是x.s.
在我的情况下使用ebx寄存器,这可能在不同的编译时间有所不同.
~$ cat x.s
.file "x.c"
.section .rodata
.LC0:
.string "%d"
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
pushl %ebx
subl $28, %esp
movl $0, %ebx
addl $1, %ebx // because i++
movl $.LC0, %eax
movl %ebx, 4(%esp)
movl %eax, (%esp)
call printf
addl $28, %esp
popl %ebx
movl %ebp, %esp
popl %ebp
ret
Run Code Online (Sandbox Code Playgroud)
您还可以使用以下命令反汇编可执行文件objdunp:
$ gcc x.c -o x
$ objdump x -d
Run Code Online (Sandbox Code Playgroud)
使用objdump命令输出部分程序集:
080483c4 <main>:
80483c4: 55 push %ebp
80483c5: 89 e5 mov %esp,%ebp
80483c7: 83 e4 f0 and $0xfffffff0,%esp
80483ca: 53 push %ebx
80483cb: 83 ec 1c sub $0x1c,%esp
80483ce: bb 00 00 00 00 mov $0x0,%ebx
80483d3: 83 c3 01 add $0x1,%ebx //due to i++
80483d6: b8 b0 84 04 08 mov $0x80484b0,%eax
80483db: 89 5c 24 04 mov %ebx,0x4(%esp)
80483df: 89 04 24 mov %eax,(%esp)
80483e2: e8 0d ff ff ff call 80482f4 <printf@plt>
80483e7: 83 c4 1c add $0x1c,%esp
80483ea: 5b pop %ebx
80483eb: 89 ec mov %ebp,%esp
80483ed: 5d pop %ebp
80483ee: c3 ret
80483ef: 90 nop
Run Code Online (Sandbox Code Playgroud)
%ebx 寄存器保留为寄存器变量.