文字列を整数に変換するプログラムがあります。ユーザーが有効な数値を入力する限り、プログラムは正常に機能します。ただし、入力された値が実際に数値であることを確認するためにエラーチェックを追加すると、いくつかの問題が発生しました。最初は、getDataプロシージャのコードの最初の行としてtryAgainタグがありました。ただし、エラーチェックは、次の反復中に有効な数値が入力されたときに無効な入力に続いて、プログラムが「無効な入力」というメッセージを返し続けることを意味しました。コードの最初の行にtryAgainタグを配置すると、有効な入力が無効な入力の後に続く場合でも、プログラムは無効な入力メッセージを返し続けます。最初に、tryAgainタグを現在の位置に配置しようとしましたが、無限ループで実行されていると思います。2番、
これはx86プロセッサ用のMASMです。よろしくお願いします。
コードは次のとおりです。
.data
result DWORD ?
temp BYTE 21 DUP(0)
answer DWORD ?
.code
main PROC
(いくつかの予備手順の呼び出し)
push OFFSET temp ;ebp+16
push OFFSET answer ;ebp+12
push answerSize ;ebp+8
call getData
(より多くのプロシージャ呼び出し)
exit ; exit to operating system
main ENDP
;*************************************************
; prompts / gets the user’s answer.
; receives: the OFFSET of answer and temp and value of answerSize
; returns: none
; preconditions: none
; registers changed: eax, ebx, ecx, edx, ebp, esi, esp
;*************************************************
getData PROC
push ebp
mov ebp,esp
tryAgain:
mWriteStr prompt_1
mov edx, [ebp+16] ;move OFFSET of temp to receive string of integers
mov ecx, 12
call ReadString
cmp eax, 10
jg invalidInput
mov ecx, eax ;loop for each char in string
mov esi,[ebp+16] ;point at char in string
pushad
loopString: ;loop looks at each char in string
mov ebx,[ebp+12]
mov eax,[ebx] ;move address of answer into eax
mov ebx,10d
mul ebx ;multiply answer by 10
mov ebx,[ebp+12] ;move address of answer into ebx
mov [ebx],eax ;add product to answer
mov al,[esi] ;move value of char into al register
inc esi ;point to next char
sub al,48d ;subtract 48 from ASCII value of char to get integer
cmp al,0 ;error checking to ensure values are digits 0-9
jl invalidInput
cmp al,9
jg invalidInput
mov ebx,[ebp+12] ;move address of answer into ebx
add [ebx],al ;add int to value in answer
loop loopString
popad
jmp moveOn
invalidInput: ;reset registers and variables to 0
mov al,0
mov eax,0
mov ebx,[ebp+12]
mov [ebx],eax
mov ebx,[ebp+16]
mov [ebx],eax
mWriteStr error
jmp tryAgain
moveOn:
pop ebp
ret 12
getData ENDP
これで私がどこに向かっているのかがわかるように、これが私の擬似コードです。
文字列の先頭から開始
回答の値に10を掛けます。
文字列から各文字を分割し、48dを引いて整数を取得します。元。学生は156を入力します。49は変数tempの最初の文字として格納されます。49から48を引きます。整数は1です。
回答の値に整数を追加します。
Inc esi(1文字右に移動)。
ループ。