2016-11-02 10 views
1

このコードでは、_を配列に挿入しようとしていますが、このコードで何が問題なのかわかりません。 _が配列に挿入されているときに突っ込まれているようです。コードを実装または修正するためのよりよい方法はありますか?アンダースコアの配列

.data 
strUnderscore BYTE 20 DUP (?)    ;the array 
.code 
mov ECX,stringLength 
mov ESI, OFFSET strUnderscore 
L1: 
mov strUnderscore[ESI], '_'   ;the code runs but stucks here 
inc ESI 
loop L1 

mov EDX, OFFSET strUnderscore 
call WriteString 

答えて

3

ループが開始する前に、ESIはすでにstrUnderscoreをポイントしています。これは、そのように初期化するためです。一方、行

mov strUnderscore[ESI], '_' 

はstrUnderscore + ESIに対処する文字を書き込もうとします。それは正しくありません。 C-のような用語では、あなたが今持っていることは次のとおりです。

char *esi = strUnderscore; 
while(...) 
{ 
    strUnderscore[(int)esi] = '_'; 
    esi++; 
} 

あなたはランニングインデックス、または実行中のポインタのいずれかをしたいです。 ESIを0に初期化する(インデックスとして使用する)か、movコマンドの宛先アドレスをbyte ptr [ESI]に変更してください。

また、LOOPは悪いコマンドです(ルックアップ)。代わりにデクリメントと条件付きジャンプを考えてみましょう。あなたのコード内

+1

または '担当者stosb'を。 –

+1

OPはまだ非常に基本を学んでいます。彼女はループをデバッグしましょう。 –

+0

movの宛先アドレスコマンドを[ESI]に変更したとき、プログラムを実行できませんでした。その行には無効な命令オペランドがあります。何が原因なのか分かりますか? – student001

1

2つのエラー:

  • ESIは、ポインタではなく、インデックスです。
  • コンパイラは "_"のサイズを認識しません。

のは、それらを修正してみましょう:代わりに、手動バイトループの

.data 
strUnderscore BYTE 20 DUP (?)    ;the array 
.code 
mov ECX,stringLength 
mov ESI, OFFSET strUnderscore ;◄■■ ESI IS POINTER TO THE VARIABLE. 
mov AL, '_'     ;◄■■ MOVE THE "_" INTO A ONE BYTE REGISTER. 
L1: 
mov [ESI], AL     ;◄■■ USE THE POINTER ESI, THE VARIABLE IS NOT NECESSARY. 
inc ESI 
loop L1 

mov EDX, OFFSET strUnderscore 
call WriteString 
+1

に変更し、' al'はループ全体で変更されないので、 'mov al、 '_'は' L1: 'の前に置くことができます。 :) – Ped7g

+0

@ Ped7g、あなたの提案で編集:) –

関連する問題