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

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

使用命令行参数示例

在堆栈中命令行参数被存储为字符串值。需要进行转换工作,转换为数字。

可以使用C库函数的:

atoi:把ASCII字符串转换为短整数值

atol:把ASCII字符串转换为长整数值

atof:把ASCII字符串转换为双精度浮点值

这些函数需要将字符串位置的指针必须放置堆栈中。

atoi函数结果返回到EAX寄存器中。Atol的结果存放在EDX:EAX寄存器中,需要64位。函数atof结果返回到fpu的st0寄存器中。

      1. 示例

读取命令行参数把它转换为整数值,然后计算圆面积。

.extern printf ;//调用外部的printf函数
.section .data
output:
   .asciz "The area is: %f\n"
.section .bss
   .lcomm result, 8
.section .text
.globl _start
_start:
   nop
   finit;//初始化FPU

   mov 16(%rsp),%rdi;//指向第一个参数
   call atoi;//调用atoi为短整数
   movq %rax, result
   fldpi;//加载π到st0
   filds result;//加载result到st0,π移动到st1
   fmul %st(0), %st(0);//result相等并存放于st0
   fmul %st(1), %st(0);//将st0和st1相乘,结果存放于st0
   fstpl (%rsp);//将st0存放于堆栈中,覆盖了指向程序名的指针。
   movq $output,%rdi;//output2字符串地址
   movq (%rsp),%xmm0;//栈指针
   call printf;//调用printf函数,打印参数数量
   movq $0,%rdi
   call exit

as -g -o paramtest.o paramtest3.s

ld -o paramtest paramtest.o -lc -I /lib64/ld-linux-x86-64.so.2

然后执行

./paramtest 20

即可得到输出:

The area is: 1256.637061

         这里要注意的是,如果不增加一个参数是会报段错误的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值