私はアセンブリ コードを書く初心者で、助けが必要です。
私の仕事は、n 番目のフィボナッチ数を計算する NASM (Linux 上) でプログラムを作成することです。ここで、n は read syscall で STDIN から読み取られ、C atoi/atol で int/long に変換されます。計算された数値は STDOUT に書き込まれます (C の printf を使用できます)。
動作する 32 ビット コードを書くことができましたが、それを 64 ビット (64 ビット レジスタ、64 ビット long int を使用) に変換する作業に行き詰まっています。私は単純にそれをやろうとしました(eax -> rax、esp -> rsp などを変更します)が、得られるのは segfault だけです。
編集:タイプミスが修正されました
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
前もって感謝します。