NASMアセンブリの構文でわからない、書式があります。
いつも、お世話になっております。
小生、只今、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]
3 jmp 0x07C0:start ; far jmpする。
4
5start:
6 mov ax, cs ; csには0x07C0が入っている
7 mov ds, ax ; dsをcsと同じくする
8
9 mov ax, 0xB800 ; ビデオメモリのセグメントを
10 mov es, ax ; esレジスタに入れる
11 mov di, 0 ; 一番上の頭の部分から書く
12 mov ax, word [msgBack] ; 書く予定のデータの住所を指定する
13 mov cx, 0x7FF ; 画面全体に書くためには
14 ; 0x7FF(10進数 2047)個のWORDが必要
15paint:
16 mov word [es:di], ax ; ビデオメモリに書く
17 add di,2 ; 1つのWORDを書いたので、2を加える
18 dec cx ; 1つのWORDを書いたので、CXの値を1つ引く
19 jnz paint ; CXが0じゃないと、paintにジャンプし、
20 ; 残りを書く
21
22 mov edi, 0 ; 一番上の頭の部分に書く
23 mov byte [es:edi], 'A' ; ビデオメモリに書く
24 inc edi ; 1つのBYTEを書いたので、1を加える
25 mov byte [es:edi], 0x06 ; 背景色を描く
26 inc edi ; 1つのBYTEを書いたので、1加える
27 mov byte [es:edi], 'B'
28 inc edi
29 mov byte [es:edi], 0x06
30 inc edi
31 mov byte [es:edi], 'C'
32 inc edi
33 mov byte [es:edi], 0x06
34 inc edi
35 mov byte [es:edi], '1'
36 inc edi
37 mov byte [es:edi], 0x06
38 inc edi
39 mov byte [es:edi], '2'
40 inc edi
41 mov byte [es:edi], 0x06
42 inc edi
43 mov byte [es:edi], '3'
44 inc edi
45 mov byte [es:edi], 0x06
46
47 jmp $ ; ここで無限ループに入る
48
49msgBack db '.', 0xE7 ; 背景に使う文字
50
51times 510-($-$$) db 0 ; ここから509番地まで0で詰める
52 dw 0xAA55 ; 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
・これに関しては全くわかりません。$がそのそもよくわかりません。
お忙しい中、誠に恐縮ではありますが、以上をご確認して頂き、
先輩方、ご教示宜しくお願い致します。
お礼
今やっと解ったのですが、$xは0から始まるというのが解っていませんでした。 それが解ったとたんに理解できました。ありがとうございます。 しかし何とおバカな質問だったんだろう。