Message Log 44 Return to Parent Menu 
Last Updated by 07/01/05(Fri)  

 
Tips
 

 この掲示板、 1997 年に作ったんやったね!


 
Message log list
 

 アセンブラ掲示板に書き込まれた過去のログです。


Message log 44 (05/01/0506/30/05)
Message log 43 (01/01/0504/30/05)
Message log 42 (01/01/0412/31/04)
Message log 41 (11/01/0312/31/03)
Message log 40 (10/01/0310/31/03)
Message log 39 (04/01/0309/30/03)
Message log 38 (12/01/0203/31/03)
Message log 37 (08/01/0211/30/02)
Message log 36 (05/01/0207/31/02)
Message log 35 (03/01/0204/30/02)
Message log 34 (01/01/0202/28/02)
Message log 33 (09/15/0112/31/01)
Message log 32 (08/01/0109/14/01)
Message log 31 (05/26/0107/31/01)
Message log 30 (05/15/0105/25/01)
Message log 29 (05/01/0105/14/01)
Message log 28 (02/01/0104/30/01)
Message log 27 (01/01/0101/31/01)
Message log 26 (10/01/0012/31/00)
Message log 25 (07/21/0009/30/00)
Message log 24 (06/16/0007/20/00)
Message log 23 (05/20/0006/15/00)
Message log 22 (05/01/0005/19/00)
Message log 21 (04/01/0004/30/00)
Message log 20 (02/01/0003/31/00)
Message log 19 (01/01/0001/31/00)
Message log 18 (11/01/9912/31/99)
Message log 17 (09/05/9910/31/99)
Message log 16 (08/21/9909/04/99)
Message log 15 (07/01/9908/20/99)
Message log 14 (04/01/9906/30/99)
Message log 13 (02/01/9903/31/99)
Message log 12 (11/01/9801/31/99)
Message log 11 (09/21/9810/31/98)
Message log 10 (08/01/9809/20/98)
Message log 09 (07/01/9807/31/98)
Message log 08 (05/04/9806/30/98)
Message log 07 (04/08/9805/03/98)
Message log 06 (02/23/9804/07/98)
Message log 05 (01/01/9802/22/98)
Message log 04 (11/09/9712/31/97)
Message log 03 (10/17/9711/08/97)
Message log 02 (08/22/9710/16/97)
Message log 01 (06/20/9708/21/97)


 
Message log 05/01/0506/30/05
 




wtz  [2005/06/26 Sun 16:28:29]  [202.95.47.98]
http://www3.synapse.ne.jp/wtz/programming/assembler/

Alink の download元は

http://alink.sourceforge.net/download.html

でよいようです。
ここに Alink.exe の実行ファイルと一緒にマニュアルも入っています。
あとソースや ALIB もあるようです。
AKA  [2005/06/25 Sat 07:26:59]  [219.100.138.102]

wtzさん、どうも。

Sundayさん、
書きこみを見る限り、incbinやdb、dwを一行に入れこんでしまっているのでは?
だとしたら、それはできません・・・

今、ALINKのマニュアルを探しているのですが、見つかりません。作者サイトもリンク切れで見つかりません。
確か数年前に探した時もやっぱり見つからなかったような・・

なお使う人いないのかもしれませんがワードパッドでもユニコード形式の保存はできます・・・

この掲示板大丈夫なんですかね・・・?パンクしないんでしょうか・・・
都兼  [2005/06/22 Wed 16:05:16]  [202.213.0.179]

澤口@一升金さん>>
プロテクトモードは保護モードのことですが・・・一応、実行環境はVMwareです。

AKAさん>>
>アセンブラだと直接セレクタが書けないのでマシン語を埋めた、ということでしょうか・・・?
そのとおりです。説明不足すいません。
返信していただいたソースであってました。ありがとうございます。
OSの規模としては、Linaxよりも少し下のスペックのものを作ろうとおもっています。
wtz  [2005/06/21 Tue 20:37:48]  [202.95.36.74]
http://www3.synapse.ne.jp/wtz/programming/assembler/

Sunday さんへ。
incbin はバイナリーなファイルをそのままのバイナリーデータ(この表現でわかるかな)として取り込む命令です。
incbin 'filename'
だけで一文となります。
'mess.uni' は「メッセージ」という文字列をユニコードとして記述したある種の「テキストファイル」です。
uni という拡張子は私が勝手に一時的につけたものです。
(私のサイトにこれらのファイルを置いておきます。messw.lzh です。)
その後ろの行にある dw 0 はユニコード文字列の終わりを指定するものです。
ユニコードは2バイトで一文字なので2バイトの0が必要になります。
(シフトジスでは1バイトでよいので db 0 で終わりです。)

参考:私がよく使うツール
Oedit(ユニコードが使えるエディタ)
http://www.hi-ho.ne.jp/a_ogawa/
BZ(バイナリーファイルエディタ)
http://www.zob.ne.jp/~c.mos/soft/bz.html

Sunday  [2005/06/20 Mon 17:08:11]  [221.250.96.18]

AKAさんへ
title1: incbin 'mess.uni' db'',0 dw 0
でエラーが出るのですが・・・

wtz  [2005/06/19 Sun 22:43:43]  [210.237.55.53]
http://www3.synapse.ne.jp/wtz/programming/assembler/

I486さん。私二つとも買っちゃった。orz
確かに内容が貧弱なためか、はまることが出来ずにあまり読んでないです。
AKA  [2005/06/18 Sat 15:59:44]  [219.100.139.8]

wtzさん、timesやollyの件ほか、どうもありがとうございました。
I486  [2005/06/16 Thu 21:09:32]  [69.41.173.145]

まったく役に立たない悪書として有名なアセンブリ言語解説本の、
『いまどきのアセンブラプログラミング』と
『いまどきのアセンブラの教科書』の著者である橋本和明が、
新しいアセンブリ言語解説本を出します。要注意です。

『アセンブラ読本 for Game ゼロからはじめるゲーム改造』
2005/06/20発売

すでにプログラマ・ゲーム解析者・クラッカーの人達の間で
購入を回避するよう警告が出されています。

アマゾンのレビューを見れば、プログラミング能力がなく
『ネットランナー』のライターにすぎないこの著者の知識が、
どの程度なのかよく分かると思います。

『いまどきのアセンブラの教科書』
http://www.amazon.co.jp/exec/obidos/ASIN/4839917183/250-2477672-5947432
『いまどきのアセンブラプログラミング』
http://www.amazon.co.jp/exec/obidos/ASIN/4839912025/250-2477672-5947432

有名プログラマやねうらお氏のレビューなど
http://d.hatena.ne.jp/yaneurao/20050602
http://d.hatena.ne.jp/yaneurao/20050617


>>wtzさん
OllyDbgなら「Digital Travesia」で再配布してますよ。
http://hp.vector.co.jp/authors/VA028184/
wzHEATzRD6NGLFC  [2005/06/13 Mon 02:37:54]  [148.244.150.58]
wzHEATzRD6NGLFC

wzHEATzRD6NGLFC
wtz  [2005/06/12 Sun 22:04:10]  [210.237.57.217]
http://www3.synapse.ne.jp/wtz/programming/assembler/

OllyDbg のダウンロード先ですが
「OllyDbg download」 で Google 検索(英語圏も含めた)を
するとひっかかるところがまだあるようです。

http://webster.cs.ucr.edu/AsmTools/HLA/dnld.html
http://webster.cs.ucr.edu/AsmTools/OllyDbg/

他は消えたサイトのリンクが多いようですが…
wtz  [2005/06/11 Sat 21:06:14]  [210.237.55.221]
http://www3.synapse.ne.jp/wtz/programming/assembler/

いつも書き忘れるんですが、管理者様、そろそろ過去ログを分けてください。

さて _return 文を作ってみました。
_return 0 だと
xor eax,eax
jmp %$ProcEnd
_return 1 だと
xor eax,eax
inc eax
jmp %$procEnd
を生成します。
_return _
など最後のパラメーターを'_' にすると short ジャンプの変わりに near ジャンプを生成します。
ついでに _uses マクロを作りました。
_localvarend のあとに
_uses eax,ebx
と書くとスタックに eax,ebx を保存します。
そして _procend の最初で復元されます。
_return 文はその最初のアドレスにジャンプします。
(スタックへの保存が _return 文の前にあるとちゃんと機能しない可能性があります。)

ところで retf って windows で使う意味ってありますかね。
wtz  [2005/06/11 Sat 16:06:01]  [210.237.60.153]
http://www3.synapse.ne.jp/wtz/programming/assembler/

わかるところだけ。

>MASMで
> db 100h dup(90h)
>などとできるわけですが、こういうことをしたい場合どうすればいいのでしょうか?

nasm だと
100 times db 90h
でいけます。
times prefix については nasmdoc.txt の 3.2.5 で解説されています。
100 times nop
でもいいですよね。

>質問なのですが、nasmで'.'を頭に付けたセクション名を作る方法はないものでしょうか・・・?

本当だ。 . がなくなってしまいますね。どういうことなんだろう。

明示的な ret の件ですが、どのようなものをお望みかちょっとわかりませんでした。
nagoa.inc あたりだと return マクロがありますが、(21016行)
nagoa+.inc だと 19743 行(ファイルの最後)
詳細は解析していませんので後日…

それと enter は遅いんですね。書き換えようかな。
AKA  [2005/06/11 Sat 07:24:48]  [219.100.140.97]

>>wtzさん
alinkでリンクした.EXEで、TDがトラブルに陥る、と書きましたが、なぜか起きなくなりました。なぜだろう・・・
最初、nasmをバージョンアップしたからか、とも思いましたが、違うようです・・・
最近いくつかソフトをインストールしましたが・・・よくわかりません・・・


マクロの説明、殆どわかりません・・・これから勉強致します・・・(はっきり言ってMASMのマクロも自信はない・・・)

ただ、スタックフレーム作成のところだけ・・・
DOS用MASM.EXEではデフォルトでは.8086で、その場合にprocはpush bp/mov bp,spを生成していましたが、.186や.286、.386を指定するとenterを生成するようになっていました。
しかし、現在のML.EXEではデフォルト(.8086)ではもちろんのこと、.186、.286、.386でもすべてpush bp/mov bp,spを生成するようになっています。
聞いた話によるとPentiumなどの現在のプロセッサではenterの方が遅いからなんだそうです。
まあ私はどっちでも余り気にしないですが・・・

それと、要望(?)なのですが、プロシージャの中で明示的なretができないでしょうか?私はよく以下のようなコードを書きます。
        cmp     ecx,0
        je      ?m_err
?m_normal:
        xor     al,al
        ret
?m_err:
        xor     al,al
        inc     al
        ret
MASMはこのretをスタック復帰を加えたコードに直します。procの属性がfarだった場合にはretfに直します。
もちろん、'ret'の部分をすべて
        jmp     ?m_proc_end
に変え、
        ...
?m_proc_end:
_endproc
などとすることもできるわけですが・・・
retをマクロとして再定義してやればできるとは思うのですが、本来のretと同じ名前にしていいものだろうか・・・?(MASMはretをretfにすることをやっちゃってますが・・・)

まあ、あくまで思いつきですが・・・


質問なのですが、nasmで'.'を頭に付けたセクション名を作る方法はないものでしょうか・・・?
section .text use32 class=code
とかすると、OBJ内では、ただの'text'になってしまいます。
リンカにILINK32を使用した場合には、OBJレコード内のセグメント名は無視され、codeとかCODEというクラス名を持つセグメントは、自動的に'.text'というセクションになってしまうようです。
ALINKを使った場合はセグメント名がそのままセクション名になるので、これをコントロールしたいのです。

あと、もう一つ質問なのですが・・・
resbとかreswを使うと値の指定はできないですよね?
MASMで
        db      100h dup(90h)
などとできるわけですが、こういうことをしたい場合どうすればいいのでしょうか?
やはりマクロでしょうか・・・?

win32.hlp、どうもありがとうございます。
12Mですか・・・迷うサイズですね・・・
wtz  [2005/06/04 Sat 21:52:43]  [202.95.48.141]
http://www3.synapse.ne.jp/wtz/programming/assembler/

win32.hlp ですが、
http://www.codingcrew.de/programmierung/win32hlp.php
というところの
Download des Win32-API SDK
の2つのファイルをダウンロードすればいいようです。
wtz  [2005/06/04 Sat 21:36:17]  [202.95.48.141]
http://www3.synapse.ne.jp/wtz/programming/assembler/

>NSTRUC.LZHを試させて頂きました。

それはありがとうございます。

_cproc まわりの使い方で混乱させたようですね。
winproc.inc にミスがあったようなんで修正しておきました。
(%$assign なんて書いてた。)

プロシージャ−の入り口で(引数か局所変数があればが)
push ebp
mov ebp,esp
というコードが生成されます。
局所変数があれば
sub esp,%$var
というコードがついでに生成されるはずです。
なお私は上のコードの変わりに
enter %$var,0
というコードを使っていますが…どっちが早いんですかね。

_localstruct x,12
という文は 12bytes の構造体として x を定義しています。こういう場合、
%assign %$var %$var+12
%xdefine x ebp-%$var
内容はこういう風になっています。
%define だと %$var がさらに変化すると x の値まで変更されてしまうので
%xdefine を使います。で、%xdefine の無い古いバージョンでは使えません。
nagoa.inc では
%if %$var==12
%define x ebp-12
といった手法と同様の方法を使っています。
そして _localvarend で使ったローカル変数の総和として
enter 命令を使っています。
だから _localvarend はプロシージャ−内部で必ず必要になります。
(もしかしたらもっと賢い方法がるのかも。)
nagoa+.inc では変数があるたびに
sub esp,??
とやってますが、一回で片付けたほうがいいような気がして。

あと Nasm の新しいバージョンだと Tasm 互換用モードがあって
%arg とか使えるようですが。(詳細は忘れました。)
AKA  [2005/06/04 Sat 09:06:18]  [219.100.195.22]

>>wtzさん
NOWSMART ASSEMBLERって非常に興味あるんですよね・・・
BCCでasm文を処理させる時、TASMを持っていないから代替アセンブラにMASMを指定するとソースが通らないんですよね・・・
NWSAはBCCとの連携が可能、と聞いたので興味がわいたのですが、「連携」がインライアセンブリを処理することなのか、単に別にアセンブルしたOBJがリンク可能、という意味なのか・・・
ただ、これって「製品版」というのがあるので、お金を払わないとすべての機能が使えないのかな?って、少し不安になります・・・

NSTRUC.LZHを試させて頂きました。
例の古いnasm(99年のヤツ)だと.INCが通らないですね・・・ディレクティブが足りないみたいです・・・

%include        'WINPROC.INC'
section _TEXT use32 class=CODE
_cproc  subp,a,b
        mov     eax,[a]
        mov     ebx,[b]
_endproc
こんなのを書いてみましたがエラーが2つ出てしまいました・・・_cprocがサンプルにないのでよくわかりませんでした・・・エラーが出るとnasmはリスティングファイルを作らないみたいだし・・・

_cprocを_apiprocにすると、先のエラーは出なくなりましたが、_localvarendがない、と怒られました・・・
_localvarendを入れたら_apiprocは通りました・・・

マクロ文法がわからないので・・・

OllyDbgがなぜか落とせなくなりました・・・待つしかないか・・・

>>都兼さん
アセンブラだと直接セレクタが書けないのでマシン語を埋めた、ということでしょうか・・・?
EAは絶対ジャンプですね・・・ですが、以下のように書けると思います。
        db      0xea    ;jmp far lab_1
        dd      lab_1
        dw      8
        ...
lab_1:
セレクタの値08もdwにしないとダメだと思います。
OS、どのくらいの機能を持たせる予定なのですか?
プロテクトモードだとBIOSも全く使えないから大変ですよ?

>>Sundayさん
最初の「db 'メッセージ',0」はコメントですから、コードはなにも生成されません。これは'mess.uni'の内容をシフトJISで表したものでしょう。
「dw 0」はユニコードのストリングエンドでしょう。
wtzさんも、もう気付いたかもしれませんが、ユニコードテキストの頭に変な値が入るのは「BOM」というもので、エンディアンを区別するためのものです。(私もこれには困っています・・・)
私もユニコード文字列をソース上で指定するやり方がわかりません。(^^;;)
それでシフトJISの文字列を作ってプログラムの中で変換しています。
Cでmbstowcs()というライブラリ関数を使いました。
Win32APIだとMultiByteToWideChar()というのを使うんじゃないでしょうか・・・Platform SDKがでかすぎて落としてないのでWin32がよくわからないですが・・・(^^;;;)

NAGOAのページ、
http://194.65.3.199/win32asm/starting.html
にWin32のヘルプが置いてある場所のリンクがあるのですが、
http://win32asm.rxsp.com/files/win32api.zip 
すでに切れてました・・・残念・・・


Sunday  [2005/06/03 Fri 17:01:26]  [221.250.96.18]

wtzさんへ
はじめましてSundayといいます
Nasmでの、ユニコード文字を使う方法が今ひとつわかりません。
incbin でファイルをインクルードしてるんですよね。その後に、'mess.uni'とありましたがそのファイルはユニコードの文字列ですよね?
とすると、その後の、db 'メッセージ',0 というのは何なのでしょうか。
さらにその後の dw 0 とは何なのでしょうか教えてください。

澤口@一升金  [2005/06/03 Fri 10:01:06]  [61.197.17.131]

澤口@一升金です。

to 都兼さん:

話がよく見えないのですが。
・プロテクトモードというだけでは実行環境がわかりません
・db 0xea というジャンプ命令(機械語)があるのですか?
・dw は 16bit ですから、0x100000 は格納できないと思うのですが

都兼  [2005/05/30 Mon 18:06:12]  [202.213.0.179]

はじめまして。アセンブラ言語超初心者の都兼です。
超初心者のクセにOS作りをしようとしている無謀な人と思っていただければ恐縮です(w
いきなり質問なんですが
プロテクトモード(intel)の状態で

db 0x0ea
dw 0x100 * 0x10 * 0x10 * 0x10
db 0x08

と、打ち込んで0x100000に飛ぼうという魂胆ですが、これが相対ジャンプか絶対ジャンプかがわかりません。
一応インテルのマニュアルを読んでみましたがよくわかりません。わかる方はレスお願いします。

ちなみにコンパイラはNASMです。
wtz  [2005/05/30 Mon 15:03:48]  [202.95.32.73]
http://www3.synapse.ne.jp/wtz/programming/assembler/

クッションルーチン…いい名前ですね。

>mov eax,[MessageBoxA+2]
>call [eax]
ちゃんと動きました。ありがとうございます。

>NT系と9xで違うとか・・・
関係あるかどうかは分かりませんが、うちのは win 2000 です。

>統合環境のようですね・・・リンカの代わりもしてくれる、ということなんだろうか・・・?
「NAGOA RAD IDE NASM PACKAGE WINDOWS 32 ASSEMBLY」のほうでは
Alink OllydDbg FASM 他多数のフリーツールが入っています。
使い勝手が今ひとつわからないのであまり使いこなしていませんが。

>アセンブラってまだまだあるんですね・・・私は今までMASM(TASM)しか知らなかったもので・・・

Vector だと
「NOWSMART ASSEMBLER : NWSA」
http://www.vector.co.jp/soft/win95/prog/se183316.html
「Pasm」
http://www.vector.co.jp/soft/win95/prog/se208292.html
とか言うのもあります。
http://www.vector.co.jp/vpack/filearea/win/prog/asm/index.html

>NASMでスタック変数を便利に使うにはどうしたらよいのですか?
nagoa.inc nagoa+.inc にはそのような記法がありますね。
実はそれを真似て、もうちょっと効率をあげたのを
私のサイトの NSTRUC.LZH に含んでいたりします。
winproc.inc がそうで %xdefine を使っています。
proctest.asm winloc.asm winproc.asm が使用例です。
(本当はマクロの解説をしたいけど長くなるので略)

>あと.EXE内のデータの隙き間をもっと圧縮できるリンカってありますかね・・・?
PE フォーマットの構造をよく知らないので…

AKA  [2005/05/28 Sat 07:49:28]  [219.100.196.210]

>登録も何も必要なかったか
なるほど・・・私もOllyやってみますか・・・

>クッションルーチン
申し訳ありません、私が勝手に作った用語です・・・他に適当な名前が思いつかなかったので・・・

>tim.asm の call MessageBoxA を call [MessageBoxA+2]
mov eax,[MessageBoxA+2]
call [eax]
とするしかないですかね・・・?

>何故か私の環境では一致しました。
うーん・・・何故なんだろ・・・?
私は、TD実行では
GetVersion = 00409942
TrueGetVersion = 86EF6240
通常実行では
GetVersion = 00409942
TrueGetVersion = BFF92FAB
となりましたが・・・
それでGetProcAddress()した場合のGetVersionはBFF92FABですね・・・
NT系と9xで違うとか・・・

>インクリメンタルリンク
私もよくわからないです・・・(^^;)
bcb5tool.hlpには何やら'*.IL?'は2回目以降のリンクを高速にするために用いられるんだとか書いてありますね・・・
.TDSはDOS TC/TASM時代から存在するデバッグ情報ファイルですね・・・

>http://www.visual-assembler.pt.vu/
うーん・・・英語ですか・・・
統合環境のようですね・・・リンカの代わりもしてくれる、ということなんだろうか・・・?

>http://flatassembler.net/
アセンブラってまだまだあるんですね・・・私は今までMASM(TASM)しか知らなかったもので・・・

ところで質問なのですが・・・

NASMでスタック変数を便利に使うにはどうしたらよいのですか?
MASM(v5?以降)では.model,cとかやって、proc/localで簡単に引数/ローカル変数が定義できたのですが・・・
一応マニュアルを見たんですがよく分かりませんでした・・・
マクロでやったりするものでしょうか・・・?
上のhttp://www.visual-assembler.pt.vu/にはトップページにまさにそのようなソースが書いてありましたが、これってincファイルをインクルードするだけでできるんですかね・・・?

あと.EXE内のデータの隙き間をもっと圧縮できるリンカってありますかね・・・?

wtz  [2005/05/24 Tue 21:14:03]  [202.95.45.124]
http://www3.synapse.ne.jp/wtz/programming/assembler/

OllyDbg は無料で、登録も何も必要なかったかと思います。
私の記憶ではただダウンロードしただけ。

ソースレベルでデバッグできるかどうかですが、ソースの表示は出来るようです。

>調べましたが、どうもクッションルーチンがあるようですね・・・

クッションルーチンというんですか…勉強になります。

tim.asm の call MessageBoxA を call [MessageBoxA+2] と試しにしてみましたが、
うまくいきませんでした。

>以下のコードを通常実行とTD実行することにより確認しました。

何故か私の環境では一致しました。

>もうわかったか、あるいは興味ないかもしれないですが、ilink32 -aaでGUIになります。

ありがとうございます。BC5.HLP をみればよかったんですね。
ただ妙なファイルが複数出来てしまうのはしょうがないんでしょうか?
(インクリメンタルリンクってなんだか知らないし)

PEフォーマットの構造ですが、NASM だけでリンカなしに実行ファイルを作成する
方法があるようです。
nagoa+.inc というのを使うんですが、その内容を眺めると分かるかな?と。
(まあ私がそこまで理解していませんが)
http://www.visual-assembler.pt.vu/
FASM(flat assembler)のソースを眺めるのでもよさそうです。
http://flatassembler.net/

AKA  [2005/05/21 Sat 10:23:05]  [219.100.140.75]

>とりあえず NASM のバージョンはなんでしょうか?
おお!言われて見れば・・・
私のはどこから落としたか忘れましたが、2002年に落としたものでした。(^^;)
NASM-0~1 ZIP 164,052 02-11-16 0:49 nasm-0.98-win32.zip

このバージョン、-vというオプションが存在しないですね・・・
NASM EXE 290,816 99-06-04 23:45 nasm.exe

新しいのを落としたら、確かにMODE32になりました!
nasm-0.98.39-win32.zip

どうも初期のバージョンではエントリポイントがFFFFh以下だとMODEND、10000h以上だとMODE32になるみたいですね。レコードスペースを節約かな??

>OllyDbg
OllyDbgって良さそうですね・・・色々便利な機能がついているという話ですね・・・ソースレベルデバッギングがどうなっているのかは気がかりですが・・・
英語がよくわからないですが、Ollyって登録制なんですか?お金はとらないっぽいようなことが書いてありますが・・・
以前海外サイトで無料のレジストをやってジャンクメールに悩まされたことがありますが・・・

>Borland 社や microsoft 社のインポート
調べましたが、どうもクッションルーチンがあるようですね・・・
Cで我々がGetVersionだと思って使っているGetVersionは実際には真のGetVersionへジャンプするルーチンのようです。
クッションルーチンはインポートされて値が設定されたテーブルを使ってジャンプしますが、デバッグ実行の場合、デバッガ(TD)がこの値を自分のフックモジュールへの値に書き換え、APIフックを実現しているようです。BCC32 5.5.1の場合ですが、以下のコードを通常実行とTD実行することにより確認しました。
---import.c
#include <windows.h>
#include <stdio.h>

void main(){
DWORD tmp, TrueGetVersion;
printf("GetVersion = %08X\n", GetVersion);
tmp = *(DWORD *)((BYTE *)GetVersion+2);
TrueGetVersion = *(DWORD *)tmp;
printf("TrueGetVersion = %08X\n", TrueGetVersion);
}
---
おそらくこのテーブルを見つけそこなった時にTDは落ちるのではないでしょうか・・・OllyもWin32APIへのジャンプを表示するらしいですからこのようなテーブルをサーチするんじゃないかと思います・・・

そうそう、それでインポートのないプログラムは普通はない訳ですが、インポートのない状態で使えるサービスってあるんですかね・・・?
システムDLLはちゃんとマッピングはされているみたいですが正確なアドレスがわからないとまともには使えないし・・・

>PEヘッダ
私もいい解説ページを探しているんですが・・・
某所で紹介してもらったのは以下の所です。
http://www.interq.or.jp/chubu/r6/reasm/PE_FORMAT/1.html
・・・しかし、はっきり言ってわかりにくい・・・誤植も多いし・・・
BC++付属のwinnt.hと付き合わせてやっとこさ意味がわかりました・・・

>ilink32 でインポートを含むファイルをリンクさせる方法
標準的には.defファイルを書いてインポートその他を指定するのだと思いますが・・・wtzさんのように「インポートライブラリ」をリンクする方法も用意されているようです。
ですが、私には何でインポートライブラリを別にしないといけないのかその理由がさっぱりわかりません。一つの.OBJ内にインポート指定(コメントですが)を入れ込んでしまうとILINK32は異常終了するみたいですね・・・

>コンソールプログラム
もうわかったか、あるいは興味ないかもしれないですが、ilink32 -aaでGUIになります。
bcb5tool.hlpに詳しく載っています。
.defファイルの書き方も書いてあります。
wtz  [2005/05/17 Tue 21:03:43]  [202.95.34.153]
http://www3.synapse.ne.jp/wtz/programming/assembler/

ilink32 でインポートを含むファイルをリンクさせる方法が何とかわかりました。
以下はどちらも nasm 用です。

----tim.asm
;test import main,tim.asm

extern MessageBoxA

section .code use32 align=4 class=CODE

..start:

push byte 0
push dword title
push dword mess
push byte 0
call MessageBoxA

ret

section .data use32 align=4 class=DATA

mess: db 'test message',0
title db 'test window',0
----
;Test Import,ti.asm

global MessageBoxA
import MessageBoxA USER32.DLL
----
どちらも -fobj でアセンブルして
ilink32 tim.obj ti.obj
で実行ファイルが出来ますが、コンソールプログラムになってしまうのが
難点です。Ilink32 のオプションをあまりしらないので。

ilink32 の import の方法は少し Alink と異なるもののやはり
----
034484 COMENT Purge: Yes, List: Yes, Class: 160 (0A0h), SubClass: 1 (01h)
Dynamic link import (IMPDEF)
Imported by: name
Internal Name: MessageBoxA
Module Name: USER32.DLL
----
このような形式を利用しているようです。
(tdump で import32.lib を眺めてみました。)
wtz  [2005/05/16 Mon 15:11:51]  [210.237.51.161]
http://www3.synapse.ne.jp/wtz/programming/assembler/

>>てゆうか 16bit プログラムになってませんか?
>うーん、そうみたいですね・・・ですが、なぜか、リンクも実行も正常にできるようです。

不思議ですね。
とりあえず NASM のバージョンはなんでしょうか?
当方 0.98.39 ですが…
nasm -v で表示されます。

>色々実験した所、理由はわからないですが、何か一つでも外部ルーチンをインポートしているとTDが落ちないみたいです。

OllyDbg でもコードが表示されるようです。不思議ですね。

レコードタイプはもともと 16bit の時代に出来たもので当時は偶数のレコードタイプしかありませんでした。
32bit の時代にレコードタイプを奇数(偶数のもの+1)にしたものが使われるようになっています。
32bit 版の無いものもあります。

>というか、wtzさんはレギュラーのデバッガは何を?

OllyDbg を使ってますが、多機能すぎて使いこなせてません。
「でじたるとらべしあ」(日本語化パッチもあります)
http://hp.vector.co.jp/authors/VA028184/
OllyDbg で問題のプログラムをデバッグするとコード領域が空に表示されます。
そして左下に「アクセス違反発生」と表示されます。

ただ実用上 import を含まないプログラムなんて無いでしょうからそれでいい気もします。

>ただしalinkの作るインポートは、なぜか、ILINK32のインポートとシステムが違う?みたいですが・・・
Alink の作るインポートは nasm の import 文に対応したものですから
( win32.lib も中身はそう) Borland 社や microsoft 社のインポートがどういう仕組みになっているのかはさっぱり分かりません。

まあこの問題は実行ファイルの PE ヘッダが具体的にどうなっているのかを理解する
必要があるように思います。(私はまだ理解してないし)
AKA  [2005/05/12 Thu 23:18:22]  [219.100.194.180]

>>wtzさん

>てゆうか 16bit プログラムになってませんか?
うーん、そうみたいですね・・・ですが、なぜか、リンクも実行も正常にできるようです。
??どうすればMODE32になるのかがわかりません。
wtzさんの[2005/05/01 Sun 14:25:48]の、test.asmの場合、
        nasm -fobj test.asm
とすると、やはりMODEND(レコードID=8Ah)になりますけど・・・???
wtzさん[2005/05/09 Mon 14:29:45]では、私のコードがID=8Bhになってますね・・・?
何が違うのか・・・

というか、nasmで生成したID=8Bhの.OBJってILINK32でリンクできますか?

>ここの VAL_SRC.ZIP の VALTECH.DOC を読むといいかも。
落とさせて頂きました。なかなか難しいですが・・・ID=8Bhは32ビットなのでやはりないですね・・・

>たしかにどちらも turbo debugger ではうまく起動できません。
色々実験した所、理由はわからないですが、何か一つでも外部ルーチンをインポートしているとTDが落ちないみたいです。Win32の何かをTDが使うのか、とも思ったんですが、別にKERNEL32やUSER32でなくて、例えばUNZIP32(のUnZipGetVersionとか)だけをインポートしても落ちなくなります。どういうことなんだろ・・・?

というか、wtzさんはレギュラーのデバッガは何を?

あと、alinkも試して見ましたが、こちらではインポートがあっても、TDはすぐには落ちませんが、TDを終了したりリロードしたりするとターゲットが不正な処理ダイアログの無限ループに陥ります。Ctrl+Alt+Deleteもなぜか効きません。(・・・困った・・・)
ただしalinkの作るインポートは、なぜか、ILINK32のインポートとシステムが違う?みたいですが・・・

そうそう、MASMとALINKの組み合わせってインポートできなくないですか???

なお私はWindows98(1st)です。
taa  [2005/05/11 Wed 02:03:04]  [219.214.188.254]

wtzさん、
4月27日にお返事を頂いた taa です。
しばらくここを読んでなかったのでお礼が遅くなりました。申し訳ございません。
自己改変コードの書き方を教えて頂き、どうもありがとうございました。
大変参考になりました。コード領域への書き込みは、Windows ならば 
virtualprotect、linux ならmprotect でできるようです。
教えて頂きました方法で、早速試してみようと思います。
どうもありがとうございました。
wtz  [2005/05/09 Mon 14:29:45]  [210.237.54.83]
http://www3.synapse.ne.jp/wtz/programming/assembler/

OBJ(OMF)形式用の ODU という(16bit)のソフトがあります。
http://www.programmersheaven.com/zone5/cat22/1434.htm
それで AKA さんの nasm 用のファイルを見てみると
----
MODEND (8B/00000051) - Module End (32 Bit)

Type of Module = Main module with relocatable start address
Data Source = Frame: Explicit, Target: Explicit
Frame Method = [F0] Frame specified by a SEGDEF index
Target Method = [T0] Target specified by a SEGDEF index
Frame Datum = "_TEXT"
Target Datum = "_TEXT"
Displacement = 00000000
----
masm 用のファイルは
----
MODEND (8B/0000002D) - Module End (32 Bit)

Type of Module = Main module with relocatable start address
Data Source = Frame: Explicit, Target: Explicit
Frame Method = [F5] Frame specified by the target datum
Target Method = [T0] Target specified by a SEGDEF index
Frame Datum = "_TEXT"
Target Datum = "_TEXT"
Displacement = 00000000
----
と少しだけ違うようです。

たしかにどちらも turbo debugger ではうまく起動できません。
OllyDbg でもコード領域が空になって表示されます。

masm /c /coff *.asm ;link /SUBSYSTEM:WINDOWS *.obj
でも実行ファイルは同様のようです。
うーん、どうしたもんだろうか?
wtz  [2005/05/08 Sun 14:48:11]  [202.95.37.106]
http://www3.synapse.ne.jp/wtz/programming/assembler/

>MASMどこで落とされました?
澤口@一升金さんも書かれてますが
http://www.masm32.com/masmdl.htm
の一番上のリンクからです。(m32v82r.zip)
(「MASM DOWNLOAD」で検索したら見つかったような)

あと MODEND とは module end のことで
MODE32 はその 32bit 版のことです。
てゆうか 16bit プログラムになってませんか?
MODEND では「スタート地点」を指定することが出来ます。
(TDUMP というツールもありましたね。)

masm+Alink でもうまくいくようです。

あと OBJ 形式の各レコードの意味合いは VAL という 16bit リンカーに
付属するファイルが詳しかったような。(16bit のレコードしか書いてませんが)
http://www.dunfield.com/downloads.htm
ここの VAL_SRC.ZIP の VALTECH.DOC を読むといいかも。

AKA  [2005/05/08 Sun 05:51:31]  [219.100.138.133]

wtzさん、澤口@一升金さん、どうもありがとうございます。遅くなりまして・・・

>澤口@一升金さん
TASM32って落とせましたか!
・・・残念・・・327Mとは・・・普通の電話回線なんでちょっと・・・

>wtzさん
MASMどこで落とされました?
澤口@一升金さんのご紹介もありましたが、私が知っているのは、以前のことなんで今はわからないですが、マイクロソフトから「VC++プロセッサーパック」というのと、「WinDDK」というものが落とせたと思いました。
(この掲示板の過去ログを見ただけですが・・・(^^;)あと違法な詰め合わせ品もあるみたいですが・・・)
しかしアナログ電話回線のため、いちばん小さいプロセッサーパックを落としたんですが、まさかLINKが付いていないとは・・・WinDDKにはあるようですが・・・どこかにLINKだけ置いてないですかね・・・


私もnasmを初めて使って、少し実験してみたのですが、

<<nasm>>(ILINK32でリンク成功)
************
segment _TEXT use32 class=CODE
..start
ret
************

<<MASM>>(ILINK32でリンクできない)
************
.386
_TEXT segment use32 byte public 'CODE'
start:
ret
_TEXT ends
end start
************

こんな風に書いてみて、BCC付属のTDUMPで.OBJを調べて見たら、ほとんど同じなのですが、

<<nasm>>
00004D MODEND(Main Module) Frame: SI[1] Target: SI[1], 0000h

<<MASM>>
00002D MODE32(Main Module) Frame: TARGET Target: SI[1], 00000000h

という部分だけが違っていました。他に違いはないみたいです。'MODEND'とか'MODE32'って何ですかね・・・エントリポイントなのかなとは思うんですが・・・勉強不足ですね・・・


それと、nasmで作った.EXEは普通に実行する分にはちゃんと動くようなのですが、TD32でロードしようとするとやはり「不正な処理」ダイアログでTDが終了されてしまいます。

PEヘッダのフォーマットを少し勉強したので、やはりTDUMPで出力させてみたのですが、Cで作った.EXEとどこが違うのかよくわかりませんでした・・・ちゃんとスタックもあるし・・・
明らかに違うところは、Cではデータディレクトリが多いことですね・・・Exports、Imports、Fixups、TLSというのが増えています。
よくわからないのはTLS(スレッドローカルストレージ)ですが・・・これ何ですかね・・・勉強不足ですね・・・
wtz  [2005/05/03 Tue 23:05:41]  [210.237.60.18]
http://www3.synapse.ne.jp/wtz/programming/assembler/

実は masm 用の link でプログラムを作るのはどうしたものかと
考えてたんですね。
----test.asm
.386
.model flat,stdcall

_TEXT segment public use32 'CODE'
start:
ret
_TEXT ends
end start
----
それでもなかなか分からなかったんですが、
紹介されたページを見て
ml /c /coff test.asm
link /SUBSYSTEM:WINDOWS test.obj
とやったら出来ました。ありがとうございました。
澤口@一升金  [2005/05/03 Tue 19:57:05]  [61.198.175.117]

澤口@一升金です。

to wtzさん:

masm での 最小 Windows プログラムは疑似命令を活用して
こう書きます。
リンカオプションにも注意してください。

http://win32assembly.online.fr/tut2.html

Borlandのリンカとの組み合わせはいまいち信用できないので
masm用の link.exe を入手されたほうがよろしいかと思いま
す。
これには masm32 をインストールするか

http://www.masm32.com/

Visual C++ 2005 Express Edition Beta 2 日本語版
をインストールすればついてきます。(もちろん、製品
版の VC++ を持っていれば、その link.exe が使用でき
る)

http://www.microsoft.com/japan/msdn/vstudio/2005/beta/

ml.exe は Visual Studio .NET 2003(製品版)などでは標準で
ついてきますが、Visual Studio 2005 beta 2 には付属してい
ないようです。

masm に関しては、統合環境として Visual Studio とか
WinAsm Studio を使用するのが便利です。

http://www.winasm.net/


wtz  [2005/05/03 Tue 15:29:58]  [210.237.49.88]
http://www3.synapse.ne.jp/wtz/programming/assembler/

end FLAT:start

とは出来るのですが、スタート点の指定が group 指定になってくれません。
wtz  [2005/05/02 Mon 14:02:57]  [210.237.62.142]
http://www3.synapse.ne.jp/wtz/programming/assembler/

連続書き込み失礼します。
masm の方では
.model flat
で FLAT group などは出来るようですが、スタート地点のオフセットを
group で指定する方法がわかりません。(忘れただけ?)
end start:flat だと
error A2096: segment, group, or segment register expected
と怒られてしまいます。
wtz  [2005/05/02 Mon 13:39:39]  [210.237.62.142]
http://www3.synapse.ne.jp/wtz/programming/assembler/

masm 入手しました。

AKAさんへ
dumpobj という自作のツール(16bit)を使っていろいろと調べた結果
うまくいく nasm の方の obj ファイルは FLAT という group が出来ていて
スタートアドレスはその Group での番地指定になっていましたが、
うまくいかない masm の obj ファイルではそんな Group はなく
スタートアドレスは _TEXT での番地指定になっていました。
で、FLAT という group を定義しようとしても masm は受け付けてくれません。
model flat という行をつけてもエラーになるばかり。
(dumpobj が欲しい方は上の URL からどうぞ)
wtz  [2005/05/02 Mon 11:36:08]  [210.237.63.6]
http://www3.synapse.ne.jp/wtz/programming/assembler/

AKAさんへ
簡単な C のプログラム、例えば
----
void main(){
}
----
を bcc32 -S でソースを表示させて
出来たファイルを masm でいじって ilink32 でリンクさせてみるとどうなるでしょうか?
(model flat がいるのかな?)

私も MASM をいじってみたいんですが、
どこで入手したらよいのでしょうか?
澤口@一升金  [2005/05/02 Mon 01:25:55]  [61.198.174.43]

澤口@一升金です。

to AKA さん:

Borland社のサイトからダウンロードできる無償開発ツールに
C++BuilderX Personal があるのですが、これの Windows版に
TASM32 がバンドルされています。

http://www.borland.com/products/downloads/download_cbuilderx.html
AKA  [2005/05/01 Sun 23:21:50]  [219.100.196.195]

AKA
.386
_TEXT segment public use32 'CODE'
_TEXT ends
_DATA segment public use32 'DATA'
_DATA ends
_BSS segment public use32 'BSS'
_BSS ends
_DGROUP group _BSS,_DATA
_TEXT segment public use32 'CODE'
start:
ret
_TEXT ends
end ;start
こんな感じでやりましたが、やはりおかしなヘッダが生成されているようです。

マップファイルx.mapをよく見たら_TEXTのLengthが0です。これはやはり異常なのだと思います。_DATAや_BSSにdd 1000h dup(?)とかをとっても0になってしまいます。あと定義していない_TLSというのがありますね・・・
Start Length Name Class
0001:00401000 000000000H _TEXT CODE
0002:00401000 000000000H _DATA DATA
0003:00401000 000000000H _BSS BSS
0004:00000000 000000000H _TLS TLS

bcc32で.cを処理した場合の.mapはちゃんとLengthに相応の値が入っているみたいです。

main.cとsub.asmの時に、bcc32がilink32に渡すコマンド行を、ilink32.exeを偽造して横取りしてみたら、
turboc.$ln
という一時ファイルが指定されるようなので(bcc32終了時に消されますが)、これも横取りしてみました。

c:\Borland\Bcc55\lib\c0x32.obj+
main.obj+
sub.obj
main.exe
/Gn/L"c:\Borland\Bcc55\lib\"/c/x/ap/Tpe
c:\Borland\Bcc55\lib\import32.lib+
c:\Borland\Bcc55\lib\cw32.lib

こういう内容でしたが、あまり参考になりませんでした。/Gn/c/ap/Tpeなどを色々試して見ましたが、私の思いつく範囲ではダメなようです。

nasmの実行ファイルは完動するのですか? 変な.map出ませんか?
だとしたら私もnasmを覚えるしかないんだろうか・・・確かTASMは有料でしたよね?
wtz  [2005/05/01 Sun 14:25:48]  [210.237.55.229]
http://www3.synapse.ne.jp/wtz/programming/assembler/

AKAさんへ
ilink はセグメント名やその属性に好みがうるさいようです。
nasm 用ですが、以下のようにすると ilink32 は問題なくリンクして
ちゃんとした実行ファイルを作ってくれるようです。

----test.asm
section _TEXT use32 public class=CODE flat
..start:
main:
ret


section stk use32 stack class=STACK flat
resd 1000h
----

class='CODE' とかするとダメでした。



e-mail: mist@e-net.or.jp
Structured Anchor Tree Return to Menu Return to Parent Menu 
Powered by Unit Missing Link.