我正在学习汇编,我的任务是将一个简单的程序从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位寄存器。
答案 0 :(得分:1)
看起来您使用1作为系统电话号码,但it seems表示它实际上是60.显然,您不能假设系统调用号码不相同从32位linux到64位。
经过进一步检查,似乎还有一些问题。
您使用movq
访问内存的所有位置可能无法按预期工作,因为访问适用于双字。您正在阅读或写入数字的较高32位而无意义。