プロが教えるわが家の防犯対策術!

いつも、お世話になっております。
小生、只今、WindowsXPSP3上でnasm0.99.6を使いアセンブリ言語を勉強しています。

今回質問させて頂き点を、ピックアップすると以下の構文です。

12行目のmov ax, word [msgBack]
16行目のmov word [es:di], ax
23行目のmov byte [es:edi], 'A'

50行目times 510 - ($ - $$) db 0

そして以下にソースコード全体を記述させて頂きます。
1[org 0]
2[bits 16]
3jmp0x07C0:start; far jmpする。
4
5start:
6movax, cs; csには0x07C0が入っている
7movds, ax; dsをcsと同じくする
8
9movax, 0xB800; ビデオメモリのセグメントを
10moves, ax; esレジスタに入れる
11movdi, 0; 一番上の頭の部分から書く
12movax, word [msgBack]; 書く予定のデータの住所を指定する
13movcx, 0x7FF; 画面全体に書くためには
14; 0x7FF(10進数 2047)個のWORDが必要
15paint:
16movword [es:di], ax; ビデオメモリに書く
17adddi,2; 1つのWORDを書いたので、2を加える
18deccx; 1つのWORDを書いたので、CXの値を1つ引く
19jnzpaint; CXが0じゃないと、paintにジャンプし、
20; 残りを書く
21
22movedi, 0; 一番上の頭の部分に書く
23movbyte [es:edi], 'A'; ビデオメモリに書く
24incedi; 1つのBYTEを書いたので、1を加える
25movbyte [es:edi], 0x06; 背景色を描く
26incedi; 1つのBYTEを書いたので、1加える
27movbyte [es:edi], 'B'
28incedi
29movbyte [es:edi], 0x06
30incedi
31movbyte [es:edi], 'C'
32incedi
33movbyte [es:edi], 0x06
34incedi
35movbyte [es:edi], '1'
36incedi
37movbyte [es:edi], 0x06
38incedi
39movbyte [es:edi], '2'
40incedi
41movbyte [es:edi], 0x06
42incedi
43movbyte [es:edi], '3'
44incedi
45movbyte [es:edi], 0x06
46
47jmp$; ここで無限ループに入る
48
49msgBack db'.', 0xE7; 背景に使う文字
50
51times510-($-$$) db 0 ; ここから509番地まで0で詰める
52 dw0xAA55; 510番地に0x55を、511番地に0xAAを
53; 入れておく

以下、私の憶測でコードの動作を記述させて頂きます。
12行目のmov ax, word [msgBack]
・axレジスタに、wordで表された、msgBackのアドレスを格納している。

16行目のmov word [es:di], ax
・wordのデータになる、es:di(esに対して、diがオフセットアドレスと見て)、axのデータを格納している。

23行目のmov byte [es:edi], 'A'
・byteのデータになる、es:ediに対して、'A'と言う値を格納している。

50行目times 510 - ($ - $$) db 0
・これに関しては全くわかりません。$がそのそもよくわかりません。

お忙しい中、誠に恐縮ではありますが、以上をご確認して頂き、
先輩方、ご教示宜しくお願い致します。

A 回答 (2件)

>12行目のmov ax, word [msgBack]


>・axレジスタに、wordで表された、msgBackのアドレスを格納している。

これは、msgBack 番地の内容を ax にロードしているのではないですか?


>23行目のmov byte [es:edi], 'A'
>・byteのデータになる、es:ediに対して、'A'と言う値を格納している。

edi じゃなくて、di ですよね。

>50行目times 510 - ($ - $$) db 0
>・これに関しては全くわかりません。$がそのそもよくわかりません。

$ も $$ もアセンブラー(NASM)の特殊シンボルです。

NASM Manual
http://www7a.biglobe.ne.jp/~iell/nasm/nasmdoc_2. …

3.5 Expressions

NASMには2つの特別なシンボル($、$$)があります。
$はそれが使用された行の先頭アドレスを意味します。
$$はそれが使用されたセクションの先頭を意味します。

使用例:
jmp $ ;無限ループ
jmp ($-$$) ;セクション先頭へジャンプ
    • good
    • 0
この回答へのお礼

sakusaker7さん、ご回答頂き誠にありがとうございます。

誤記が多くて誠に申し訳ございません。

ご教示頂いた知識、とても参考になり勉強になりました。

$と$$のご解説も、ネット上で調べた情報よりもsakusaker7さんのご解説の方が私にはより深く理解できました。

一度、コードを書いて実験してみようと思います。

心より感謝申し上げます。

お礼日時:2010/04/13 03:41

自分で調べればよいかと.



参考URL:http://www.nasm.us/doc/
    • good
    • 0
この回答へのお礼

Tacosanさん、ご回答頂き誠にありがとうございます。

ご教示頂いたサイト様の方、拝見させて頂き勉強してみます。

>自分で調べればよいかと.

仰る通りです。
再度、自分で調べてあせらず、じっくりと考えて行きたいと思います。

ご回答、心より感謝申し上げます。

お礼日時:2010/04/12 02:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!