第11部分-Linux x86 64位汇编 函数完整示例
调用函数示例
这里开始使用到64位的寄存器了,编译的也是64位可执行程序了。
.extern printf ;//调用外部的printf函数
.section .data
result:
.ascii "Area result is %f.\n"
.byte 0x0a,0x0
precision:
.byte 0x7f, 0x00
.section .bss
.lcomm value, 4
.lcomm areasize, 8
.section .text
.globl _start
_start:
nop
finit;//初始化FPU
fldcw precision;//加载精度到FPU的控制寄存器
movl $10, %ebx
call area;//调用函数area
movq $result,%rdi
fstpl areasize
movq areasize, %xmm0
call printf
movl $2, %ebx
call area;//调用函数area
movq $result,%rdi
fstpl areasize
movq areasize,%xmm0
call printf
movl $120, %ebx
call area;//调用函数area
movq $result,%rdi
fstpl areasize
movq areasize,%xmm0
call printf
mov $60,%rax
syscall
.type area, @function;//定义函数area
area:
fldpi;//加载π
imull %ebx, %ebx;//半径相乘
movl %ebx, value;//半径相乘结果移动到value
filds value;//加载半径相乘结果到st0,π移动到st1
fmulp %st(0), %st(1) ;//求面积,保存到栈顶st0
ret
as -o functest.o functest.s
ld -o functest functest.o -lc -I /lib64/ld-linux-x86-64.so.2