第15部分-Linux x86 64位汇编 命令行参数

第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

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读