我是一名編寫彙編代碼的新手,我需要一些幫助。將32位斐波納契nasm代碼轉換爲64位
我的任務是在NASM(在Linux上)編寫一個程序,它計算第n個斐波那契數,其中n是從STDIN中讀取的系統調用,並且用C atoi/atol轉換爲int/long。計算出的數字將被寫入STDOUT(我可以使用C printf)。
我設法寫出工作的32位代碼,我堅持將它轉換爲64位(使用64位寄存器,64位長int)。我試圖做到天真(改變eax - > rax,esp - > rsp等),但我得到的唯一東西是segfault。
編輯:錯字是固定
EDIT2:任何想法,如何使用64位整數,以顯示出比46個Fibonacci數高?
下面的代碼:
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
在此先感謝。
感謝您指出這個錯誤。我也將格式移至.data。 實際上,我只能從C庫中使用atoi和printf(這是我的任務的一部分)。 刪除計算並僅使用read()+ printf()(如echo)與64位編譯的elf64可執行文件中的兼容性系統調用完美地工作。 – Protazy
對於一個「可愛」的方式做斐波那契,看看'xadd' ... –
@FrankKotler:很好。 – Jester