一 汇编输出命令行参数和函数输出参数有所不同
函数的参数都是存放在rdi rsi rdx rcx r8 r9中。
命令行参数个数存放在rdi中,参数数组首地址存放在rsi寄存器中。需要通过rsi寄存器偏移来找到后续的参数地址。
二 汇编代码
extern printf
extern puts
format:
db "args: %s", 10, 0
msg:
db "fantasy", 10, 0
global main
main:
mov r8, rsi;先保存参数地址到r8 ,因为打印需要这个函数
sub rsp, 8; ABI标准,栈16字节对齐
print:
push rdi ;缓存一些寄存器
push rsi
push rdx
push rcx
push r8
push r9
push rax
mov rdi, format; 格式化串
mov rsi, [r8]; 取第一个参数地址存入rsi
xor rax, rax; rax清零
call printf; 调用printf
pop rax ;回复寄存器的值
pop r9
pop r8
pop rcx
pop rdx
pop rsi
pop rdi
add r8, 8; 移动r8到下一个参数的首地址,因为64位系统,每个指针式8字节的,
dec rdi; 减少参数个数
jnz print; 还没到0,就继续
mov rax, 1 ;通过中断退出系统,不能直接写ret,main函数没有更外层的栈空间,ret会segment fault
xor rbx, rbx
int 80h
三 执行结果