みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

投稿日時 - 2007-11-24 15:11:14

QNo.3542923

困ってます

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

提示したページからディレクトリを上に行って全体の目次を見るとかはしましたか?


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

とする。

投稿日時 - 2007-11-24 18:00:28

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.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 とする。

投稿日時 - 2007-11-24 16:10:26

補足

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

投稿日時 - 2007-11-24 16:55:19

あなたにオススメの質問