天天看点

第17部分-Linux x86 64位汇编 命令行参数第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

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

继续阅读