x86汇编程序不会终止

时间:2014-09-30 02:30:00

标签: assembly

我正在学习汇编,我的任务是将一个简单的程序从32位转换为64位。程序计算2 ^ 3 + 5 ^ 2。我的程序编译正常,但是,当我运行它时,程序不会终止。因此,我必须在命令行中按Ctrl + C才能实际停止程序。我之所以认为问题最初是因为我使用了int 0x80来终止,但在我切换到syscall之后问题仍然存在。

代码:

  1 .section .data
  2 .section .text
  3 .globl _start
  4 _start:
  5         push $3
  6         push $2
  7 
  8         call power
  9         addq $8, %rsp
 10 
 11         push %rax
 12 
 13         push $2
 14         push $5
 15 
 16         call power
 17         addq $8, %rsp
 18         pop %rbx
 19 
 20         addq %rax, %rbx
 21 
 22         movq $1, %rax
 23         syscall
 24 
 25 .type power, @function
 26 power:
 27         push %rbp
 28         movq %rsp, %rbp
 29         subq $4, %rsp
 30 
 31         movq 8(%rbp), %rbx
 32         movq 12(%rbp), %rcx
 33 
 34         movq %rbx, -4(%rbp)
 35 
 36 power_loop_start:
 37         cmpq $1, %rcx
 38         je end_power
 39 
 40         movq -4(%rbp), %rax
 41         imulq %rbx, %rax
 42         movq %rax, -3(%rbp)
 43         decq %rcx
 44         jmp power_loop_start
 45 
 46 end_power:
 47         movq -4(%rbp), %rax
 48         movq %rbp, %rsp
 49         pop %rbp
 50         ret

我很抱歉发布了这么多代码,但我需要指导,因为我完全无能为力。我找了很长时间没有用。提前致谢。顺便说一句,该程序在将其转换为64位之前有效。我只是将所有movl等更改为movq并使用了64位寄存器。

1 个答案:

答案 0 :(得分:1)

看起来您使用1作为系统电话号码,但it seems表示它实际上是60.显然,您不能假设系统调用号码不相同从32位linux到64位。

经过进一步检查,似乎还有一些问题。

  • 你不会在64位的堆栈上传递args(除非你有很多他们赢得的不适合给定的regs。查看linux 64bit调用约定)
  • 在主要情况下,你推2个双字,但在电源上你会从堆栈中获得2个qwords。

您使用movq访问内存的所有位置可能无法按预期工作,因为访问适用于双字。您正在阅读或写入数字的较高32位而无意义。