GCC 2022
x86-64 assembly, compilation, basic instructions
Ghidra | Binary Ninja | IDA | |
---|---|---|---|
Free? | Yes! | Free-ish | No/Yes |
Decompiler? | Yes! | Kinda | Yes/No |
*NSA backdoor? | Yes! | Hopefully not |
helloworld.c
#include <stdio.h>
int main(){
puts("Hello World!");
return 0;
}
push
push <op>
mov rax, 0x100
mov rbx, 0x200
push rax
push rbx
pop
pop <dst>
mov rax, 0x100
mov rbx, 0x200
push rax
push rbx
pop rcx
pop rdx
push/pop
functions
nested functions
int foo(int a, int b){
puts("Inside function (foo)");
return a + b;
}
int foo(...){
...
return a + b;
}
The return value is stored in the rax register, or if it is a 128-bit value, then the higher 64-bits go in rdx.
int foo(){
return 1000;
}
foo:
push rbp
mov rbp, rsp
mov eax, 1000
pop rbp
ret
int foo(int a, int b, ...){
...
}
Parameters to functions are passed in the registers rdi, rsi, rdx, rcx, r8, r9, and further values are passed on the stack in reverse order.
int main() {
foo(1,2,3,4,5);
}
int foo(int a, int b, int c, int d, int e){
return 1;
}
main:
push rbp
mov rbp, rsp
mov r8d, 5
mov ecx, 4
mov edx, 3
mov esi, 2
mov edi, 1
mov eax, 0
call foo
mov eax, 0
pop rbp
ret
foo:
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-4], edi
mov DWORD PTR [rbp-8], esi
mov DWORD PTR [rbp-12], edx
mov DWORD PTR [rbp-16], ecx
mov DWORD PTR [rbp-20], r8d
mov eax, 1
pop rbp
ret
main()
STATIC int LIBC_START_MAIN (int (*main) (int, char **, char **
MAIN_AUXVEC_DECL),
int argc,
char **argv,
...
);