アセンブリ言語プログラムが無限ループに陥っている

アンソニーサントス

プログラムがユーザーに段落の入力を求めた後、私のプログラムはループでスタックしているようです。

TITLE CSC221A4  (CSC2214.asm)

INCLUDE Irvine32.inc

.data
mainMenu1   BYTE    " ", 0Ah, 0Ah, 0Ah
            BYTE    "       Main Menu           ", 0Ah
            BYTE    " 1. Count and Display number of characters (Press 1)   ", 0Ah, 0Ah
            BYTE    " 2. Count and display number of words (Press 2) ", 0Ah, 0Ah
            BYTE    " 3. Count and display number of sentences (Press 3) ", 0Ah, 0Ah
            BYTE    " 4. Count and display numbers of letters that are equal to 'N' or 'n'  (Press 4)", 0Ah, 0Ah
            BYTE    " 5. Count and display number of capital letters (Press 5) ", 0Ah, 0Ah
            BYTE    " 6. Count and display number of vowels (Press 6) ", 0Ah, 0Ah

prompt1     BYTE " ", 0Ah, 0Ah
            BYTE "Please enter your paragraph. Press $ to end.",0Ah, 0Ah, 0
prompt2     BYTE " ", 0Ah, 0Ah
            BYTE " '$' was entered. Paragraph will now calculate.", 0Ah, 0Ah, 0 

prompt3     BYTE "Calculating choice ", 0Ah, 0Ah, 0 
prompt4     BYTE "Number of characters: ",0 
prompt5     BYTE "Number of words: ",0
prompt6     BYTE "Number of sentences: ",0 
prompt7     BYTE "Number of letters equal to 'N' or 'n': ",0 
prompt8     BYTE "Number of capital letters: ",0 
prompt9     BYTE "Number of vowels: ",0 

Sentinel    BYTE '$'
thirdLetter BYTE 'N' , 'n'
space       BYTE ' '

num_char    DWORD ?
num_words   DWORD ?
num_sentences   DWORD ?
num_thirdLetter DWORD ?
num_capLetter   DWORD ?
num_vowels  DWORD ?

.code
main PROC
call mainMenu

exit
main ENDP

mainMenu PROC
mov edx, OFFSET mainMenu1
call WriteString
mov eax, 0;
call ReadChar
cmp al, '1'
jne JUMPLABEL1
call Option1

JUMPLABEL1:
cmp al, '2'
jne JUMPLABEL2
call Option2

JUMPLABEL2:
cmp al, '3'
jne JUMPLABEL3
call option3

JUMPLABEL3:
cmp al, '4'
jne JUMPLABEL4
call option4

JUMPLABEL4:
cmp al, '5'
jne JUMPLABEL5
call option5

JUMPLABEL5:
cmp al, '6'
call option6
exit 
mainMenu ENDP

Option1 PROC
mov edx, OFFSET prompt1
call WriteString
mov eax, 0
mov num_char, 1
mov num_words, 1
mov num_sentences, 1
mov num_thirdLetter, 1
mov num_capLetter, 1
mov num_vowels, 1

L1:
call ReadChar
call WriteTempOutput 
cmp al, Sentinel
jne Not_Sentinel_Flag
mov edx, OFFSET prompt2
call WriteString
jmp End_Flag
Not_Sentinel_Flag:
cmp al, space
jne Not_New_Char_Flag
inc num_char 
Not_New_Char_Flag:
cmp al, 0dh
jne Not_New_Line_Flag
inc num_char
Not_New_Line_Flag:
jmp L1;
End_Flag:
call Display_Char_Results
Option1 ENDP 

Option2 PROC
mov edx, OFFSET prompt1
call WriteString
mov num_words, 1
mov num_sentences, 1
mov num_thirdLetter, 1
mov num_capLetter, 1
mov num_vowels, 1

L1:
call ReadChar
Call WriteTempOutput
cmp al, sentinel
jne Not_Sentinel_Flag
mov edx, OFFSET prompt2
call writestring
jmp End_Flag
Not_Sentinel_Flag:
cmp al, space
jne NOT_NEW_WORD_FLAG
inc num_words
NOT_NEW_WORD_FLAG:
cmp al, 0dh
jne Not_New_Line_Flag
inc num_words
Not_New_Line_Flag:
jmp L1;
End_Flag:
call Display_Word_Results
Option2 ENDP

option3 PROC
mov edx, OFFSET prompt1
call WriteString
mov num_capLetter, 1
mov num_char, 1
mov num_sentences, 1
mov num_thirdLetter, 1
mov num_vowels, 1
mov num_words, 1

L1:
call ReadChar
call WriteTempOutput
cmp al, sentinel
jne Not_Sentinel_Flag
mov edx, OFFSET prompt2
call writestring
jmp End_Flag
Not_Sentinel_Flag:
cmp al, 0dh
jne Not_New_Line_Flag
inc num_sentences
Not_New_Line_Flag:
jmp L1;
End_Flag:
call Display_Sentences_Results
option3 ENDP

option4 PROC
mov edx, OFFSET prompt1
call WriteString
mov num_capLetter, 1
mov num_char, 1
mov num_sentences, 1
mov num_thirdLetter, 1
mov num_vowels, 1
mov num_words, 1

L1:
call readchar
call WriteTempOutput
cmp al, sentinel
jne Not_Sentinel_Flag
mov edx, OFFSET prompt2
call writestring
jmp End_Flag
Not_Sentinel_Flag:
cmp al, 'N'
jne Not_Uppercase_N
inc num_thirdLetter
Not_Uppercase_N:
cmp al, 'n'
jne Not_Letter_N_flag
inc num_thirdLetter
Not_Letter_N_flag:
jmp L1;
End_Flag:
call Display_thirdLetter_results
option4 ENDP

option5 PROC
mov edx, OFFSET prompt1
call writestring
mov num_capLetter, 1
mov num_char, 1
mov num_sentences, 1
mov num_thirdLetter, 1
mov num_vowels, 1
mov num_words, 1

L1:
call readchar
call WriteTempOutput
cmp al, sentinel
jne Not_Sentinel_Flag
mov edx, OFFSET prompt2
call writestring
jmp End_Flag

Not_Sentinel_Flag:
cmp al, 'A' - 'Z'
jbe NOT_Capital_letter
inc num_capLetter
NOT_Capital_letter:
jmp L1;
End_Flag:
call Display_capital_results
option5 ENDP

option6 PROC
mov edx, OFFSET prompt1
call writestring
mov num_capLetter, 1
mov num_char, 1
mov num_sentences, 1
mov num_thirdLetter, 1
mov num_vowels, 1
mov num_words, 1

L1:
call readchar
call WriteTempOutput
cmp al, sentinel

mov edx, OFFSET prompt2
call writestring
OPTION6 endp









Display_char_results PROC
mov edx, OFFSET prompt3
call writestring
mov edx, OFFSET prompt4
call writestring
mov eax, 0
mov eax, num_char
call WriteDec
call crlf
call mainMenu
Display_char_results ENDP

DISPLAY_WORD_RESULTS PROC
mov edx,OFFSET prompt3
call WriteString
mov edx,OFFSET prompt5
call WriteString
mov eax,0
mov eax,num_words
call writeDec
call CRLF
call mainMenu
DISPLAY_WORD_RESULTS ENDP

DISPLAY_sentences_RESULTS PROC
mov edx,OFFSET prompt3
call WriteString
mov edx,OFFSET prompt6
call WriteString
mov eax,0
mov eax,num_sentences
call writeDec
call CRLF
call mainMenu
DISPLAY_sentences_RESULTS ENDP

DISPLAY_thirdLetter_results PROC
mov edx,OFFSET prompt3
call WriteString
mov edx,OFFSET prompt7          
call WriteString
mov eax,0
mov eax,num_thirdLetter
call writeDec
call CRLF
call mainMenu
DISPLAY_thirdLetter_rESULTS ENDP

Display_capital_results PROC
mov edx, OFFSET prompt3
call writestring
mov edx, OFFSET prompt8
call writestring
mov eax, 0
mov eax, num_capLetter
call writeDec
call crlf
call mainMenu
Display_capital_results ENDP

Display_vowels_results PROC
mov edx, OFFSET prompt3
call writestring
mov edx, OFFSET prompt9
call writestring
mov eax, 0 
mov eax, num_vowels
call writeDec
call crlf
call mainMenu
Display_vowels_results ENDP

WriteTempOutput PROC
cmp AL,0Dh          
jne NONEWLINE
mov BL,AL
mov AL,0Ah          
call WriteChar  
mov AL,BL
call WriteChar
ret
NONEWLINE:
call dumpregs
call WriteChar
ret
WriteTempOutput ENDP


exit
END main
9月ローランド

あなたのプログラムは主にその流れに問題があります。call命令を使用すると、ここに戻ることが期待されます。しかし、あなたのコードはただ悲鳴を上げるだけなjmpので、それが問題を修正するために使用すべき命令です。

cmp al, '1'
jne JUMPLABEL1
call Option1   <-- Change this to   jmp Option1

JUMPLABEL1:

前のようなコードのブロックがあるたびに、CALLではなく、関連するOption_プロシージャにジャンプする必要があります。

...
L1:
call ReadChar
call WriteTempOutput 
cmp al, Sentinel
jne Not_Sentinel_Flag
mov edx, OFFSET prompt2
call WriteString
jmp End_Flag
Not_Sentinel_Flag:
cmp al, space
jne Not_New_Char_Flag
inc num_char 
Not_New_Char_Flag:
cmp al, 0dh
jne Not_New_Line_Flag      <-- Change this to   je New_Line_Flag
inc num_char
Not_New_Line_Flag:         <-- Change this to   New_Line_Flag:
jmp L1;
End_Flag:
call Display_Char_Results  <-- Change this to   jmp Display_Char_Results
Option1 ENDP 

オプション1の手順あなたは本当に文字を数えていません!pe AL = 65のフローに従うと、num_char変数がインクリメントされないことがわかります。また、特定の表示ルーチンをここに戻らないようにプログラムしたため、表示ルーチンを呼び出さないでください。だからそれにJMP。

Display_char_results PROC
mov edx, OFFSET prompt3
call writestring
mov edx, OFFSET prompt4
call writestring
mov eax, 0             <-- This can savely be deleted
mov eax, num_char
call WriteDec
call crlf
call mainMenu          <-- Change this to   jmp mainMenu
Display_char_results ENDP

すべてのDisplay _..._ resultsプロシージャは、CALLではなく、mainMenuラベルにジャンプする必要があります。そうすれば、スタックが急速にいっぱいにならないループができて、スタックのオーバーフローを回避できます。

JUMPLABEL5:
cmp al, '6'
call option6
exit 
mainMenu ENDP

このコードスニペットでは、比較の結果に対して何もしません。あなたはそれを次のように行うことができます

JUMPLABEL5:
 cmp al, '6'
 jne BadChoice
 call option6       <-- Remember to change this into a jump!
BadChoice:
 exit 
mainMenu ENDP

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

アセンブリ言語プログラムもカーネルモードによって制限されていますか?

分類Dev

効果が無限ループに陥っている-Ngrx / Effects

分類Dev

Cが無限ループに陥っている

分類Dev

SMOアルゴリズムが無限ループに陥っていますか?

分類Dev

Visual Studio 2015 JavaScript言語サービスが存在しない参照ファイルをダウンロードする無限ループに陥る

分類Dev

AからZに印刷する8086アセンブリ言語プログラム

分類Dev

カスタム逆アセンブラで再開されたメッセージが無限ループに陥る

分類Dev

BridsonのアルゴリズムPoisson-DiskSamplingの実装が無限ループに陥っているようです

分類Dev

このbashプログラムが無限ループに陥るのはなぜですか?

分類Dev

入力が間違っていると、プログラムは無限ループに入ります

分類Dev

リーダーが無限ループに陥っているのはなぜですか

分類Dev

GCDプログラムx86アセンブル言語

分類Dev

コマンドプロンプトで文字列印刷アセンブリ言語プログラムが実行されていません

分類Dev

Cプログラムからアセンブリ言語に値を渡す

分類Dev

プログラムのアセンブリ言語を終了する方法

分類Dev

プログラムのアセンブリ言語を終了する方法

分類Dev

名を印刷するアセンブリ言語プログラム

分類Dev

アセンブリ言語プログラムをトレースするにはどうすればよいですか?

分類Dev

アセンブリ言語プログラムで複数行のメニューを作成する

分類Dev

このプログラムを実行すると、常に無限ループに陥ります。

分類Dev

アセンブリ言語ループが機能しない

分類Dev

プログラムがアセンブリを実行しているときにデータを作成する

分類Dev

分散メッセージパッシングアルゴリズムを実装するために選択するプログラミング言語

分類Dev

Cプログラムが無限にループする

分類Dev

RISC-Vのウィスパーシミュレーター:C ++プログラムが無限ループに陥るか、中止される

分類Dev

アセンブリ言語でのemu8086の回文プログラム

分類Dev

生徒の名前を成績に応じて並べ替えるアセンブリ言語プログラムを作成する

分類Dev

8086 アセンブリ言語で部分文字列を検索するプログラムが機能しない

分類Dev

私のプログラムが無限ループになっている理由を誰かに教えてもらえますか?

Related 関連記事

  1. 1

    アセンブリ言語プログラムもカーネルモードによって制限されていますか?

  2. 2

    効果が無限ループに陥っている-Ngrx / Effects

  3. 3

    Cが無限ループに陥っている

  4. 4

    SMOアルゴリズムが無限ループに陥っていますか?

  5. 5

    Visual Studio 2015 JavaScript言語サービスが存在しない参照ファイルをダウンロードする無限ループに陥る

  6. 6

    AからZに印刷する8086アセンブリ言語プログラム

  7. 7

    カスタム逆アセンブラで再開されたメッセージが無限ループに陥る

  8. 8

    BridsonのアルゴリズムPoisson-DiskSamplingの実装が無限ループに陥っているようです

  9. 9

    このbashプログラムが無限ループに陥るのはなぜですか?

  10. 10

    入力が間違っていると、プログラムは無限ループに入ります

  11. 11

    リーダーが無限ループに陥っているのはなぜですか

  12. 12

    GCDプログラムx86アセンブル言語

  13. 13

    コマンドプロンプトで文字列印刷アセンブリ言語プログラムが実行されていません

  14. 14

    Cプログラムからアセンブリ言語に値を渡す

  15. 15

    プログラムのアセンブリ言語を終了する方法

  16. 16

    プログラムのアセンブリ言語を終了する方法

  17. 17

    名を印刷するアセンブリ言語プログラム

  18. 18

    アセンブリ言語プログラムをトレースするにはどうすればよいですか?

  19. 19

    アセンブリ言語プログラムで複数行のメニューを作成する

  20. 20

    このプログラムを実行すると、常に無限ループに陥ります。

  21. 21

    アセンブリ言語ループが機能しない

  22. 22

    プログラムがアセンブリを実行しているときにデータを作成する

  23. 23

    分散メッセージパッシングアルゴリズムを実装するために選択するプログラミング言語

  24. 24

    Cプログラムが無限にループする

  25. 25

    RISC-Vのウィスパーシミュレーター:C ++プログラムが無限ループに陥るか、中止される

  26. 26

    アセンブリ言語でのemu8086の回文プログラム

  27. 27

    生徒の名前を成績に応じて並べ替えるアセンブリ言語プログラムを作成する

  28. 28

    8086 アセンブリ言語で部分文字列を検索するプログラムが機能しない

  29. 29

    私のプログラムが無限ループになっている理由を誰かに教えてもらえますか?

ホットタグ

アーカイブ