2013-06-26 54 views
0

我學習上的x86彙編語言做了一個簡單的PROGRAME,將告訴數是素數或不。麻煩與質數程序大會

我想我做得對,但仍然沒有得到想要的結果,下面是代碼

section .bss 
b db 
section .data 
x db "Number is Prime",10,0 
y db "Number is not Prime",10,0 
z db "value is=%d",10,0 

section .text 
global main 
extern printf 
main: 
mov eax,17 
mov ebx,2 
loop: 
mov [b],eax 
div ebx 
mov eax,[b] 
cmp edx,0 
jz Print_not_Prime 
inc ebx 

cmp ebx,17 
jnz loop 
push x 
call printf 
add esp,4 
ret 

Print_not_Prime: 
push y 
call printf 
add esp,4 
ret 

在上面的代碼中,我用17號和PROGRAME告訴它不是素數輸出檢查。

任何人可以讓我知道我做錯了

+0

爲什麼'C'標籤? – chux

回答

2

我看到至少有兩個問題:

b db 
.... 
mov [b],eax 

你只是在b保留一個字節的空間,但存儲DWORD(4個字節)。您應該使用dd而不是db


div ebx 

你應該使用divcdq(或xor edx,edx)之前,以明確edx,因爲這個部門將通過ebxedx:eax

+0

感謝Michael的回答,但爲什麼我們真的需要在div之前清理edx,無論如何,每次調用div時,edx中的舊值都會被新值覆蓋。 –

+0

@AmitSinghTomar將被覆蓋,但'div'需要它是從的情況下,要劃分一個數字,不適合一個32位的寄存器兩個寄存器操作數。允許您在64位模式下分割多達128位的數字。同樣的原因,爲什麼'imul'輸出到兩個寄存器。乘以兩個64位整數可能會產生一個128位長的數字。 –

+0

感謝Sergey提供的回覆,但請您以更簡單的方式解釋它。 –

2

您每分之前需要零edxdiv的分紅在edx:eax中作爲雙寄存器操作數。

如果從上次審判庭在那裏餘那麼它會搞砸了你的結果。

而且最好是你的紅利存儲在寄存器(ecxesiedi仍然未使用),或至少在內存堆棧然後作爲邁克爾指出的是不足以存儲DWORD。