1

現在、(a?) ユーザーが入力した文字列にヌル ターミネータを追加しようとしています。

.386
.model flat, stdcall

WriteFile PROTO STDCALL:DWORD, :PTR, :DWORD, :PTR DWORD, :PTR OVERLAPPED
ReadFile  PROTO STDCALL:DWORD, :PTR, :DWORD, :PTR DWORD, :PTR OVERLAPPED
GetStdHandle PROTO STDCALL:DWORD

.data
    buff            DB 100h DUP(?)
    stdInHandle     DWORD 0
    bytesRead       DWORD ?

.code
    start:
            ;read string from stdin
            INVOKE GetStdHandle, -10
            MOV stdInHandle, eax
            INVOKE ReadFile, stdInHandle, BYTE PTR[buff], 100, ADDR bytesRead, 0

            ;append null terminator on CR,LF
            MOV eax, bytesRead
            MOV edx, BYTE PTR[buff]
            SUB eax, 2
            AND BYTE PTR [eax+edx], 0
            RET
    END start

でのアセンブルを拒否しMOV edx, BYTE PTR[buff]、エラーが発生します。
error: Invalid combination of opcode and operands (or wrong CPU setting).

したがって、レジスタedxMOVに値を入れることができないと仮定しています。したがって、ターミネータを文字列BYTE PTR[buff]に適用しようとするこの方法が機能するかどうかをテストすることさえできません。NULL

私の質問は、上記のコードの何が問題なのかということです (edx の代わりに別のレジスタを使用する必要がありますか?)

NULLターミネータを文字列 に適用する最良の方法は何ですか?

4

3 に答える 3

2

バイト値を dword サイズのレジスタに移動することはできません。などのバイトサイズのレジスタを使用するかdl、 でゼロ拡張する必要がありmovzxます。バイトを扱っているので、最初のオプションを使用することをお勧めします。

于 2012-10-05T14:37:20.550 に答える
1

これは非常に一般的であるため、MASM32 ランタイムはこの機能をランタイムの一部として提供します。関連するコードを含めるだけです。

include \masm32\include\masm32rt.inc

次に、StripLF関数を次のように使用します。

invoke StripLF, addr buff

現在の問題を解決するには (手動で行いたい場合)、代わりに のアドレスを移動する必要がありbuffますedx

mov edx, offset buff
于 2012-10-05T15:05:29.587 に答える