说明
本文为b站从零开发操作系统的实验
main.asm 入口
extern myfun;
[section .data]
num1 dd 39
num2 dd 44
[section .text]
global _start;_start符号成为可见的标识符,这样链接器就知道跳转到程序中的什么地方并开始执行程序。
global myprint;
_start:
push num2;堆栈传参数
push num1;堆栈传参数
call myfun;调用堆栈
add esp,8;用来平衡堆栈 push num2 ,push num1
mov ebx,0
mov eax,1;exit的功能号为4
int 0x80;调用eax中的系统中断
myprint:
mov edx,[esp+8];edx buffer长度
mov ecx,[esp+4];ecx buff地址 call myfun 函数内部先会push ebp;objdump -S myfun.o 可以查看
mov ebx,1;ebx为文件描述符,stdout的文件描述符为1
mov eax,4;write(_NR_write)功能号为4
int 0x80;调用中断
ret
nasm -f elf32 -o main.o main.asm
myfun.c
void myprint(char *msg,int len);
int myfun(int a,int b)
{
if(a>b)
{
myprint("a is big\n",9);
}else
{
myprint("b is big\n",9);
}
return 0;
}
gcc -o myfun.o -c myfun.c -m32
链接
ld -m elf_i386 -s -o run myfun.o main.o
./run #b is big