2017-12-14 10 views
-4

'ecx'には「abc」のような文字列があります。アセンブリーバイトptr意味

のmovああ、バイトPTR [ECX + 0]
楽章ら、バイトPTR [ECX + 1]

それは正確に何をしますか?それは 'ああ'のようなものです。私は "a"という文字を持っていて、 "al"には "b"という文字がありますか?

+1

「ecx」があなたの文字列へのポインタである場合、yesです。なぜあなたはそれを試していないのですか? – Jester

+0

もし文字列自体が 'ecx'にあるなら、そのコードが何をするのかははっきりしません。文字列" abc "はあなたのプロセスにアクセス可能なメモリアドレスを形成しない可能性があります。しかし、あなたはおそらく "私はecxの文字列のメモリアドレスを持っている"を意味し、それはあなたの考えをするでしょう。そして、Jesterが書いたように、あなたは自分で試してみるべきです、少なくともあなたはデバッガの使い方を練習します。 – Ped7g

答えて

2

byte ptrは、メモリオペランドがワードまたはワードとは対照的にメモリ内のバイトを参照することを示します。通常、これはアセンブラが使用するレジスタからオペランドサイズを推測できるため省略することができますが、のような命令があり、そのサイズは推測できません。byte ptr,word ptrまたはdword ptrの接頭辞が必要です。

+0

また、MASMのようなアセンブラでは、データを宣言した方法に基づいてラベルに関連付けられた暗黙のオペランドサイズをオーバーライドするには 'mov al、byte ptr [my_dword_location]'が必要だと思います。 'dword'や' byte'やそれに続くラベルにマッチします。 –

1

メモリ内のデータへの参照を翻訳するときにアセンブラを支援する必要があることがあります。

byte ptr - >これは、単にアドレスからバイトをフェッチすることを意味します。 word ptrまたはdword ptrと記載されている場合は、ソースインデックスのアドレスから単語またはdwordが得られます。

あなたはbyte ptr例のようなものが必要な場合は、あなたが間接アドレスに即値を動かす:

mov ebx, OFFSET some_symbol ; or a pointer from another register 
mov [ebx], 10 

これは通常許可されません - アセンブラは、あなたが10とを望んでいるかどうか分かりません。 byteword、ダブルワード、または(64ビットコードで)クワッドワード。サイズ指定のYou need to make it explicit

mov byte ptr [ebx], 10 ; write 10 into a byte 
mov word ptr [ebx], 10 ; write 10 into a word 
mov dword ptr [ebx], 10 ; write 10 into a dword 
+0

OPは32ビットコードを使用しているため、16ビットの例を使用する必要はありません。また、['[dx]'は有効な16ビットアドレッシングモードでもありません。](https://stackoverflow.com/questions/12474010/nasm-x86-16-bit-addressing-modes)。また、あなたの最後の編集が私のスペル/その他の改良を上書きしました。 –

+1

@PeterCordesが修正されました☺これは私があなたをつまずく4回目ですStack Overflow Question Answers!それは今受け入れられますか? –

+0

あなたの最後の編集が悪化しました。 'byte ptr dx'はどのasm構文でも有効ではありません。私はそれを修正します。 –