KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
The latest version of gcc is producing assembly that doesn't make sense to me. I compiled the code using no optimization; but, some parts of this code don't make sense, even with no optimization. Here is the C source: #include <stdio.h> int main() { int a = 1324; int b = 5657; int difference = 9876; int printf_answer = 2221; difference = a - b; printf_answer = printf("%d + %d = %d\n", a, b, difference); return difference; } It produces this assembly: .file "exampleIML-1b.c" .section .rodata .LC0: .string "%d + %d = %d\n" .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 pushq %rbx subq $24, %rsp movl $1324, -32(%rbp) movl $5657, -28(%rbp) movl $9876, -24(%rbp) movl $2221, -20(%rbp) movl -28(%rbp), %eax movl -32(%rbp), %edx movl %edx, %ecx subl %eax, %ecx movl %ecx, %eax movl %eax, -24(%rbp) movl $.LC0, %eax movl -24(%rbp), %ecx movl -28(%rbp), %edx movl -32(%rbp), %ebx .cfi_offset 3, -24 movl %ebx, %esi movq %rax, %rdi movl $0, %eax call printf movl %eax, -20(%rbp) movl -24(%rbp), %eax addq $24, %rsp popq %rbx leave .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE0: .size main, .-main .ident "GCC: (GNU) 4.4.6 20120305 (Red Hat 4.4.6-4)" .section .note.GNU-stack,"",@progbits Several things don't make sense: (1) Why are we pushing %rbx? What is in %rbx that needs to be saved? (2) Why are we moving %edx to %ecx before subtracting? What doesn't it just do sub %eax, %edx ? (3) Similarly, why the move from %ecx back to %eax before storing the va
Tags (comma-separated)
Save Edits
Cancel