2017-04-06 3 views
0

初期化されたデータセクションに5つの文字列を保持するデータ配列を作成します。各文字列は正確に4文字です。各文字列には、最初の文字列の場合は「abcd」、2番目の文字列の場合は「efgh」などの初期データがいくつかあります。ヌル\0文字列には文字は必要ありません。どのようにアセンブリ言語で文字列の配列を初期化できますか?アセンブリ内の文字列の配列を初期化する

これは私がこれまでに考えることができるものである。

string db "abcdefghijklmnopqrst" 

は、いくつかのきれいな構文や方法はありますか?

私は、64ビットコードのためにnasmを使用しています。

+0

16,32,64ビットのコーディングはありますか?どのアセンブラを使用していますか?詳細があれば、より正確な応答が得られます。 –

+1

あなたが表示したソリューションに何が問題なのですか?どのような "クリーンな構文"を探していますか?配列は単なるバイト列であり、何も魔法ではありません。必要に応じて、そのデータを文字列として解釈することもできます。 –

+0

私のアプローチは、文字列の配列を初期化していることを直感的に示していないようです。それは、文字の単一の配列のように見えます。 –

答えて

3

最初に:アセンブリコードレベルでは、「配列」という概念はありません。開発者、あなたが解釈するのは設定するビットとバイトだけです。

あなたの例の配列を達成する最も簡単な方法は、自分のブロックに文字列を分割するために、次のようになります。

string1: db "abcd" 
string2: db "efgh" 
string3: db "ijkl" 
string4: db "mnop" 
string5: db "qrst" 

あなたは今ユニットとして参照することができ、個々の文字列のブロックを作成しました個別に最後のステップは、5列のそれぞれの先頭アドレスを含む新しいデータ要素を介して「アレイ」を宣言することであろう。

string_array: dq string1, string2, string3, string4, string5 

上記今5つのアドレス(各占有64ビット)を保持します。

1つは、配列のアドレスをコードセグメントのどこかのレジスタに取得します。あなたは、配列、コードのアプローチでやっていることを知らず

xor rdx, rdx   ; Starting at offset zero 
lea rdi, [string_array] ; RDI now has the address of the array 
mov rsi, [rdi+rdx]  ; Get the address of string1 

; Process String1 
; Get next string 

add rdx, 8    ; Get the next offset which is 64 bits 
mov rsi, [rdi+rdx]  ; Get the address of string2 

; Process String2 
; etc. 

異なる場合があります。次は、配列を横断し、各文字列自体を得ることについて移動するむしろ残酷な方法があります。

+0

'mov rdi、string_array'を使ってベース配列のアドレスを移動できますか? –

+0

@ KapilGarg - ここで見つけたドキュメントでnasmでさまざまなやり方で読むことをお勧めします - > http://www.nasm.us –