第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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值