当前位置: 代码迷 >> 汇编语言 >> 64位X86下的linux汇编解决方案
  详细解决方案

64位X86下的linux汇编解决方案

热度:221   发布时间:2016-05-02 04:32:38.0
64位X86下的linux汇编

.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简单之美系列
------解决方案--------------------
栈平衡
  相关解决方案