0

作成しようとしているプログラムについてサポートが必要です。プログラムは、標準入力から2つの数値を読み取り、それを保存し、それを使用して基本的な数学演算を実行してから返すことになっています。

ほとんどすべてが機能していると思います。ただし、結果は正しく印刷されません。たくさんのランダムな文字を印刷します。問題は、コード内で発生するASCIIからintまたはintからasciiへの変換に関係していると思いますが、確信が持てません。

入力から読み取るコードの部分は次のとおりです。

mov byte    [firstNum], 30
mov byte    [firstNum + 1], 0
mov     ah, 0Ah
mov     edx, firstNum
int     021H
movzx   esi, byte [firstNum+1]
mov     edx, firstNum+2 
add     esi, edx
mov byte    [esi], "$"

mov byte    [secondNum], 30
mov byte    [secondNum + 1], 0
mov     ah, 0Ah
mov     edx, secondNum
int     021H
movzx   esi, byte [secondNum+1]
mov     edx, secondNum+2
add     esi, edx
mov byte    [esi], "$"

どこ:

firstNum    resb    32      ; first number
secondNum   resb    32      ; second number
result      resb    32      ; result 

次に、文字列入力を整数に変換し、2つの値を加算し、整数から文字列に変換して結果を出力する部分を示します。

push dword  secondNum+2
call        _atoi
add         esp, 4
mov         ebx, eax
push dword  firstNum+2
call        _atoi
add         esp, 4
add         eax, ebx
push dword  10                  ; base of 10, decimal
push dword  result
push dword  eax
call        _itoa
add         esp, 12
printOut    result

誰かが私のコードの何が問題なのか教えてくれたら本当にありがたいです。ありがとう!

4

1 に答える 1

0

間違っているように見えることの1つatoiは、Cライブラリバージョンの場合、入力文字列をドル記号ではなくゼロで終了する必要があるということです。

また、セグメントレジスタが正しく設定されているかどうかもわかりません。int 21動作するにはDS、バッファが予約されているセグメントに設定する必要があります。

printOutさらに、それはマクロのように見えます。ナンセンスな出力を取得しているので、このマクロへの呼び出しを誤って設定しているか、マクロ自体にエラーがあることはかなり安全です。しかし、それがどのように機能するかはわかりません。そのため、コードのこのセクションの何が問題になっているのかを言うことはできません。たとえば、printOutがを使用している場合int 21、ドル記号のターミネータitoaが必要であり、代わりに0を使用します。

アセンブリコードが機能しない場合は、デバッガーが最適です。コードを1ステップ実行して、何が起こっているかを確認しましたか?

デバッガーがない場合は、入力セクションを削除して、出力セクションだけを試してください。eaxに42をロードし、これを文字列に変換して、標準出力に入れます。

于 2013-02-10T07:58:31.060 に答える