アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (2件)

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




http://www.yuasa.kuis.kyoto-u.ac.jp/~nobu/study/ …

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

とする。
    • good
    • 0

どこでnasmを入手したかわかりませんけど、開発元でダウンロードできる


SourceForge.net: Files
http://sourceforge.net/project/showfiles.php?gro …
ドキュメントでは不足ですか?

MASMユーザーへのクイックスタートって項目もありますよ。
探したら日本語訳もありました
http://ryujin.kuis.kyoto-u.ac.jp/~nobu/study/nas …

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:55
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!