2016-06-01 7 views
1
INCLUDE Irvine32.inc 
.code 
main PROC 
.REPEAT 
mov edx, OFFSET fPrompt ;display a prompt 
call WriteString 
call ReadInt ;recordes users number 
mov var1, eax   ;gives var1 the users number 
.IF var1 == -1  ;jumps to L3 if the user want's to quit 
jmp L3 
.ENDIF 
call IsPrime  ;calls the IsPrime procedure 
L3: 
.UNTIL var1 == -1  ;jumps up to repeat if var1 != -1 
ret 
main ENDP 
mov ebx, 2 ; sets minimum divisor 
mov eax, var1 ; set dividend 
cdq ; converts to 64-bit edx:eax 
mov ecx, ebx ; stores divisor in ecx 
div ecx ; Proformes division 
mov b, eax ; Gets remainder, b is half var2 
.WHILE ebx != b ;loops until ebx has reached var1/2 
mov eax, var1 ; set dividend 
cdq ; converts to 64-bit edx:eax 
mov ecx, ebx ; stores divisor in ecx 
div ecx ; Proformes division 
mov a, edx ; Gets remainder 
.IF a == 0 ;if there was no remainder, then var1 is not prime 
jmp L1  ;jumps out of the loop if above is correct 
.ENDIF 
inc ebx  ;increments until ebx reaches b 
.ENDW 
mov edx, OFFSET pPrompt ;tells the user their number was prime 
call WriteString 
jmp L2 
L1: 
mov edx, OFFSET cPrompt ;tells the user their number was not prime 
call WriteString 
L2: ret 
IsPrime ENDP 
END main 

誰でもエラーメッセージの取得に役立つことができますか? ch03 AddSub.asm(45):致命的なエラーA1010:不一致ブロックのネスト:IsPrime

答えて

2

IsPrime ENDP行がありますが、対応するIsPrime PROCはありません。

だからこそ、それはネスティングについて不平を言っています。

あなたはPROCラインが行く(おそらくすぐmov ebx, 2 ; sets minimum divisor前)と、...よく、

+0

ありがとう:-)そこにそれを置くべき場所をうまくする必要があります!うわー、私はそれを見ることができませんでした!これで、fPrompt、var1、b、a、pPrompt、cPromptの未定義のシンボルエラーを修正しました。私がコードセグメントの下でそれを定義しなかったからでしょうか? – BioMan

+0

私はおそらく、コードが読み取り専用になる傾向があるので、おそらくデータセグメントの下に置かれる傾向があります(x86 ASMを実行してからしばらくしていますが)。しかし、はい、彼らはどこかで定義されるべきです!*もしあなたがそれを行い、それでも問題があれば、あなたは私よりも露出が大きくなるので、新しい*質問をする方が良いでしょう。 – paxdiablo

+1

沖電気!!しかし、あなたは本当に私を助けました!ありがとう! – BioMan