This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
programming:assembly:assembly_programming [2021/03/21 07:40] nanodano |
programming:assembly:assembly_programming [2021/03/22 02:22] (current) nanodano ↷ Page name changed from programming:assembly:home to programming:assembly:assembly_programming |
||
---|---|---|---|
Line 3: | Line 3: | ||
====== Assembly Programming ====== | ====== Assembly Programming ====== | ||
+ | Assembly is about as close as you can get to machine code. | ||
There are many Assembly compilers out there. '' | There are many Assembly compilers out there. '' | ||
Line 8: | Line 9: | ||
Use interrupt '' | Use interrupt '' | ||
- | For a list of system calls in Linux, refer to [[https:// | + | For a list of system calls in Linux, |
Here is an example of compiling with '' | Here is an example of compiling with '' | ||
Line 47: | Line 48: | ||
int 80h ; call the kernel | int 80h ; call the kernel | ||
+ | </ | ||
+ | |||
+ | Compile and run with: | ||
+ | |||
+ | <code bash> | ||
+ | # Compile | ||
+ | nasm -f elf64 hello.asm -o hello.o | ||
+ | |||
+ | # Link | ||
+ | ld hello.o -o hello | ||
+ | |||
+ | # Run | ||
+ | ./hello | ||
</ | </ | ||
===== x86 on DOS ===== | ===== x86 on DOS ===== | ||
Line 125: | Line 139: | ||
</ | </ | ||
+ | And compile and run with: | ||
+ | <code bash> | ||
+ | nasm -f elf64 c_main.asm | ||
+ | gcc c_main.o | ||
+ | ./a.out | ||
+ | </ | ||
+ | ===== Call Assembly functions from C ===== | ||
- | ===== Call C function from Assembly ===== | + | <code c example.c> |
- | + | /* example.c */ | |
- | <code c call_c.asm> | + | /* Compile |
- | // Compile with | + | |
- | // gcc call_c.c static_lib.o | + | |
- | // Automatically links the elf binary .o generated by | + | |
- | // the assembly compiler to resolve references | + | |
#include < | #include < | ||
int main(int argc, char *argv[]) { | int main(int argc, char *argv[]) { | ||
+ | extern say_hi(); | ||
+ | say_hi(); | ||
+ | } | ||
+ | </ | ||
- | // Define external from a separate library | + | Next, compile and link the C program |
- | // Defined in something.o from a compiled | + | |
- | // assembly | + | |
- | extern print_hello(); | + | |
- | // Call external assembly function | + | <code bash> |
- | print_hello(); | + | gcc example.c say_hi.o -o hello |
- | } | + | |
</ | </ | ||
- | Then compile | + | You can then run the '' |
+ | |||
+ | <code bash> | ||
+ | ./hello | ||
+ | </ | ||
+ | |||
+ | ===== Call C function from Assembly ===== | ||
+ | |||
+ | |||
+ | You can call C functions from Assembly as well. This example calls printf(). In the main function, we push and pop the stack and put our operations in between. We move all the parameters in to the appropriate registers, and then we call the function. | ||
+ | |||
+ | <code asm printf.asm> | ||
+ | ; printf.asm | ||
+ | ; Define printf as an external function | ||
+ | extern printf | ||
+ | |||
+ | SECTION .DATA | ||
+ | msg: db "Hello world", | ||
+ | fmt: db " | ||
+ | |||
+ | SECTION .TEXT | ||
+ | global main | ||
+ | |||
+ | main: | ||
+ | push rbp ; Push stack | ||
+ | |||
+ | ; Set up parameters and call the C function | ||
+ | mov rdi, | ||
+ | mov rsi, | ||
+ | mov rax,0 | ||
+ | call printf | ||
+ | |||
+ | pop rbp ; Pop stack | ||
+ | |||
+ | mov rax,0 ; Exit code 0 | ||
+ | ret ; Return | ||
+ | </ | ||
+ | |||
+ | Compile | ||
<code bash> | <code bash> | ||
Line 156: | Line 211: | ||
./a.out | ./a.out | ||
</ | </ | ||
+ | |||