我是编写汇编代码的新手,我需要一些帮助。
我的任务是在 NASM(在 Linux 上)中编写一个程序,它计算第 n 个斐波那契数,其中 n 是使用 read syscall 从 STDIN 读取的,并使用 C atoi/atol 转换为 int/long。计算出的数字将被写入 STDOUT(我可以使用 C printf)。
我设法编写了工作的 32 位代码,但我坚持将其转换为 64 位(使用 64 位寄存器,64 位长整数)。我试着天真地去做(改变 eax -> rax,esp -> rsp 等等),但我唯一得到的是段错误。
编辑:错字是固定的
EDIT2:有什么想法,如何使用 64 位整数来显示高于 46 位的斐波那契数?
这是代码:
section .data
format: db '%d', 0xA
section .bss
buffer resb 8
bufferLength equ $-buffer;
section .text
extern printf
extern atoi
global main
main:
call fib
fib:
mov rax, 3
mov rbx, 0
mov rcx, buffer
mov rdx, bufferLength
int 0x80
push 0
push buffer
call atoi
add rsp, 8
push rbx
mov rcx, rax
xor rax, rax
xor rbx, rbx
inc rbx
call print
exitProg:
mov rbx, 0
mov rax, 1
int 0x80
print:
push rax
push rcx
push rax
push format
cmp rcx, 1
je lastPrint
add rsp, 8
pop rcx
pop rax
mov rdx, rax
mov rax, rbx
add rbx, rdx
dec ecx
jnz print
pop rbx
lastPrint:
call printf
add rsp, 8
call exitProg
提前致谢。