0

これは、数値が素数の場合は true を返し、それ以外の場合は false を返す関数を TASM で記述しようとする私の試みです。

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 に変更しました)、リマインダーは ah ではなく edx に保存されます。どうして?!上記のコードではそうですか?

私の主な問題は、コードをデバッグできないことです。私は tasm を使用しており、私が知っている唯一の優れた強力なデバッガーは ollydbg ですが、16 ではなく x32 ビット アセンブラーです。 ..

4

1 に答える 1

3

についてDIV CX(そして一般的にDIV r/m16) 剰余は になりDX、商は になりAXます。

8 ビット除数の場合のみ、剰余は AH に送られます。DXしかし、除算する前にゼロにするので、明らかに 16 ビットの除数が必要でした。

于 2013-01-19T20:22:39.067 に答える