2017-06-01 22 views
1

私たちは、このような初期化変数を作りたい:組立MOV命令のオペランド

name db 'zara ali' 

我々はバイトサイズの変数を作ってきたが、我々はそれが可能であるか

それに文字列を格納し??

、我々は、この命令を使用するとき:

MOV ecx, name 

をMOV命令で両方のオペランドが同じサイズでなければならないが、我々は、4バイトサイズのレジスタにバイトサイズの変数を格納しています。 どうすればいいですか?

答えて

7

name db 'zara ali'はちょうどので、それが一連​​のバイトだ

name db 'z' 
    db 'a' 
    db 'r' 
    db 'a' 
    db ' ' 
    db 'a' 
    db 'l' 
    db 'i' 

のための別の省略形です

name db 'z', 'a', 'r', 'a', ' ', 'a','l','i' 

の省略形です、最初の1のアドレスは、名前nameを与えています。

MOV ecx, nameは、異なるアセンブラで異なるセマンティクスを持ちます。 NASMで
それはecxにシンボルnameの値を格納する変数nameを読み取らない - それはMASM/TASMでTASM/MASM表記

mov ecx, OFFSET name 
lea ecx, name   ;This is an abuse of notation but valid in TASM 

に相当し、それはDWORDを読み出す(によって暗示アドレスnameにDWORDレジスタ(ecxなど)を使用して、最初の4バイト(zara)を読み取ります。
NASMのmov ecx, [name]またはmov ecx, DWORD [name]に相当します。

+0

賢いお尻になるには...エンベロープエキスパート: "名前"は単なるラベルであり、変数ではありません。実際、アセンブラは、次のデータのサイズや長さをチェックしません。初心者にとっては、 "db"を "data bytes"に変換する方が明らかでしょう。 – rkhb

+0

@rkhb私は同意します!しかし、まだ、私はあなたが私の答えを改善すべきと提案しているかどうかわかりません:) –

+0

いいえ、あなたの答えは良いとはっきりしています。それはちょうど私の2セントだった。 :-) – rkhb

関連する問題