2016-04-28 130 views
0

我目前正在使用NASM elf64 x64構建一個彙編程序,它將告訴輸入的年份是否爲閏年。目前,我把這個年份硬編碼爲1986年,但是在最終版本中,它應該採用命令行參數。閏年NASM彙編程序

但是,我一直得到一個浮點錯誤,我不知道它來自哪裏。

global main 
    extern puts 
    section .text 

main: 
    mov rax, year 
    cwd 
    mov rcx, 400 
    div rcx 
    test rdx, rdx 
    jz _is_leap 

    mov rax, year 
    cwd 
    mov rcx, 100 
    div rcx 
    test rdx, rdx 
    jz _no_leap 

    mov rax, year 
    test rax, 3 
    jz _is_leap 

year 
    dq  1986, 10, 0  


_no_leap: 
    db  "This is NOT a leap year", 10, 0   ;print out is not a leap year 
    jmp _after 

_is_leap: 
    db  "This is a leap year", 10, 0   ;print is a leap year 
    jmp _after 

_after: 
    ret 

預先感謝您

+0

出於好奇,一年後的「,10,0」是什麼? –

+1

'cwd'不會做你認爲它做的事。您應該簡單地將'rdx'歸零。正如Matti所說,不要跳入數據:) – Jester

+0

@MattiVirkkunen在印象之下,完成一個「db」語句是必要的 – Jeremy

回答

0

中,只有在整數的交易通常是由不正確的分割造成了程序的浮點錯誤。在你的情況下,它看起來並不像零分,所以它將成爲邁克爾佩奇在評論中指出的分裂溢出。

一個更大的問題是,你跳到一個不包含有效代碼的位置。例如,您的_no_leap位置包含表示字符串「這不是閏年\ n \ 0」的字節,並且您告訴系統將其解釋爲代碼。這是行不通的。

簡單地執行數據不會使計算機打印它。您需要進行系統調用才能打印出字符串。要做到這一點的方法是依賴於平臺的。

+0

DIV指令有兩個一般的整數除法錯誤原因。 Div除零,以及除法溢出,商不能在目標寄存器中表示。通常情況下,人們使用DIV並且不會將DX/EDX/RDX寄存器清零。在這種情況下'xor edx,edx'將被保證爲未簽名的分割。 –

+1

哦,我不知道溢出會導致同樣的錯誤。那麼這就是問題的分歧。在修復之後,它會立即通過嘗試執行數據而崩潰。 –