• ベストアンサー

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 ・これに関しては全くわかりません。$がそのそもよくわかりません。 お忙しい中、誠に恐縮ではありますが、以上をご確認して頂き、 先輩方、ご教示宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.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.03j/nasmdoc3.html#section-3.2.5 3.5 Expressions NASMには2つの特別なシンボル($、$$)があります。 $はそれが使用された行の先頭アドレスを意味します。 $$はそれが使用されたセクションの先頭を意味します。 使用例: jmp $ ;無限ループ jmp ($-$$) ;セクション先頭へジャンプ

HackHack
質問者

お礼

sakusaker7さん、ご回答頂き誠にありがとうございます。 誤記が多くて誠に申し訳ございません。 ご教示頂いた知識、とても参考になり勉強になりました。 $と$$のご解説も、ネット上で調べた情報よりもsakusaker7さんのご解説の方が私にはより深く理解できました。 一度、コードを書いて実験してみようと思います。 心より感謝申し上げます。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

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

参考URL:
http://www.nasm.us/doc/
HackHack
質問者

お礼

Tacosanさん、ご回答頂き誠にありがとうございます。 ご教示頂いたサイト様の方、拝見させて頂き勉強してみます。 >自分で調べればよいかと. 仰る通りです。 再度、自分で調べてあせらず、じっくりと考えて行きたいと思います。 ご回答、心より感謝申し上げます。

関連するQ&A