GO/nask
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* naskの使い方について [#x4df266e]
-(2004.04.06 by [[K]])
-最近naskを使ってみようかなという人が出てきてくれたので、...
-主な特徴や最新版入手方法などは、[[GO]]などを参照してくだ...
* DOSの.COMファイルの作成例 [#c990cc25]
; prompt>nask hello.nas hello.com hello.lst
[BITS 16]
[OPTIMIZE 1]
[OPTION 1]
[INSTRSET "8086"]
[FORMAT "BIN"]
ORG 0x100
MOV DX,msg
MOV AH,0x09
INT 0x21
MOV AX,0x4c00
INT 0x21
msg DB "hello, world", 0x0d, 0x0a, "$"
-[BITS 16]というのは、16ビットモード用のバイナリを出せと...
-[OPTIMIZE 1]というのは自動最適化をやれという意味です。
-[OPTION 1]は/や%や>>の扱いで数値を符号付きとして扱わせま...
-[INSTRSET "8086"]は8086で規定されているレジスタ名やニー...
-[FORMAT "BIN"]はバイナリモード出力を意味します。
-naskではcsegやassumeなどの、初心者にとってうさんくさい(...
* 32bitのWCOFFファイルの作成例 [#t71596e0]
; rand - K&Rからほぼ抜粋したものを単にASM化した
[FORMAT "WCOFF"]
[INSTRSET "i486p"]
[OPTIMIZE 1]
[OPTION 1]
[BITS 32]
[FILE 'rand.nas']
GLOBAL _rand_seed
GLOBAL _rand
[SECTION .data]
ALIGNB 4
_rand_seed dd 1
[SECTION .text]
; int rand(void)
_rand:
push edx
mov eax,dword ds:[_rand_seed]
mov edx,1103515245
mul edx
add eax,12345
mov dword ds:[_rand_seed],eax
shr eax,16
pop edx
and eax,07fffh
ret
* 長ったらしいドキュメント [#sea7f274]
-文中ではNASKと書いてありますが、[[K]]は今では小文字でnas...
1.NASKについて
NASKはNASMからマクロ機能を省き、その代わりに徹底したコ...
盛り込んだアセンブラです。アセンブラ自体が結構小さいとい...
い使い方については、NASMのドキュメントを参考にしてくださ...
るのでNASMと違う部分はだいたい分かっていただけると思いま...
ASKのbase.nasなどをご覧ください。
旧バージョンではバイナリモードしかできませんでしたが、...
使えます。
使い方は単純で、
prompt>nask sorcefile outputfile [listfile]
です。listfileを省略するとlistfileを生成しません。
2.NASMとの違いの要約
(短所)
プリプロセッサ命令(マクロ)は使えない。
その他にもいくつかの制限がある(3.を参照)。
(長所)
処理系のサイズが小さい(27.0KB)。
最適化の強さがNASMの比ではない。
各セクションのアラインをソース中のALIGN文から自動設定。
文法規制が緩い(ラベルの差をとることなくいきなり&などを...
リモード時)。
(長所とも短所ともいえる特徴)
BITSは[]でくくらなければならない。
その他に、[FORMAT], [OPTIMIZE], [OPTION], [INSTRSET], ...
の最初に記述しなければいけない。
3.NASK ver.0.0での制限事項(将来改善する仕様?)
単純明快です。
O16, O32, A16, A32,
DQ, DT, RESQ, REST, INCBIN,
[ABSOLUTE]
が使えません。プリプロセッサ命令も使えません(%で始まる命...
486DX命令は全て使えます。
プリプロセッサ命令が使いたい場合、NASMの-eオプションな...
サ処理を終えたソースを生成して、それをNASKにまわすという...
ん、プリプロセッサが使えないNASKに見切りをつけてNASMを使...
ですし、公開されているソースをベースにNASKを改造してもい...
immの式のほとんどでラベルを含む式が使えます。駄目なの...
分と、INT命令の番号の部分とRET系のimm16の部分のみです。...
なくて直していません。すみません。この駄目な部分に関して...
数式なら正しく解釈します。
DDでfloatの定数を置くことはまだできません。
TIMESに続く命令は、かならず1バイトにしてください。手抜...
NASMに標準的に備わっているALIGNマクロは使えませんが、...
IGNB命令をサポートしています。これはパラメータを1つしか...
NOPでパディングするか、0x00でパディングするかしか選べな...
これが気に入らなければ以下の表記などで代用してください。
TIMES ( 4 - ($ % 4)) % 4 NOP ; 4バイトアライン
TIMES (16 - ($ % 16)) % 16 NOP ; 16バイトアライン
4.特筆すべき(?)仕様
今のところバイナリサイズは27.0KBです。
NASKのラベルは、いつどこで定義しても問題なく参照できま...
単純な2パスではないからです。しかし例外があり、EXTERNラ...
先に宣言しなければいけません。
FORMATは出力ファイルのフォーマット指定です。NASKでは、...
ソースで指定します。"BIN"と"WCOFF"があります。デフォルト...
初の方で一回だけ記述します。
NASKでは、BITSを[]でくくらなければなりません。
また、INSTRSETなどの追加命令があるので、NASMとの互換ソ...
るかもしれません。そのために、「;%NASK」という記述をする...
ASMでは当然注釈になりますが、NASKではスペース扱いになり...
うことでしたら、この記述はいりません。
INSTRSETはCPU名を指定します。今のところ以下のCPU名が指...
"8086", "80186", "80286", "80286p", "i386", "i386p", "...
8086モードでは、FSやEBXなどが予約語になりません。デフ...
にpが付くのはプロテクトモード用の命令群を使えるようにす...
選択しているからといって、8086に実行できないコードを出力...
はありません。単に予約語をラベル定義用に開放しているだけ...
どでNEARにされてしまうこともありえます。不安な場合は、SH...
OPTIMIZEは最適化のON/OFFです。0だとNASM並みです。1だと...
笑)。デフォルトは0です。
OPTIONは/や%、>>の扱いです。0だとNASMのように符号無し...
りになります。デフォルトは0です。なお、[OPTION 1]では、/...
す。右シフトについては、OPTIONに関わらず、&>が符号無しシ...
トです。
NASKでは..$というラベルが使えます。これは次の行のアド...
ックのwaitを入れるための懐かしいテクニックとして「JMP SH...
りましたが、これを「JMP ..$」とも書けるわけです。
NASKのBINモードでは、ラベルの差をとらなくても全ての演...
ABEL2)/2とか、LABEL1*5とか、もう好きなようにやってくださ...
ORGした値を返します(該当するORG文がない場合は暗黙のORG 0...
)。WCOFFモードでの$$の挙動はNASMと同じです。
BINでもWCOFFでも[SECTION]文が使えます。指定できる属性...
指定は最初にそのセクションを宣言したときだけです。BINの...
にバイナリ化され、アライン指定にしたがってアラインされて...
全く指定しない場合、NASKはそのセクションに含まれるALIGN...
そこからこのセクションに付与すべきアラインを自動的に決定...
WCOFFで利用できるセクションは、.text、.data、.bssのみ...
言してはいけません。BINではこれとは無関係に任意の名前を...
5.メモリアドレッシング
(1)セグメントオーバーライドプリフィックス
セグメントオーバーライドは、以下の3つの場所にいずれ...
ころに書いてください。
・[]の中(NASM準拠)
・[]の前(MASM準拠)
・オペコードの前("cs movsb"や、"es mul [edi]"のよ...
なお、OPTIMIZEがONになっていれば、省略可能なDSやSSの...
られます。これで僕のようにいつでもセグメントを書きたが...
ないで書けます(笑)。LEA命令では、どんなセグメントオー...
あっさりとキャンセルされます。
(2)実効アドレス式
NASMのように、かなり複雑な記述を許します。"IDIV BYTE...
OKなのはもちろんですが、"LEA EAX,[(EAX+ECX-5)*8/2-3*EA...
ケールに割り算を認めるのは、NASMを超えています(もちろ...
できない)。また、シフトもできます([EAX<<1])。なお、レ...
掛ける数がラベルやレジスタを含まない式である必要があり...
(3)ベースとインデックス
[EAX+ECX+8]みたいな記述では、NASKはどちらをベースに...
量で決めて良いと判断します。しかし[EAX*1+ECX+8]や[EAX+...
かに掛け算がかかっていたら、勝手な裁量をせずにそちらを...
す。掛け算は、1*ECXのようなものでもかまいません。両方...
の裁量でやります。・・・というのがnask00aでの仕様でし...
OPTIMIZEがONのときは掛け算があっても裁量を発揮します。...
ITを指定してください。NOSPLITが指定されていれば掛け算...
いなければ、disp8の省略やプリフィックス省略をねらいま...
[EBP+EDX]のようなものでは、SSやDSが指定されていれば...
る方法を求めてどちらをベースにするか選びますし、そうで...
て、disp8の省略を狙います。
(4)アドレスモード
実効アドレス式中に32bitレジスタが使われていれば32bit...
ジスタが使われていれば16bitアドレッシングになります。...
して必要に応じてアドレスサイズオーバーライドプリフィッ...
もし実効アドレス式がdispのみの場合は、dispの値によら...
バーライドしないという前提でアセンブルされます。もしこ...
内に、WORDもしくはDWORDと書いて下さい。
* こめんと欄 [#e43c077d]
-ふと手元にあったコードアセンブルしてみたんですけど、PWOR...
-はいPWORDは使えません。naskはNASMの文法を大いに参考にし...
-movsd命令にアドレスサイズプリフィクスを付ける方法はあり...
-db 67h はいかがでしょうか。 -- [[名無しさん]] SIZE(10){2...
-回答ありがとうございます。…やはりそれですか。手書きで0x6...
-naskを単体でダウンロードさせてはいただけないでしょうか?...
-それならこちらはいかがでしょうか? http://dot.osask.jp/d...
-32bitモードでINTは使えるのでしょうか?まだアセンブラは初...
-その質問は、2つの意味に取れます。「naskにおいて[BITS 32]...
#comment
終了行:
* naskの使い方について [#x4df266e]
-(2004.04.06 by [[K]])
-最近naskを使ってみようかなという人が出てきてくれたので、...
-主な特徴や最新版入手方法などは、[[GO]]などを参照してくだ...
* DOSの.COMファイルの作成例 [#c990cc25]
; prompt>nask hello.nas hello.com hello.lst
[BITS 16]
[OPTIMIZE 1]
[OPTION 1]
[INSTRSET "8086"]
[FORMAT "BIN"]
ORG 0x100
MOV DX,msg
MOV AH,0x09
INT 0x21
MOV AX,0x4c00
INT 0x21
msg DB "hello, world", 0x0d, 0x0a, "$"
-[BITS 16]というのは、16ビットモード用のバイナリを出せと...
-[OPTIMIZE 1]というのは自動最適化をやれという意味です。
-[OPTION 1]は/や%や>>の扱いで数値を符号付きとして扱わせま...
-[INSTRSET "8086"]は8086で規定されているレジスタ名やニー...
-[FORMAT "BIN"]はバイナリモード出力を意味します。
-naskではcsegやassumeなどの、初心者にとってうさんくさい(...
* 32bitのWCOFFファイルの作成例 [#t71596e0]
; rand - K&Rからほぼ抜粋したものを単にASM化した
[FORMAT "WCOFF"]
[INSTRSET "i486p"]
[OPTIMIZE 1]
[OPTION 1]
[BITS 32]
[FILE 'rand.nas']
GLOBAL _rand_seed
GLOBAL _rand
[SECTION .data]
ALIGNB 4
_rand_seed dd 1
[SECTION .text]
; int rand(void)
_rand:
push edx
mov eax,dword ds:[_rand_seed]
mov edx,1103515245
mul edx
add eax,12345
mov dword ds:[_rand_seed],eax
shr eax,16
pop edx
and eax,07fffh
ret
* 長ったらしいドキュメント [#sea7f274]
-文中ではNASKと書いてありますが、[[K]]は今では小文字でnas...
1.NASKについて
NASKはNASMからマクロ機能を省き、その代わりに徹底したコ...
盛り込んだアセンブラです。アセンブラ自体が結構小さいとい...
い使い方については、NASMのドキュメントを参考にしてくださ...
るのでNASMと違う部分はだいたい分かっていただけると思いま...
ASKのbase.nasなどをご覧ください。
旧バージョンではバイナリモードしかできませんでしたが、...
使えます。
使い方は単純で、
prompt>nask sorcefile outputfile [listfile]
です。listfileを省略するとlistfileを生成しません。
2.NASMとの違いの要約
(短所)
プリプロセッサ命令(マクロ)は使えない。
その他にもいくつかの制限がある(3.を参照)。
(長所)
処理系のサイズが小さい(27.0KB)。
最適化の強さがNASMの比ではない。
各セクションのアラインをソース中のALIGN文から自動設定。
文法規制が緩い(ラベルの差をとることなくいきなり&などを...
リモード時)。
(長所とも短所ともいえる特徴)
BITSは[]でくくらなければならない。
その他に、[FORMAT], [OPTIMIZE], [OPTION], [INSTRSET], ...
の最初に記述しなければいけない。
3.NASK ver.0.0での制限事項(将来改善する仕様?)
単純明快です。
O16, O32, A16, A32,
DQ, DT, RESQ, REST, INCBIN,
[ABSOLUTE]
が使えません。プリプロセッサ命令も使えません(%で始まる命...
486DX命令は全て使えます。
プリプロセッサ命令が使いたい場合、NASMの-eオプションな...
サ処理を終えたソースを生成して、それをNASKにまわすという...
ん、プリプロセッサが使えないNASKに見切りをつけてNASMを使...
ですし、公開されているソースをベースにNASKを改造してもい...
immの式のほとんどでラベルを含む式が使えます。駄目なの...
分と、INT命令の番号の部分とRET系のimm16の部分のみです。...
なくて直していません。すみません。この駄目な部分に関して...
数式なら正しく解釈します。
DDでfloatの定数を置くことはまだできません。
TIMESに続く命令は、かならず1バイトにしてください。手抜...
NASMに標準的に備わっているALIGNマクロは使えませんが、...
IGNB命令をサポートしています。これはパラメータを1つしか...
NOPでパディングするか、0x00でパディングするかしか選べな...
これが気に入らなければ以下の表記などで代用してください。
TIMES ( 4 - ($ % 4)) % 4 NOP ; 4バイトアライン
TIMES (16 - ($ % 16)) % 16 NOP ; 16バイトアライン
4.特筆すべき(?)仕様
今のところバイナリサイズは27.0KBです。
NASKのラベルは、いつどこで定義しても問題なく参照できま...
単純な2パスではないからです。しかし例外があり、EXTERNラ...
先に宣言しなければいけません。
FORMATは出力ファイルのフォーマット指定です。NASKでは、...
ソースで指定します。"BIN"と"WCOFF"があります。デフォルト...
初の方で一回だけ記述します。
NASKでは、BITSを[]でくくらなければなりません。
また、INSTRSETなどの追加命令があるので、NASMとの互換ソ...
るかもしれません。そのために、「;%NASK」という記述をする...
ASMでは当然注釈になりますが、NASKではスペース扱いになり...
うことでしたら、この記述はいりません。
INSTRSETはCPU名を指定します。今のところ以下のCPU名が指...
"8086", "80186", "80286", "80286p", "i386", "i386p", "...
8086モードでは、FSやEBXなどが予約語になりません。デフ...
にpが付くのはプロテクトモード用の命令群を使えるようにす...
選択しているからといって、8086に実行できないコードを出力...
はありません。単に予約語をラベル定義用に開放しているだけ...
どでNEARにされてしまうこともありえます。不安な場合は、SH...
OPTIMIZEは最適化のON/OFFです。0だとNASM並みです。1だと...
笑)。デフォルトは0です。
OPTIONは/や%、>>の扱いです。0だとNASMのように符号無し...
りになります。デフォルトは0です。なお、[OPTION 1]では、/...
す。右シフトについては、OPTIONに関わらず、&>が符号無しシ...
トです。
NASKでは..$というラベルが使えます。これは次の行のアド...
ックのwaitを入れるための懐かしいテクニックとして「JMP SH...
りましたが、これを「JMP ..$」とも書けるわけです。
NASKのBINモードでは、ラベルの差をとらなくても全ての演...
ABEL2)/2とか、LABEL1*5とか、もう好きなようにやってくださ...
ORGした値を返します(該当するORG文がない場合は暗黙のORG 0...
)。WCOFFモードでの$$の挙動はNASMと同じです。
BINでもWCOFFでも[SECTION]文が使えます。指定できる属性...
指定は最初にそのセクションを宣言したときだけです。BINの...
にバイナリ化され、アライン指定にしたがってアラインされて...
全く指定しない場合、NASKはそのセクションに含まれるALIGN...
そこからこのセクションに付与すべきアラインを自動的に決定...
WCOFFで利用できるセクションは、.text、.data、.bssのみ...
言してはいけません。BINではこれとは無関係に任意の名前を...
5.メモリアドレッシング
(1)セグメントオーバーライドプリフィックス
セグメントオーバーライドは、以下の3つの場所にいずれ...
ころに書いてください。
・[]の中(NASM準拠)
・[]の前(MASM準拠)
・オペコードの前("cs movsb"や、"es mul [edi]"のよ...
なお、OPTIMIZEがONになっていれば、省略可能なDSやSSの...
られます。これで僕のようにいつでもセグメントを書きたが...
ないで書けます(笑)。LEA命令では、どんなセグメントオー...
あっさりとキャンセルされます。
(2)実効アドレス式
NASMのように、かなり複雑な記述を許します。"IDIV BYTE...
OKなのはもちろんですが、"LEA EAX,[(EAX+ECX-5)*8/2-3*EA...
ケールに割り算を認めるのは、NASMを超えています(もちろ...
できない)。また、シフトもできます([EAX<<1])。なお、レ...
掛ける数がラベルやレジスタを含まない式である必要があり...
(3)ベースとインデックス
[EAX+ECX+8]みたいな記述では、NASKはどちらをベースに...
量で決めて良いと判断します。しかし[EAX*1+ECX+8]や[EAX+...
かに掛け算がかかっていたら、勝手な裁量をせずにそちらを...
す。掛け算は、1*ECXのようなものでもかまいません。両方...
の裁量でやります。・・・というのがnask00aでの仕様でし...
OPTIMIZEがONのときは掛け算があっても裁量を発揮します。...
ITを指定してください。NOSPLITが指定されていれば掛け算...
いなければ、disp8の省略やプリフィックス省略をねらいま...
[EBP+EDX]のようなものでは、SSやDSが指定されていれば...
る方法を求めてどちらをベースにするか選びますし、そうで...
て、disp8の省略を狙います。
(4)アドレスモード
実効アドレス式中に32bitレジスタが使われていれば32bit...
ジスタが使われていれば16bitアドレッシングになります。...
して必要に応じてアドレスサイズオーバーライドプリフィッ...
もし実効アドレス式がdispのみの場合は、dispの値によら...
バーライドしないという前提でアセンブルされます。もしこ...
内に、WORDもしくはDWORDと書いて下さい。
* こめんと欄 [#e43c077d]
-ふと手元にあったコードアセンブルしてみたんですけど、PWOR...
-はいPWORDは使えません。naskはNASMの文法を大いに参考にし...
-movsd命令にアドレスサイズプリフィクスを付ける方法はあり...
-db 67h はいかがでしょうか。 -- [[名無しさん]] SIZE(10){2...
-回答ありがとうございます。…やはりそれですか。手書きで0x6...
-naskを単体でダウンロードさせてはいただけないでしょうか?...
-それならこちらはいかがでしょうか? http://dot.osask.jp/d...
-32bitモードでINTは使えるのでしょうか?まだアセンブラは初...
-その質問は、2つの意味に取れます。「naskにおいて[BITS 32]...
#comment
ページ名: