.section .data
.section .text
.globl _start
_start:
pushq $3
pushq $2
call power
addq $16, %rsp
pushq %rax
pushq $2
pushq $5
call power
addq 16, %rsp
pushq %rbx
addq %rax, %rbx
movq $1, %rax
int $0x80
.type power, @function
power:
pushq %rbp
movq %rsp, %rbp
subq $8, %rsp
movq 16(%rbp), %rbx
movq 24(%rbp), %rcx
movq %rbx, -8(%rbp)
power_loop:
cmpq $1, %rcx
je end_power
movq -8(%rbp), %rax
imulq %rbx, %rax
movq %rax, -8(%rbp)
decq %rcx
jmp power_loop
end_power:
movq -8(%rbp), %rax
movq %rbp, %rsp
popq %rbp
ret
本来是《深入理解程序设计,使用Linux汇编语言》第四章的函数示例,但是书上是32位的程序,而我计算机又是64位的,所以查了下资料,改了下,但是发现段错误在第二次调用完power后,的addq 16, %rsp语句,实在想不通,希望哪位懂的大神能为我解惑
------解决方案--------------------
addq 16, %rsp 应该没有问题吧;接下来的 pushq %rbx 应该是 pop 类指令才对吧
------解决方案--------------------
看一下rsp指向的地址是多少?
------解决方案--------------------
2个popl是 add 8吧?你用addq 8,%rsp试一下
你看一下stack空间是否分配的正确.我好想没看到你前面分配esp空间
------解决方案--------------------
你的ss和ds值一样吗?
------解决方案--------------------
32位程序也可以编译在64位系统下运行,可以参考以下我blog中写的linux简单之美系列
------解决方案--------------------
栈平衡