這裏是我嘗試在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個。所以我必須更改寄存器,一切都是一樣的...
在32位Windows中有debug.exe,還有Open Watcom調試程序wd.exe,還有Borland的Turbo Debugger td.exe。你也可以將你的代碼編譯爲32位,並將它編譯爲32位程序的一部分,並用你擁有的任何32位調試器,OllyDbg或其他東西進行調試。 –