2017-03-12 9 views
1

私はかなり可能だと確信していますが、そのように宣言されたときに.dataセクションのデータにアクセスする方法がわかりません。.data内の特定のデータにアクセスする方法

msg: db 0xEA, 0xBA, 0x35, 0xB4, 0x88, 0x24, 0x14, 0x2C, 0xA1, 0x97, 0x5F, 0x1B, 0x56, 0xFA, 0xA3 

たとえば、4番目をレジスタに移動したい場合、どうすればよいですか?

+0

私は実際これを閉じるために投票したかったのですが、質問の基本的な性質にもかかわらず、私は本当に近いものは見ません。 –

答えて

0

これは非常に簡単です。ここではそのためのインテルの表記があります:

mov al, [msg+3] 

この回答へのコメントでは、あなたのフォローアップの質問に対処するために、あなたは、32ビットモデル用(使用を16ビットモデルを仮定し、そのような配列を反復処理することができますEBXなど)(また、私はあなたの配列の最後には0xFFを追加したことに注意してこれを行うには、他の多くの方法がありますが、これはただ一つである):。

 mov bx, msg 
next: 
    mov al, [bx] 
    cmp al, 0xff 
    je done 
    call printAL 
    inc bx 
    jump next 
done: 
    ret 

msg: db 0xEA, 0xBA, 0x35, 0xB4, 0x88, 0x24, 0x14, 0x2C, 0xA1, 0x97, 0x5F, 0x1B, 0x56, 0xFA, 0xA3, 0xFF 

このコードは、あなたが持っていることを前提としていalで何かを行うためにprintALと呼ばれる関数が定義されていて、このコードを他の場所から呼び出したことがあります(したがって、ret)。

+0

私が言ったように、それは非常に基本的な問題だと分かっています。とにかく、お返事ありがとうございました。 しかし、私は以前のものに関連した別の質問ました:私はループを使って配列を通過する場合、私は以来行うことになってる方法: MOVら、[MSG +「登録」] はしていません仕事? この場合に使用する特別なレジスタはありますか? –

+0

私はあなたに役立つ追加コードを追加しました。元の回答が問題を解決した場合は、その回答を受け入れる必要があります。さらに、コメントに新しい質問をするのではなく、本当に新しい質問をする必要があります。 –

+1

@ B.Wing 'mov al、[msg + eax]'が動作するので、何がうまく動作していないのか分かりません。 (おそらく、あなたは16bリアルモードのコードをしようとするマゾヒストですが、いくつかの組み合わせは合法です:https://courses.engr.illinois.edu/ece390/books/artofasm/CH04/CH04-2.html#HEADING2-35。 ..とにかく、アセンブリで合法であることを「推測できません。インテルの指導ガイドで有効なものと各指導の仕組みをチェックしてください。」 – Ped7g

関連する問題