不能正确划分汇编程序,为什么?

时间:2013-01-19 20:08:55

标签: assembly x86 tasm

这是我在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中,而不是啊。为什么?!在上面的代码中是这样吗?

我的主要问题是我无法调试我的代码,因为我使用tasm并且我知道唯一的强大调试器是ollydbg,但它是x32bit汇编程序,而不是16.所以我必须更改寄存器,也许不是一切都是一样的......

1 个答案:

答案 0 :(得分:3)

对于DIV CX(通常为DIV r/m16),剩余部分转到DX,商为AX

仅对于8位除数,剩余部分转到AH。但你显然想要16位除数,因为你在除法之前将DX置零。