前置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:从汇编语言中导出符号 (变量或函数)

image-20220617212630013

extern:使用外部文件中定义的符号 (变量或函数)

image-20220617212640071

image-20220617212959715

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!