前置C语言函数入栈
使用汇编语言编写 Linux 可执行程序
定 义 _start 标签作为程序执行的起点
通过 int 0x80 使用内核服务 (执行系统调用)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| global _start
[section .data] vstr db "I'm fengyun!", 0x0A
[section .text] _start: mov edx, 13 mov ecx, vstr mov ebx, 1 mov eax, 4 int 0x80
mov ebx, 0 mov eax, 1 int 0x80
|
1 2 3 4
| fengyun@ubuntu:~/share/os$ nasm -f elf entry.asm -o entry.o fengyun@ubuntu:~/share/os$ ld -m elf_i386 -s entry.o -o app.out fengyun@ubuntu:~/share/os$ ./app.out I'm fengyun!
|
C语言与汇编交互
global:从汇编语言中导出符号 (变量或函数)
extern:使用外部文件中定义的符号 (变量或函数)
main.c如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| extern void print(char*, int len); extern char vstr[]; extern int vlen;
int c_func() { char* delphi = "fengyun\n"; print(vstr, vlen); return 0; }
|
entry.asm如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| global _start global vstr global vlen global print
extern c_func
[section .data] vstr db "I'm fengyun!", 0x0A vlen dd $ - vstr
[section .text] _start: mov ebp, 0 call c_func call exit
print: push ebp mov ebp, esp
mov edx, [ebp + 12] mov ecx, [ebp + 8] mov ebx, 1 mov eax, 4 int 0x80
pop ebp ret
exit: mov ebx, 0 mov eax, 1 int 0x80
|
1 2 3 4 5 6
| fengyun@ubuntu:~/share/os$ nasm -f elf entry.asm -o entry.o fengyun@ubuntu:~/share/os$ gcc -m32 -c main.c -o main.o -fno-builtin-memcpy fengyun@ubuntu:~/share/os$ ld -m elf_i386 -s entry.o main.o -o app.out fengyun@ubuntu:~/share/os$ ./app.out I'm fengyun!
|