NASMアセンブリのセクションについてご教示ください。

このQ&Aのポイント
  • NASMアセンブリのセクションについての質問です。
  • セクションの役割や具体的な使い方について教えてください。
  • 特殊シンボル$$がどのセクションを示しているのか理解できません。
回答を見る
  • ベストアンサー

NASMアセンブリのセクションについてご教示ください。

NASMアセンブリのセクションについてご教示ください。 いつもお世話になっております。 前回も大変勉強になるご教示頂き誠に、感謝申し上げます。 小生、只今WinXPSP3上でNASM0.99.06を使用し、アセンブリ言語を勉強しています。 今回質問させて頂きたいのはNASMによる、セクションです。 NASMでは.text, .bss, .dataセクションがありますが、 例えば下記のアセンブリソースの、 一番最初に記述する[org 0]なども広義の意味でのセクションに該当するのでしょうか? ソースは以下の様になっております。 -----source.asm----- [org 0] [bits 16] jmp 0x07C0:start start: mov ax, cs mov ds, ax mov ax, 0xB800 mov es, ax mov di, 0 mov ax, word [msgBack] mov cx, 0x7FF paint: mov word [es:di], ax add di, 2 dec cx jnz paint mov edi, 0 mov byte [es:edi], 'A' inc edi mov byte [es:edi], 0x06 inc edi mov byte [es:edi], 'B' inc edi mov byte [es:edi], 0x06 inc edi mov byte [es:edi], 'C' inc edi mov byte [es:edi], 0x06 inc edi mov byte [es:edi], '1' inc edi mov byte [es:edi], 0x06 inc edi mov byte [es:edi], '2' inc edi mov byte [es:edi], 0x06 inc edi mov byte [es:edi], '3' inc edi mov byte [es:edi], 0x06 jmp $ msgBack db '.', 0xE7 times 510-($-$$) db 0 dw 0xAA55 -------------------------- 以上です。 最後から2行目の箇所に$$の特殊シンボルが使われており、 私としてはセクション(.textセクション等)が記述されていないのに、 $$はどこのセクションを示しているのかが分かりません。 そこで、書籍などで調べてみたところ、セクションとはそのコードがどこに置かれるかを決めるもので、 上記に記述させて頂いたコードだと、[org 0]がある為、 このコードは0000 0000に配置される事になり、 $$は0000 0000を指し示すものだと思っています。 この解釈で間違っていないでしょうか? お忙しい中、大変申し訳ございませんが、先輩方ご教示宜しくお願い致します。

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

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

>一番最初に記述する[org 0]なども広義の意味でのセクションに該当するのでしょうか? といって良いのでは。厳密には違うかもしれませんが。 セクションとかは、どういう出力フォーマットでデータを生成するかにも依存する話です。 たとえば、バイナリ形式(-f binary)への出力だと、"Any code which comes before an explicit SECTION directive is directed by default into the .text section"(7.1.3 http://www.nasm.us/doc/nasmdoc7.html 参照)となってます。 逆に、elf形式で質問文のソースをアセンブルしようとしても、エラーになるかと。 なので、 >org 0]がある為、このコードは0000 0000に配置される事になり、 >$$は0000 0000を指し示すものだと思っています。 は、バイナリ形式への出力でしょうから、あってるかと。 試しに下記コードをアセンブルしたら、どういう結果が生成されるか確認したらよいかも: [org 0xCAFEBABE] [bits 32] dq $$

HackHack
質問者

お礼

osamuyさん、ご回答頂き誠に感謝申し上げます。 ご教示頂いた内容も、ものすごく勉強になりました。 更にはサンプルソースまで、掲載していただけるとは、本当にありがとうございます。 心より感謝申し上げます。 ありがとうございました。

関連するQ&A

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

  • NASMでソースプログラムのアセンブルが出来ないです。

    nasm2.08.01.win32.zipをダウンロードしコマンドプロンプトのpathを指定しメモ帳でソースプログラムを ; myfile.asm  org 100H section .text start: mov ah, 02Hmov dl, 41H int 21H mov ah, 4CH int 21H と記述し拡張子asmで保存したものを コマンプロンプトでnasm -f bin myfile.asm -o myfile.com で開始しようするとunable to open input myfile.asmで出てしまい アセンブル出来ません、OSはXPです、アセンブリ言語の勉強をしたいのですがNASMが機能しないと始まらないので非常に困っています、 詳しい方にお力添え頂けたら幸いです、どうぞよろしくお願いします。

  • BIOSによる表示

    こんばんわ。お世話になります。 今, 自分はフロッピーをさした状態でPCの電源を入れるとそのフロッピーに格納されているプログラムが動くようにしたいと思っています。 その手始めとして, 文字を表示させたいのですが, どうもよくわかりません。 今までに自分は mov ah,0 mov al,03 int 10h で画面設定をし, mov ax,b800 mov es,ax mov di,0 mov byte ptr es:[di],41 mov ax,ff00 int 10h hlt なんてアセンブラを書きましたがwindows付属のdebugではこれはコンパイルできません。コンパイルできたと仮定して, これをrawriteでフロッピーに書き込むつもりです。 現在, 私のもとにある最も簡単なアセンブラはdebugです。nasmもありますが, 不勉強のため 使い方が良くわかりません。 有効なソースをお教えください。よろしくお願いします。

  • アセンブリ言語で。

    下のようなソースをアセンブルすると 6:error: parser: instruction expected という、エラーが出ます。 mov ah,2 mov dl,DATA int 21h mov ax,4c00h int 21h DATA byte 'A' 6行目に問題があるようなので下のように書き直したらきちんと動作しました。どうして、上のような記述ではうまくいかないのでしょうか?? mov ah,2 mov dl,'A' int 21h mov ax,4c00h int 21h 環境はwindowsXPでnasmとalinkを使っています。 nasmw test.asm -fobj alink test.obj -oEXEとしてアセンブルしました。 わかる方お願いいたします。

  • NASMが動かない。

    NASMをwindows7にインストールしました。 次のようなソースをmathandcomp.asmというファイル名で保存し、 コマンド・プロンプトで nasm mathandcomp.asm -o mathandcomp.com のようにすると、mathandcomp.comが生成されるそうですが、エラーが出てしまいます。 下記のメッセージが出るはずなんですが、手順をおしえていただけますか。 NASMのバージョンはnasm-2.08.01です。 http://www.nasm.us/ org 100h mov dx,mesg mov ah,9 int 21h mov ah,4Ch int 21h mesg db 'Math with PC,PC through Math! How wonderful!',0Dh,0Ah,'$'

  • nasmでhello, world

    FreeBSD4.6.2にを使っているのですが、 以下のソースはコンパイル、実行はできるのですが 、 hello, worldが画面上に表示されません。 ebxに代入する標準出力って1であっていますよね?? どこが間違っているのかわかりません。教えて下さい。 アセンブルは nasm -f elf hello.asm ld hello.o ./a.out とやりました。 以下が ソースです。 section .data msg db "Hello, world!" section .text global _start _start: mov eax, 4 mov ebx, 1 mov ecx, msg mov edx, 13 int 80h mov eax, 1 mov ebx, 0 int 80h

  • NASM(独習アセンブラのサンプルソース)について

    独習アセンブラ初版5刷のサンプルソース(リスト6.7、102p)での疑問です 下の方にあるコメントアウトしているputc関数って何のためにあるんですか? どこからも呼び出してないのでいらないと思うのですが… アセンブラはNASMです ※本に書かれてるソースはコメントアウトしてません、コメントアウトしてもアセンブルできました bits 16 org 100h mov dx,sfile mov al,0 mov ah,3dh int 21h jc endquit mov [ifh],ax mov dx,dfile mov cx,0 mov ah,3ch int 21h jc endquit mov [ofh],ax readb: mov bx,[ifh] mov dx,buf mov cx,1 mov ah,3fh int 21h test cx,ax jz endquit jc endquit mov bx,[ofh] mov dx,buf mov cx,1 mov ah,40h int 21h jmp readb endquit: mov bx,[ifh] mov ah,3eh int 21h mov bx,[ofh] mov ah,3eh int 21h mov ax,4c00h int 21h ;putc: ; push ax ; mov ah,2h ; int 21h ; pop ax ; ret ifh dw 0 ofh dw 0 sfile db "srcfile.txt",0 dfile db "destfile.txt",0 buf resb 2 私が思うにリスト6.6(100p)のreadbラベルのところでこれを呼び出してるのでソースを流用して消し忘れてるだけなんでしょうか?

  • アセンブリのプログラムです。

    アセンブリのプログラムで質問があります。cのプログラムのオブジェクトファイルを生成して、objdumpというコマンドでアセンブリ言語を表示させてみたのですが、全然分からなくて、困っています 。どうか、アセンブリプログラムの、解説をよろしくお願いします。できれば、1文1文解説してもらえるとありがたいです。あと、スタックの動き、確保などの解説もあるとありがたいです。よろしくお願いします。 cのプログラム int fact(int p) { if(p<=1) return 1; else return fact(p-1); } アセンブリのプログラム push %ebp mov %esp,%ebp sub $0x8,%esp cmpl $0x1,0x8(%ebp) jg 15 <_fact+0x15> movl $0x1,-0x4(%ebp) jmp 24 <_fact+0x24> mov 0x8(%ebp),%eax dec %eax mov %eax,(%esp) call 0 <_fact> mov %eax,-0x4(%ebp) mov -0x4(%ebp),%eax leave ret nop nop nop

  • NASMについての質問です。

    NASMについての質問です。 mov ah, 02h mov dl, 31h int 21h という内容のASMファイルをつくり、それをNASMで実行ファイルにし、実行しようとしたのですが、うまくいきません。 コマンドプロンプトで、 nasm.exe -f bin test.asm -o myfile.com というコマンドを打って実行ファイルにしました。きちんとmyfile.comは作られるのですが、しかし、myfile.comを実行しても何も表示されませんでした。(なぜかコマンドプロンプトの文字のフォントが変わりましたが) それならと思い、今度は、 nasm.exe -f bin test.asm -o myfile.exe というコマンドを打ち、実行してみました。ちゃんとmyfile.exeは作成されるのですが、やはりうまく実行できません。上のソースコードなら、文字が一文字表示されるはずですが、なにも表示されませんでした(前回と同じくコマンドプロンプトのフォントが変わっただけです)。 当方、一応コンピュータ系の専門学校に通っているのですが、アセンブラのことについては完全な初心者です。NASMをさわるのも初めてです。わけがわからなくて困っています。 どうにかしてアセンブリ言語のコードを実行ファイルにして、それを動かしてみたいのですが、どうすればいいでしょうか? 追伸 長文すいません。

  • MINIXのソースはあるのでしょうか?

    MINIXの本に以下のソースの一部があり、わからないことが5つあります。 (1)#0x20の#の意味 (2)_rebootと_wrebootの意味の違い (3)_vec_tableを0:0番地に転送する意味 (4)movwの意味 (5)out 0x20などポートの意味、0x20だけでなくポートについて詳しく知りたい。 等 また、AT互換機で動く、MINIXのすべてのソースも探しています。 よろしくお願いいたします。 _reboot: cli mov ax, #0x20 out 0x20 call resvec int 0x19 _wreboot: cli mov ax, #0x20 out 0x20 call resvec xor ax,ax int 0x16 int 0x19 resvec; cld mov cx, #2*65 mov si,#_vec_table xor di, di mov es, di rep movw ret .data _vec_table: .zerow 130

専門家に質問してみよう