• ベストアンサー

アセンブラの .= について

下記のようなコードで、. = start + 3/. = _start + 4 の処理について教えて頂ければ幸いです。 .globl _start; _start: jmp skip nop . = _start + 3 . = _start + 4 .byte 0 skip:

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

  • ベストアンサー
  • ninoue
  • ベストアンサー率52% (1288/2437)
回答No.2

先ずアセンブラマニュアルの中に説明がある筈ですので調べて下さい。 "gas アセンブラ マニュアル" としてサーチ ==> "gnu アセンブラ マニュアル" ==> GASリンク集 - プログラミング言語リンク集 http://asm.sourceforge.net/ ..... http://sourceware.org/binutils/docs-2.23.1/as/Dot.html#Dot 5.4 The Special Dot Symbol The special symbol `.' refers to the current address that as is assembling into. Thus, the expression `melvin: .long .' defines melvin to contain its own address. Assigning a value to . is treated the same as a .org directive. Thus, the expression `.=.+4' is the same as saying `.space 4'. http://translate.google.com/ にコピペして翻訳 5.4特殊なドット記号 特殊記号`。などへのアセンブルされている現在のアドレスを参照します。したがって、表現`メルビン:長い'。自身のアドレスを含むようにメルビンを定義しています。に値を割り当てる。 。ORGディレクティブと同じように扱われます。したがって、。=。+4'は`発言として同じ表現`です。スペース4 '。 次の命令、或いはデータ等のアドレスを設定するのに使われます。 . = _start + 3 . = _start + 4 と続けて使う場合、前の ". = _start + 3" は無駄なだけです。 以上の他にも日本語のマニュアルがある筈なのでサーチしてみてください。

v-north
質問者

お礼

早々のご回答ありがとうございます。リンク集をたどる事も無く、書かれている内容でなるほど。との思いです。jmp/nopが3バイト(i386)なのですが、アドレス4以降にデータ領域するの旨を保障するためだったんですね。 追伸 実は. = _start + 3の3ですが、コンパイルオプションによるマクロ定義になっていました。

その他の回答 (1)

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.1

アセンブラといっても色々ありますけど、お使いのアセンブラは何でしょうか?

v-north
質問者

補足

早々のご連絡ありがとうございます。たぶんgasではないかと思っています。

関連するQ&A

  • アセンブラで教えてください

    富士通のFRマイコンをつかってます。 演算結果で分岐するようにしたいのですが、うまくいきません。 R1にいれたFFから、-1引いて、Z=1になったら, STRARTに飛びたいのですが、Aにしか飛んでいないようです どこがまずいでしょうか? その前の命令(NOP)が長すぎると計算できないことはありますか? ; START: LDI:32 #000000FFH,R1 A: NOP (NOPは1000行) NOP ・ ・ ADD2 #-1,R1 BNE A BRA START ; END:

  • アセンブラできません。

    初心者です。 アセンブリ言語で1~9の数字を連続的に表示するプログラムを書いたのですが、アセンブラする時 「error A2016 expression expected」というエラーメッセージが出てアセンブラすることができません。 プログラムの内容は下記↓のものです。 何が原因でしょうか? CODE SEGMENT ASSUME DS:CODE,CS:CODE,ES:CODE,SS:CODE ORG 100h START: mov bl,30h jmp aa aa: mov ah,02h mov dl,bl int 21h mov ah,06h mov dl,0ffh int 21h jnz bb: mov ah,02h mov dl,08h int 21h inc bl cmp bl,39h ja START jmp aa bb: int 20h CODE ENDS END START

  • アセンブラ初心者です。

    アセンブラ初心者です。 MacOs上のターミナルでgccをつかいアセンブラのソースコードを表示させてみたら .cstring LC0: .ascii "%d \0" .text .globl _main _main: pushl %ebp movl %esp, %ebp pushl %ebx subl $36, %esp call L9 "L00000000001$pb": L9: popl %ebx movl $1, -16(%ebp) jmp L2 L3: movl $1, -12(%ebp) jmp L4 L5: movl -16(%ebp), %eax imull -12(%ebp), %eax movl %eax, 4(%esp) このようになったのですが1つ疑問があります。それはjmp命令のところでjmp L2またはjmp L4とありますがL2とL4のソースコードは表示されていません....。この部分はどうして表示されないのでしょうか?またどのようになっているのでしょうか?教えてください><ちなみにfor文をつかった単純なかけ算のプログラムをCで書きました。

  • アセンブラのタイマー割り込み

    ちょと長いですがプログラムおいときます 下のプログラムでは割り込みをスイッチで行うのですが スイッチを使わない割り込みをするにはタイマーがいいのではと聞きましたが 私にはわからなかったので教えていただきたいです どこをどう変えたら起動できるでしょうか? 使っているものはマイコン(R8C15)です 内容とか足らないのかもしれませんが何でも言ってください すみませんがよろしくお願いします .INCLUDE sfr_r815.inc ;プログラム部分 .SECTION PROGRAM, CODE .ORG 0D000h Start: LDC #0500h, isp LDINTB #VarVector JSR SetClock20MHz JSR InitPort JSR InitKeyInputIntr MOV.B Dummy, r0h FSET i Loop: BCLR p1_1 JSR Wait2s BSET p1_1 JSR Wait2s JMP Loop ;外部クロックに切り替えるサブルーチン SetClock20MHz: BSET prc0 BSET cm13 BSET cm15 BCLR cm05 BCLR cm16 BCLR cm17 BCLR cm06 NOP NOP NOP NOP BCLR ocd2 BCLR prc0 RTS ;ポートの初期化を行なうサブルーチン InitPort: MOV.B #00000110b,drr MOV.B #00000110b,p1 MOV.B #00000110b,pd1 RTS ;キー入力割り込みの初期化を行なうサブルーチン InitKeyInputIntr: BCLR ki0pl BSET ki0en MOV.B #01h, kupic RTS ;2秒待ちサブルーチン Wait2s: MOV.W #200, r1 Wait2s_1: JSR Wait10ms SBJNZ.W #1, r1, Wait2s_1 RTS ;10m秒待ちサブルーチン Wait10ms: PUSH.W r0 MOV.W #28571,r0 Wait10ms_1: SBJNZ.W #1,r0,Wait10ms_1 POP.W r0 RTS ;キー入力割り込み処理ルーチン KeyInput: Start1: MOV.B #10001001b,pd1 MOV.B #00000000b,p1 MOV.B #10111000b,pd3 MOV.B #00000000b,p3 Syoki01: MOV.W #2,r1 BSET p1_3 ;M BCLR p3_3 ;SDI Loop1: MOV.W #2,a1 GYOU: MOV.W #9,a0 CP00: BSET p3_4 ;CP=H BCLR p3_5 JSR wait1 BCLR p3_4 ;CP=L JSR wait1 BSET p3_4 ;CP=H BCLR p3_5 JSR wait1 BCLR p3_4 ;CP=L JSR wait1 SBJNZ.W #1,r1,CP00 BNOT p3_3 ;SDI MOV.W #2,r1 SBJNZ.W #1,a0,CP00 LOAD0: BSET p3_4 ;CP=H ;BSET p3_5 ;LOAD JSR wait1 BCLR p3_4 ;CP=L BCLR p1_0 ;DIO BSET p3_5 ;LOAD JSR wait1 BNOT p3_3 ;SDI SBJNZ.W #1,a1,GYOU MandDIO: BSET p1_0 ;DIO BNOT p1_3 ;M JMP Loop1 wait1: MOV.W #30,r2 wait001: SBJNZ.W #1,r2,wait001 RTS REIT ;その他の割り込み処理ルーチン NOTUSE: REIT ;データ(作業領域)部分 .SECTION WORK,DATA .ORG 0400h Dummy: .BLKB 1 ;可変ベクタテーブル .section VARIABLEVECTOR, ROMDATA .org 0F000h VarVector: .lword NOTUSE .lword 0 .lword 0 .lword 0 .lword 0 .lword 0 .lword 0 .lword 0 .lword 0 .lword 0 .lword 0 .lword 0 .lword 0 .lword KeyInput .lword NOTUSE .lword NOTUSE .lword NOTUSE .lword NOTUSE .lword NOTUSE ;リセットベクタ部分 .SECTION FIXVECTOR, ROMDATA .ORG 0FFFCh Reset: .LWORD Start | 0FF000000h .END

  • アセンブラ言語がわかりません。

    初心者です。まとを得ていない質問でしたらすみません。 C言語は理解できる程度なのですが、アセンブラのコードを書く事ができません。 今アセンブラ言語を学び始めた所ですが、「jr」「jarl」「jmp」などの分岐命令の指定の方法がわかりません。 C言語でいうとどういうコードを書いた時に、このような命令を出力できますでしょうか。 本を読んでも、この上記の命令の意味は書いてあるのですが、実際出力が出来なかったもので。 またアセンブラ言語を学ぶためにいい方法などありましたらお教えく頂けないでしょうか。 よろしくお願いします。

  • VBA like演算子について

    VBA like演算子について 下記コードで”パターン文字列が不正です”とエラーで止まってしまいます。 For n = 3 To 89 If n Like "[5-7]" Then GoTo Skip_Line・・・・(1) If n Like "[39-70]" Then GoTo Skip_Line・・・(2)     処理・・・・・ Skip_Line: Next n nは行数で5-7行目と39-70行目を処理せずに飛ばそうとしています。 (1)はうまくいくのですが(2)の方で”パターン文字列が不正です”とエラーで止まってしまいます。 どなたかお知恵をおかしい頂ければ幸いです。

  • PIC16のアセンブラ、あなたならどう書く?

    PIC16のアセンブラ、あなたならどう書く? こんにちは、PIC16シリーズのアセンブラについての質問です。MPASMのプログラム書き始めて3日ぐらい目です。すこしずつ、インストラクション・セットやアーキテクチャを把握してきた感じです。 C言語調で書きました下記の様なIF-ELSEをMPASMで書きたい時、皆さんならどの様に記述されますか?人に見られる可能性のあるコードですので、ちびっとぐらいは格好つけないといけない状態です(汗)。   //===== Increase var0/1 =====   if( sel == 0x00 ) {     var0 ++;     var1 = 0;   } else {     var1++;     var0 = 0;   } 下記は、自分なりのコードとそのコメントに当たります。   ;===== Increase var 0/1 =====   MOVF   sel, W    ; Switch by sel   BTFSS  STATUS, Z  ; ..   GOTO   $+4     ; ..   INCF   var0     ; Case sel==0, var0++   CLRF   var1     ;        var1=0   GOTO   $+3     ;   INCF   var1     ; Case sel!=0, val1=++   CLRF   var0     ;       val0++   NOP          ; Switch-close もちろん、記述方法は記述者の好みがありますから、良し悪しではなく参考的な回答だと嬉しいです。こういう方が常識的だとか、こう記述すると後で見やすいとか、好き嫌いでもかまいません。よかったらご意見ください。よろしくお願いいたします。

  • アセンブラで割り算

    アセンブラ記述で割り算を実現させたいのですがよくわかりません。 下記条件でどのように実現すればよいでしょうか。 ・8ビット÷4ビット ・命令セットは  LDL, LDH, MOV, ADD, SUB, SRA, SR, SL, AND, OR, JE, JMP, CMP, LD, ST, HLT ・レジスタは16ビット ・レジスタは8個 です。 「被除数の上位4ビットと除数を比較して商を求めて、余りに被除数の次ビットを連接する」 の繰り返しでできると思っているのですが、アセンブラ表記がわかりません。 よろしくお願いします。

  • アセンブラに関する質問

    ↓のソースをMASMでコンパイル&リンクして実行すると  入力まではできるのですが、入力した直後に   「このプログラムで無効な処理が発生したため、強制    終了されます。全てのプログラムを、終了してから    再起動してください」 と表示され、そのメッセージが表示されたウィンドウの下の方の「詳細」をクリックすると    「プログラムで一般保護エラーが発生しました     エラーが起きたアドレス 9A00:10000     サービスへの割り込み なし」     と表示されました     実行したのは↓にソースですが、何がいけなくて     このエラーが出たのでしょうか・・(OSはME) CODE SEGMENT ASSUME DS:CODE,CS:CODE,ES:CODE,SS:CODE ORG 100h START: mov ah,0Ah mov dx,offset BUFF int 21h mov ah,09h mov dx,offset BUFF2 int 21h BUFF db 54,87,5 dup(?) BUFF2 db 'testtest' '$' code ends end start

  • 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を指し示すものだと思っています。 この解釈で間違っていないでしょうか? お忙しい中、大変申し訳ございませんが、先輩方ご教示宜しくお願い致します。