2013-01-19 30 views
0

這裏是我嘗試在TASM中編寫一個函數,如果數字是質數,則返回true,否則返回false。不能在彙編程序中正確分隔,爲什麼?

masm 
model small 

.data 
pos db "Yes, it's Prime",13,10,"$" 
negat db "No, it's not Prime",13,10,"$" 

.stack 256 

.code 


isPrime proc 
    push bp; 
    mov bp,sp; 
    push bx; 
    push cx; 

    mov bx, [bp+4] 
    mov cx, 2; 

    cmp bx, 0; check for zero 
    je isPrimeFalse; 
    cmp bx, 3; ;check for <=3 
    jle IsPrimeTrue; 

    isPrimeCycle: 
     cmp bx, cx; 
     je IsPrimeTrue; 
     mov ax, bx; 
     xor dx, dx; 
     DIV cx; 
     cmp ah, 0h; 
     je IsPrimeFalse; 
     inc cx; 
     jmp isPrimeCycle; 

IsPrimeFalse: 
    mov ax, 0; false 
    jmp IsPrimeExit; 
IsPrimeTrue: 
    mov ax, 1; 
IsPrimeExit: 
    pop cx; 
    pop bx; 
    pop bp; 
    ret 2; 
isPrime endp 

main: 
    push 5; 
    call isPrime 
    cmp ax, 0; 
    je no; 
    jmp yes; 
yes: ... 
no: ... 
end main 

它的工作原理對於不是質數,但對於素數(數> 3,例如5以上)它仍然顯示NO。

我的錯誤在哪裏?提醒應該存儲在AH中,但是當我在ollydbg中調試上面的代碼時(我將寄存器更改爲x32以使其工作)提醒存儲在edx中,而不是在ah中。爲什麼?!在上面的代碼中是這樣嗎?

我的主要問題是我無法調試我的代碼,因爲我使用tasm和我知道的唯一一個功能強大的調試器是ollydbg,但它是x32bit彙編器,而不是16個。所以我必須更改寄存器,一切都是一樣的...

+0

在32位Windows中有debug.exe,還有Open Watcom調試程序wd.exe,還有Borland的Turbo Debugger td.exe。你也可以將你的代碼編譯爲32位,並將它編譯爲32位程序的一部分,並用你擁有的任何32位調試器,OllyDbg或其他東西進行調試。 –

回答

3

對於DIV CX(一般DIV r/m16)其餘去DX,該商數AX

只適用於8位除數,餘數爲AH。但你明顯需要16位除數,因爲你在分割之前將DX置零。

+0

謝謝,這清理了:) –

相關問題