第15部分-Linux x86 64位汇编 命令行参数
程序启动时,一些应用程序需要在命令行中指定输入参数。
不同的操作系统使用不同的方法把命令行参数传递给程序。
程序启动时候,Linux把如下4种类型的信息存放到程序堆栈中。
命令行参数的数目/shell提示符执行的程序的名称/命令行中包含的任何命令行参数/程序启动时所有当前Linux的环境变量。
而且这些元素的指针加载到堆栈中可以方便定位。
程序启动时候,堆栈的一般布局如下:
查看命令行参数示例
.extern printf ;//调用外部的printf函数
.section .data
output1:
.asciz "There are %d parameters! \n"
output2:
.asciz "%s\n"
count:
.int 0
resultstr:
.ascii "Area result is %f.\n"
.section .text
.globl _start
_start:
movq (%rsp), %rcx;//保存esp指向的第一个参数给rcs,就是参数数目
movq $output1,%rdi;// output1字符串地址
movq %rcx,%rsi;
call printf;//调用printf函数,打印参数数量
movq %rsp, %rbp;//移动rsp移动rbp,保存rbp
add $8, %rbp;//rbp往下走一个字节,到程序名字
movq (%rsp), %rcx;//rsp指向的第一个参数rcs,就是参数数目
dec %rcx;//减去1,去掉程序本身这个参数
cmp $0,%rcx;//如果只有一个文件名参数则直接退出,无需打印。
je exit;
loop1:
mov %rcx,count
add $8, %rbp;//rbp加8,继续往下走。使得Rbp寄存器指向第一个参数。
movq $output2,%rdi;//output2字符串地址
movq (%rbp),%rsi;//栈指针
call printf;//调用printf函数,打印参数数量
mov count, %rcx
loop loop1;//rcx-1,继续循环,直到rcx=0打印完毕所有参数。
exit:
mov $60,%rax
syscall
as -g -o paramtest.o paramtest.s
ld -o paramtest paramtest.o -lc -I /lib64/ld-linux-x86-64.so.2