プロシージャ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
コードをステップ実行したときに、デバッガはあなたに何を表示しますか? –
これは10回ループサイクルを示していますが、何が起こっているのかを正確に見るためにマクロに入る(F11)ことはできません。それはそこにあると思います。そうでなければ、「符号なしの番号を入力してください:」というメッセージは9回も印刷されません。 – Chris
@Chris:ほとんどのデバッガにはステップ命令とステップソース行があります。また、あなたは一箇所からしか使用していないので、インライン化するだけで、必要のないレジスタのセーブ/リストアを取り除くことができます。例えば、 'eax'はその時点ではライブではありません。ループの外側で関数argを逆参照することができるので、ループの中で 'ecx'に' size'を1回だけロードするだけで済みます。さらに、いくつかのコール保存レジスタを保存しておくことができます。おそらく唯一重要なのはコードサイズです。 –