0

私はこのコードを持っています:

section .data
   msg3 db 'Enter Two Strings: '
   msg3Len equ $ -msg3

section .bss
   string1Len resb 1
   string1 resb 0
   string2Len resb 1
   string2 resb 0

section .text
   global _start

_start:
   mov eax,4
   mov ebx,1
   mov ecx,msg3
   mov edx,msg3Len
   int 80h

   mov eax,3
   mov ebx,1
   mov ecx,string1
   int 80h

   dec al
   mov byte [string1Len], al

   mov eax,3
   mov ebx,1
   mov ecx,string2
   int 80h

   dec al
   mov byte [string2Len], al

   mov eax,4
   mov ebx,1
   mov ecx,string1
   mov edx,[string1Len]
   int 80h

   mov eax,4
   mov ebx,1
   mov ecx,string2
   mov edx,[string2Len]
   int 80h

   mov eax, 0
   mov ebx, 1
   int 80h

2 つの文字列の印刷に問題があります。余分な文字やゴミ文字を印刷します。また、文字列を 3 つ印刷すると、余分な文字が印刷されます。正しいように見えるコードの何が問題なのですか?

4

2 に答える 2

0

標準入力から読み取り、割り当てられていないメモリに書き込んstring1string2いる場合(少なくともその目的ではありません)。resb 0ゼロバイトのスペースを予約します (== スペースなし)。読み取ると予想される最長の文字列のサイズと同じだけのスペースを確保する必要があります。

もう 1 つの問題は、これらの変数のサイズが 1 バイトしかないにもかかわらず、string1Lenand string2Len( ) から 32 ビットを読み取っていることです。つまり、実際の変数を 3 バイト超えて読み取ることになります。mov edx,[string1Len]変数を dword にするか ( を使用resd)、movzx命令を使用してバイトを dword にゼロ拡張します (例: movzx edx,byte [string1Len])。

于 2013-08-26T15:35:32.520 に答える