1

私はそれを試してみました:

section .data
promptmsg: db 'Enter integer: '
msgsize: equ $-promptmsg

section .bss       ;creating variables to store input
firstnum: resb 6
secondnum: resb 6

section .text
global _start

_start:

xor eax, eax
xor ebx, ebx
xor ecx, ecx
xor edx, edx

mov eax, 4          ;system call to write
mov ebx, 1
mov ecx, promptmsg
mov edx, msgsize
int 80h

xor eax, eax
xor ebx, ebx
xor ecx, ecx
xor edx, edx

mov eax, 3               ;system call to read
mov ebx, 0
mov ecx, firstnum
mov edx, 6
int 80h

push firstnum

xor eax, eax
xor ebx, ebx
xor ecx, ecx
xor edx, edx

mov eax, 4              ;system call to write
mov ebx, 1
mov ecx, promptmsg
mov edx, msgsize
int 80h

xor eax, eax
xor ebx, ebx
xor ecx, ecx
xor edx, edx

mov eax, 3                ;system call to read
mov ebx, 0
mov ecx, secondnum
mov edx, 6
int 80h

push secondnum

xor eax, eax
xor ebx, ebx
xor ecx, ecx
xor edx, edx

pop eax
pop ebx
add eax, ebx         ;attempt to add firstnum and secondnum and store in EAX

push eax

xor eax, eax
xor ebx, ebx
xor ecx, ecx
xor edx, edx

mov eax, 4          ;once again a system call to write
mov ebx, 1
pop ecx
mov edx, 7
int 80h

xor eax, eax
xor ebx, ebx
xor ecx, ecx
xor edx, edx

mov eax, 1             ;exit safely and return 0
mov ebx, 0
int 80h

すべての XOR 命令について申し訳ありません。システム コールに使用する前に、レジスタがクリアされていることを確認したかっただけです。まだアセンブリを学んでおり、どの命令がレジスタを空にするかわかりません。

これをコンパイル、リンク、実行すると、改行文字などの ENTER 文字を含める場合にのみ、2 つの整数を入力できます。整数を追加することはできないため、すでに問題が発生しています。したがって、両方を入力すると、プログラムから画面にそれ以上の出力が表示されず、終了します。

どうすれば修正できますか?

(この場合、ASM で C または C++ を使用することはできません。)

4

1 に答える 1

0

コードの欠落部分を記述することであるため、コードを「修正」することではありません。

区切りの空白を無視して、整数を解析する必要があります。それらを追加し、結果を文字列に変換します。次に、この文字列を出力します。scanforの呼び出しは、標準の C ライブラリを使用しているためstrtolprintfおそらく受け入れられません。

于 2013-01-21T17:28:40.570 に答える