cdecl
(1)调用者将所有参数从右向左入栈。
(2)调用者清理参数所占的栈空间。
当输入的参数小于等于5个时
传入参数的顺序:
1.ebx存储第一个参数
2.ecx存储第二个参数
3.edx存储第三个参数
4.esi存储第四个参数
5.edi存储第五个参数
section .data
str_c_lib: db "c library says : hello world!",0xa ;0xa为LF ascll码
str_c_lib_len equ $-str_c_lib
str_syscall:db "syscall says :hello wrold",0xa
str_syscall_len equ $-str_syscall
section .text
global _start
_start:
;模拟c语言中系统调用库函数write
;方式1
push str_c_lib_len
push str_c_lib
push 1
call simu_write
add esp,12
;方式2 跨过库函数,直接进行系统调用
mov eax,4
mov ebx,1
mov ecx,str_syscall
mov edx,str_syscall_len
int 0x80
;退出程序
mov eax,1 ; 第一号功能是exit
int 0x80
;
simu_write:
push ebp
mov ebp,esp
mov eax,4
mov ebx,[ebp+8] ; 第一个参数
mov ecx,[ebp+12] ; 第二个参数
mov edx,[ebp+16] ; 第三个参数
int 0x80
pop ebp
ret
可能出现的问题
链接的时候可能出现的问题
ld: i386 architecture of input file `foo.o’ is incompatible with i386:x86-64 output
-m elf_i386
链接的时候加入-m elf_i386