2016-05-28 11 views
0

プロシージャReadValはループして10個の整数(AS STRINGS)を入力するように要求し、最終的にはそれぞれを配列に格納します。 ReadValはgetStringマクロを使用しています。その後、もう9回、「符号なし整数を入力してください:」と表示されますが、ユーザーが値を入力できるようにするために停止しません。だから、間違いなくマクロを呼び出すのですが、なぜそれが停止して次の9回の入力を待つわけではありません。ループ内のマクロが一度しか動作していない場合

INCLUDE Irvine32.inc 
LEN = 10 ; Number of elements in array. 

getString MACRO buffer, size 
    push eax 
    push ecx 
    push edx 
    mov edx, OFFSET userMsg_2 
    call WriteString 
    mov edx, buffer    ; buffer passed by reference, so no OFFSET req'd. 
    mov eax, size 
    mov ecx, [eax]    ; Dereference sizeElem to ecx counter. 
    call ReadString 
    pop edx 
    pop ecx 
    pop eax 
ENDM 

.data 
userMsg_2 BYTE  "Please enter an unsigned number: ",0 
array DWORD LEN dup(?) 
    arLength DWORD LEN 
    sizeElem BYTE 11  ; Number of digits allowed in. reading ints as strings. 
    holder DWORD ?   ; Temp memory location for storing string input/output. 
.code 
main PROC 
    push OFFSET array 
    push OFFSET arLength 
    push OFFSET sizeElem 
    push OFFSET holder 
    call ReadVal 
exit 
main ENDP 

ReadVal PROC 
    push ebp 
    mov ebp, esp 
    push ecx 
    mov esi, [ebp+20]    ; esi has starting address of array. 
    mov eax, [ebp+16]    ; @arLength 
    mov ecx, [eax]     ; ecx gets arLength. 
    cmp ecx, 0 
    je L2 
L1: 
    getString [ebp+8], [ebp+12] ; [ebp+8] gets the user inputted string. 
    mov esi, [ebp+8]   ; mov string in holder into array[esi]. 
    add esi, TYPE DWORD 
    loop L1 
L2: 
    pop ecx 
    pop ebp 
    ret 16 
ReadVal ENDP 
END main 
+0

コードをステップ実行したときに、デバッガはあなたに何を表示しますか? –

+0

これは10回ループサイクルを示していますが、何が起こっているのかを正確に見るためにマクロに入る(F11)ことはできません。それはそこにあると思います。そうでなければ、「符号なしの番号を入力してください:」というメッセージは9回も印刷されません。 – Chris

+0

@Chris:ほとんどのデバッガにはステップ命令とステップソース行があります。また、あなたは一箇所からしか使用していないので、インライン化するだけで、必要のないレジスタのセーブ/リストアを取り除くことができます。例えば、 'eax'はその時点ではライブではありません。ループの外側で関数argを逆参照することができるので、ループの中で 'ecx'に' size'を1回だけロードするだけで済みます。さらに、いくつかのコール保存レジスタを保存しておくことができます。おそらく唯一重要なのはコードサイズです。 –

答えて

3

ReadStringは、ECXの値がDWORDであることを想定していると思います。それをBYTEとして数字を与えることはそれを混乱させています。 sizeElemをDWORDとして宣言すると、問題が解決されます。

あなたがそれをしている間にホルダーをDWORDの代わりにBYTEを使用すると宣言したいと思うかもしれませんが、これは文字列ストレージの典型です。

+0

大きな問題は、sizeElemがスカラーなので、valueで渡す必要があることです。おそらく正しいでしょう;呼び出された関数は '11'の後に3バイトのガベージを読み込んでいます。メモリには全く入ってはいけません;' main'はアセンブル時にそれを知っているので、 –

+0

OPのプログラムにはそれほど間違っていますが、これだけではどうしたらいいのかわかりません問題を解決する。 –

関連する問題