NASMかNASKの文法の本

このQ&Aのポイント
  • MASMと構文が異なるため、NASM/NASKでエラーが発生しました。
  • NASM/NASKの構文について詳しく載っている本を探しています。
  • NASM/NASKでのオフセットとアドレス値のセット方法について教えてください。
回答を見る
  • ベストアンサー

NASMかNASKの文法の本

NASMかNASKのアセンブラを使っているのですが、MASMと構文が異なっている?せいか、エラーなりました。 MASMでは DW offset ADR_KOKO DW seg ADR_KOKO でOKだと思いますが、NASM/NASKではどうするのでしょうか? NASM,NASMの文法など詳しく載っている本などありますか?(洋書でも構いません。) DW 0 ; A---> オフセット DW 0 ; B---> セグメント ADR_KOKO: ;ここのオフセットとアドレス値をA,Bにセットしたい mov eax, 1  ... RET

  • roox2
  • お礼率1% (1/79)

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

提示したページからディレクトリを上に行って全体の目次を見るとかはしましたか? http://www.yuasa.kuis.kyoto-u.ac.jp/~nobu/study/nasm/chap3.html#3.6 3.6 SEG and WRT seg演算子はシンボルのセグメントベースを返す。これはシンボルのオフセットに関して定義される(?)。 mov ax, seg symbol mov es, ax mov bx, symbol はes:bxを有効なポインタsymbolにロードする。 16ビットのセグメントやグループは重なってしまうかもしれないので、必要に応じて異なるセグメントベースを用いてシンボルを参照する場合がある。 NASMでは、このためwrt(With Reference To)キーワードを用いる。 mov ax, weird_seg ; weird_segはセグメントベース mov es, ax mov bx, symbol wrt weird_seg はes:bxを、異なるが機能は同じであるシンボルへのポインタ symbolにロードする。 NASMはfar(セグメント間)コール、ジャンプをcall segment:offsetでサポートする。ここでsegmentとoffsetは即値を表す。 farプロシージャを呼ぶためには、 call (seg procedure):procedure call weird_seg:(procedure wrt weird_seg) とする。分かりやすくするため、かっこを書く。 上の最初の使い方と同じ意味にcall far procedureがある。 jmpはcallと同じ働きをする。 データセグメントでデータへのfarポインタを宣言するには、 dw symbol, seg symbol とする。

その他の回答 (1)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

どこでnasmを入手したかわかりませんけど、開発元でダウンロードできる SourceForge.net: Files http://sourceforge.net/project/showfiles.php?group_id=6208 ドキュメントでは不足ですか? MASMユーザーへのクイックスタートって項目もありますよ。 探したら日本語訳もありました http://ryujin.kuis.kyoto-u.ac.jp/~nobu/study/nasm/chap2.html#2.2 2.2.2 NASM Requires Square Brackets For Memory References NASMでは、メモリの内容を参照するときは [ ] をつけて、アドレスを参照するときにはつけない。故に、 foo equ 1 bar dw 2 だと、 mov ax, foo は、常にコンパイル時の値(EQUでも変数のアドレスでも)を指し、 mov ax, [bar] は、変数barの内容を指す。 また、NASMではoffsetはいらない。すなわち、 mov ax, offset bar(MASM)=mov ax, bar(NASM) となる(ともに、変数barのアドレスを表す)。 MASMのコードをNASM用に直したければ、%idefine offset とする。

roox2
質問者

補足

回答ありがとうございます。オフセットは理解しましたが、セグメント値はどのように取得するのでしょうか?

関連するQ&A

  • インラインアセンブラの関数について質問です。

    C言語で書かれたプログラムの中に、アセンブラで書かれた関数を使うため、インラインアセンブラで関数を作っていたのですが、私の能力の限界を感じたので、是非、ご教授願います。以下に示します。 元のアセンブラの関数write_mem82(int addr, int data) MOV EAX, [ESP+4] MOV AL, [ESP+8] MOV [EAX], AL RET です。これは、OS○作○門という本に載っていたものですが、プログラムをインラインアセンブラにすると、成功するのかふと疑問に思ったのです。よって、アセンブラの種類は、nasmを基にしたnaskです。 こういうことは、その本のサポートページか何かで質問すればよい的なことをおっしゃる方もおられると思います。残念ながら、サポートページは、ほぼ凍結状態で、何年待てば回答が返ってくるのか?という状態です。 そういう経歴で、ここの質問させていただくに至りました。 肝心の、私が書いてコンパイルエラーになるプログラムを書きます。 static __inline__ void write_mem82(int addr, int data){ __asm__ ( "MOV EAX,[ESP+4]": "MOV AL,[ESP+8]" "MOV [EAX],AL" "RET" ); } です。"MOV [EAX],AL"でエラーが出ます内容は構文が間違っているという内容のものです。なお、関数の名前は、意図的に変えてあります。オリジナルとは違います。 大した関数ではないのかもしれないのですが、わからないのでよろしくおねがいいたします。

  • 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

  • 80486のキャッシュを無効にするとハングするのはなぜ?

    アセンブラでこんな風にしているのですが、 なぜかハングアップします。 _DisableCache:   mov eax, cr0   or   eax, CR0_CACHE_FLAGS   mov  cr0, eax   ret

  • 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ラベルのところでこれを呼び出してるのでソースを流用して消し忘れてるだけなんでしょうか?

  • 機械語に直すことについて。

    (機械語データ) (アセンブリ言語) b8 57 61 6b 61 mov $0x616b6157,%eax 53 push %ebx 50 push %eax ba 04 00 00 00 mov $0x4,%edx bb 01 00 00 00 mov $0x1,%ebx b8 04 00 00 00 mov $0x4,%eax 89 e1 mov %esp,%ecx cd 80 int $0x80 58 pop %eax 31 c0 xor %eax,%eax 5b pop %ebx c3 ret これのintと movとxor の機械語が分かりません。後、retの機械語が、farなのかnearなのかも分かりません。教えていただけないでしょうか?すみません。

  • アセンブラでコマンドライン引数を取得する方法

    50歳からアセンブラプログラムを趣味で勉強しております。 一つ壁に当たりました。 コマンドライン引数が何処にあるのかわかりません。 Windows7で nasm -fwin32 test.asm alink -oPE -subsys console test.obj crtdll.lib -entry start アセンブル、リンクしています。 test.asm extern printf section .text global _start _start: push ebp mov ebp,esp mov eax,[ebp+8] push eax mov eax,A101 push eax call printf add esp,8 pop ebp ret section .data A101: db 'argc = %d', 10, 0 で、argc = 2147340288 と表示されます。 どうぞよろしくお願いいたします。

  • アセンブリ言語について。

    これが何をしているのか教えていただけないでしょうか?すみません。 これの事です。 (機械語データ) (アセンブリ言語) b8 57 61 6b 61 mov $0x616b6157,%eax 53 push %ebx 50 push %eax ba 04 00 00 00 mov $0x4,%edx bb 01 00 00 00 mov $0x1,%ebx b8 04 00 00 00 mov $0x4,%eax 89 e1 mov %esp,%ecx cd 80 int $0x80 58 pop %eax 31 c0 xor %eax,%eax 5b pop %ebx c3 ret

  • 機械語とアセンブリ言語について。

    (機械語データ) (アセンブリ言語) b8 57 61 6b 61 mov $0x616b6157,%eax 53 push %ebx 50 push %eax ba 04 00 00 00 mov $0x4,%edx bb 01 00 00 00 mov $0x1,%ebx b8 04 00 00 00 mov $0x4,%eax 89 e1 mov %esp,%ecx cd 80 int $0x80 58 pop %eax 31 c0 xor %eax,%eax 5b pop %ebx c3 ret こちらのアセンブリ言語の命令がわかるおすすめの書籍を知らないでしょうか? 教えていただけないでしょうか?すみません。

  • 機械語とアセンブリ言語について。

    (機械語データ) (アセンブリ言語) b8 57 61 6b 61 mov $0x616b6157,%eax 53 push %ebx 50 push %eax ba 04 00 00 00 mov $0x4,%edx bb 01 00 00 00 mov $0x1,%ebx b8 04 00 00 00 mov $0x4,%eax 89 e1 mov %esp,%ecx cd 80 int $0x80 58 pop %eax 31 c0 xor %eax,%eax 5b pop %ebx c3 ret で、右側のアセンブリ言語のニーモニックとオペランドについて解説していただけないでしょうか?すみません。

  • メモリデータ比較中にハング

    メモリデータ比較中にハング A領域のデータとB領域のデータを先頭から比較するプログラムをアセンブラで組んでおります。 しかしかなりの頻度でプログラムがハングし、困っております。 ソースを眺めていても、どこが悪いのかわかりません。ハングの原因をうまく調べる方法はあるでしょうか? 動作環境:MS-DOS アセンブラ:MASM32 MOV ECX, srcAddr;Aのメモリアドレス PUSH ECX POP ESI MOV ECX, dstAddr;Bのメモリアドレス PUSH ECX POP EDI MOV ECX, CmpByte;比較するバイト数(比較するのは100000Hexバイト) XOR EAX, EAX CALL ENTER_PROTECT;プロテクトモードに移行 CALL GET_SORC_SEL;SORC_SELのBASE AddressとLimitを変更 CALL GET_DEST_SEL;DEST_SELのBASE AddressとLimitを変更 ; DWORD単位で比較するので2で割る SHR ECX, 2 @@compare: CLD ;CMPS*でのESI,EDIの変化を増加方向に @@cmp4: CMPSD DS:[ESI], ES:[EDI] ;4Byteずつ比較 jne @@err4 dec ECX jnz @@cmp4 ; 4で割った余り分のチェック MOV ECX, CmpByte AND ECX, 3 or ecx, ecx jz @@exit jmp @@cmp1 @@err4: ; 1Byteずつチェックしてコンペアエラーしたオフセットを割り出す LEA ESI,[ESI-4] ; コンペアエラー前のオフセットに戻す LEA EDI,[EDI-4] shl ecx, 2 @@cmp1: ;1Byteずつ比較 CMPSB DS:[ESI], ES:[EDI] jne @@exit dec ECX jnz @@cmp1 @@exit: ; コンペアしたByte数を計算(EAX <- CmpByte - ECX) MOV EAX, CmpByte SUB EAX, ECX PUSH EAX CALL FREE_SORC_SEL CALL FREE_DEST_SEL CALL LEAVE_PROTECT POP AX POP BX MOV DX, BX RET _MemCmp2 ENDP

専門家に質問してみよう