第17部分-Linux x86 64位汇编 命令行参数
使用命令行参数示例
在堆栈中命令行参数被存储为字符串值。需要进行转换工作,转换为数字。
可以使用C库函数的:
atoi:把ASCII字符串转换为短整数值
atol:把ASCII字符串转换为长整数值
atof:把ASCII字符串转换为双精度浮点值
这些函数需要将字符串位置的指针必须放置堆栈中。
atoi函数结果返回到EAX寄存器中。Atol的结果存放在EDX:EAX寄存器中,需要64位。函数atof结果返回到fpu的st0寄存器中。
-
-
- 示例
-
读取命令行参数把它转换为整数值,然后计算圆面积。
.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
这里要注意的是,如果不增加一个参数是会报段错误的。