2

文字列を整数に変換するプログラムがあります。ユーザーが有効な数値を入力する限り、プログラムは正常に機能します。ただし、入力された値が実際に数値であることを確認するためにエラーチェックを追加すると、いくつかの問題が発生しました。最初は、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

これで私がどこに向かっているのかがわかるように、これが私の擬似コードです。

  1. 文字列の先頭から開始

  2. 回答の値に10を掛けます。

  3. 文字列から各文字を分割し、48dを引いて整数を取得します。元。学生は156を入力します。49は変数tempの最初の文字として格納されます。49から48を引きます。整数は1です。

  4. 回答の値に整数を追加します。

  5. Inc esi(1文字右に移動)。

  6. ループ。

4

1 に答える 1

1

pushadとを取り除きpopadます。無効な文字が入力されるたびに、tryAgain に戻り、tryAgain に戻るたびに別の文字pushadが実行されます。

レジスタを保存する必要がある場合は、プロローグで保存し、エピローグで復元します。

于 2012-12-02T04:03:54.887 に答える