1 :
デフォルトの名無しさん :
03/08/15 15:25
Z
誰もいないんで自分で 3ゲトー! ついでにage
6 :
Seisei_Yamaguchi :03/08/16 22:32
アセンブラってなんですか
>>7 Pentium5用命令セットのコードネームです。
あせばんだぶらじゃー
>>6 レジスタ多いね。
ARMのオペコードクロック表と、
インストラクションコードの変換表ってどっかにない?
gccでVC++のcodファイルに相当する出力が吐ければ当面はいらないんだけど・・。
アセンブラ… (;´Д`)ハァハァ
特定のCPUでサポートされない命令があったら どうなるの?
スケーラビリティを求めるな。
14 :
デフォルトの名無しさん :03/08/16 23:33
洋書でお勧めのものありますか。ターゲットはx86、Linuxです。
>>16 おおサンクス!
これさえあれば十分だよ。
やっぱ後発だけあって命令体系がすっきりしてる。
リナザウ買う目的が出来た(w
チョト前のインタフェース誌の arm特集 もええ感じ . cmagaでゲボアドバンスソフト開発記事が連載されてるみたいだけどそっちはどうよ喪まいら ? .
>>18 TCP/IPが使えるようになったらGB2CHを作ってみたい。
20 :
デフォルトの名無しさん :03/08/18 20:12
21 :
デフォルトの名無しさん :03/08/18 20:27
aseg
22 :
デフォルトの名無しさん :03/08/18 20:28
すまぬ、ちょっと聞きたいのですが pc9801の古いパソコンを持っていて、これに搭載されているCPUがi486sxなんだ。 これをフロッピーブートさせたいと思ったのだが、古すぎて資料が英語だった。 まぁ意地で読んでみているのだが、なかなか上手く進まないんだな。 んで簡単なものでもいいのだが、フロッピーブートさせるソースが載っているwebページ知りませんか?
単にIPL書きたいなら、秀和の本でも探して読めば?
98のブート情報なんてググルでくさるほど出てくる と思うんだが。 実際出てきたし。
だったらその一つでも示してやりゃいいのにね。
で、結局示せないと...。
そういえば昔、IPLにCPUと機種を判別するプログラム書き込んで PC88とX1とFM7でマルチブート(?)させてる土人ソフトがあったなぁ。
Z80と6809のマルチブートは燃えるな
しょうがねぇなぁ・・・ググルも使えねーでアセンブラなんか
無理だからやめとけ
FreeBSD(98)のソースじゃ量が多すぎるからGRUB98の
ソースがいいだろう
さて示したが、
>>30 君は何をしてくれるのかね?
>>33 ぷぷっ、1日半も必死になって調べて GRUB98 だけかよ...。
(まあ、「くさるほど出てくる」と言うのは不問にしてやろう、これ以上は無理そうだしね。)
> さて示したが、
>>30 君は何をしてくれるのかね?
俺は
>>28 で「示してやればいい」と言ってるだけだけど ? 日本語も読めないヴァカですか ?
>>27 か、
>>29 の時点で示せてればいい人になれたのにね。(藁
他にもそれに類似のものでいいならいくつか見つかるけど、 そんなん並べても無意味。腐るほど出てくるってのも過言じゃああるまいよ。
もういいよ、 > 腐るほど出てくるってのも過言じゃああるまいよ。 って言うだけならいくらでもできるしね。
なんでメル欄?この板らしくないな
>>40 この板らしくない住人が来たのかと・・・・
>>41 平穏なんが好きなのになあ……。まったりしようよ。
25が言ってるようにFreeBSDとかNetBSDとかPlamoとかDebianとか
いくらでも見るのはある(個人的にはPlamoがお勧めだけれど)し、
ブートローダでもPC98動作が保証されてる奴は幾つもあるから
見つかるってのは本当だと思うんだがなあ。
つーか、「腐るほど」は言いすぎだろ。
所詮 PC-Unix 系しかないやん。
まあ、
>>27 も
>>25 みたいにリンクの一つでも示しときゃすんだ話だと思うけど。
しかしDISK BIOS関連情報は意外と見つからない罠 エミュのソースがあるが
AMD64ってどうよ。まだ誰も触ってないかな?
ちなみに どうよ ってのは、単に感想を聞きたいってだけだよ。
47 :
デフォルトの名無しさん :03/08/28 00:40
すいません質問なんですが、 Cで書いたファイルの方でexternで宣言してる変数をアセンブラのファイルの方でも使ってるんですが 警告がでます(外部参照変数としてあつかうとかどうとか)アセンブラの方で宣言してないのが 問題だと思うんですが、小生Cしかわかりません。 アセンブラの方でexternとして宣言するにはどうすればいいんでしょうか?
48 :
デフォルトの名無しさん :03/08/28 00:41
制服、網タイツ、手袋となんともフェチ心をくすぐる
エレベーターガールの沙里奈ちゃんです。
スレンダーな身体で感じまくる姿がエロイ!
結構マジでオナニーしているところも淫乱度満点です。
今日はデパートにでも行ってみようかな?
無料で見れる動画です。
http://66.40.59.73/index.html
>>50 IPLは自作。
デュアルブートのは、当時同人ソフトだったよ(クトゥルフを題材にした探偵もの)。
当時=13年ぐらい前。
54 :
デフォルトの名無しさん :03/08/28 22:07
>勝手にDOSをインストールさせる変な機能付き。 まるっきりウイルスのメイン機能ではないか。
>>54 「Bドライブにシステムディスクを入れてキーを押してください」とか出て、
指定ドライブにシステムディスクを入れないとだめだけどね。
# 勝手にというのは誤りですね。
今読んでたんですが、かなりDQNなコードですね。。
>51 アナンデュールのホラー オブ クラウドウェルだね。 懐かしいな。SOLさん元気かね。
南下俺のせいでものすごいことになってしまったようで・・・
まじで済まない。俺の無知のせいでここまでの議論になってしまったことは、俺の責任以外何者でもないと思う。
確かに俺はただの馬鹿だった。
>>27-39 悪かった。すべて俺が悪い。お前らはなんでもない。俺を煽れ。それで住むなら腐るほど煽ってくれ。
そして一般人となってくれ
そして参考資料ありがとうございました。
まだまだやらねばならぬことが腐るほどあることに気づきました。
それまでこのブートプログラムなどなどについては、保留しますが、参考資料保存させていただきました。
ありがとうございました。
本当にすみませんでした。これ以上言えない位、俺はあほでした。
だから闘争は止めてマッタリと話をしてください。
ムナシク逝く。ありがとうございました。
なんかまたIntelに新しい命令セットが追加されるそうだけど その命令表みたいなのってもう出ているのでしょうか?
ぷに系の命令らしい
それは萌えられますか?
>>62 いくつかの命令であなたのバッファがオーバーフローするエラッタが見つかりました。
stosb/d/wって、いくつかのmov,addの組み合わせで同じことが できそうだけど、stosb/d/wを使う利点はなんでしょうか? どういうときに使うと便利で、どういうときは避けたほうがいいの? stosb/d/wを使うことを決めたら必然と特定のレジスタが拘束されるけど…
>>64 はっきり言って、いまのCPUで使う利点はないよ。
昔は少ないバイト数でプログラムが書けて速度も速かったんだけど
今のパソコンではメモリの制約も無いし、
mov等の単純な命令を組み合わせた方が速くなっちゃったからね。
Pen4ではストリング命令はかなり速いと思った。 IA-32命令セット・リファレンスのREP/REPE/REPZ/REPNE/REPNZの項に、 「REP STOS 命令は、大きいメモリ・ブロックを初期化する最も速い方法である。」 と書いてある。
>>66 そうでしたか・・・
パイプライン化でストリング命令よりも単純な命令の組み合わせの方が
速くなってるとばかり思っていたのですが。
ストリング命令もまだ捨てたもんじゃないですね。
逆にAthlonではストリング命令はあまり速くないと思った。
どうでもいいけど漏れ、IA64のアセンブラのコード見てる・・・ アプリ開発やってて、コンパイラが発展途上(と漏れは思ってる) なので、どのようなコードを書けば速くなるか、はき出された アセンブラコード見てチェックしてる。 が、よくわからん。IA32に比べて判断が段違いに難しくなった気 がする。 他にIA64の仕事している人いる?
IA64ってまだあったんですか? Intelも見捨てたんじゃなかったっけ・・・
NASMのDOS,COM形式で文字列を入力する方法を教えて下さい mov ah,0ah mov dx,buff int 21h とするのは分かるのですが buffの部分をどうすればいいか良く分からないのです
それで…PNIという新しい拡張命令セットはどうなの? 対応するのと非対応とでパフォーマンスに差がでる例とかありそう? 素人目にはさほど強力には感じられないんだけど、 バリバリのアセンブラプログラマの方にはどうなのでしょうか
やっと解決しました 72さんの記法はMASM用で、NASMでは使えないみたいです buff: db 11,0 times 11 db '$' で上手くいきました
素人な質問で申し訳ないのですが、SSEでパック演算をするときにインテル のドキュメントの例ではメモリのアドレス値をEAXに入れてますよね。 てっきりアドレス値はINDEXレジスタにいれるものと思ってたんですが。 でesi,ediに入れると数十倍も遅くなります・・・ これはそういう仕様なんでしょうか・・・
すいません、ソースを点検しなおしたら私のミスでした(恥 てっきりSSE命令ではEAXに入れるものかと勘違いしかけた。。 ああ、なんでEAXに入れるんですか、インテル・・・
インラインアセンブラでポインタの指すアドレスの値を 使うのはどうすればいいんでしょうか? int *p; p = malloc(sizeof(int)); p[0] = 1; _asm{ mov eax, 2 ; add p, eax ; } とかやってp[0]を3にしたんですが・・・いまいちよくわかりません・・・
>>77 add dword ptr[p], eax
じゃない?
それとも
mov eax, dword ptr[p]
add eax, 2
mov dword ptr[p], eax
みたいに、取り出して戻さないとだめだっけ?
*p = 3
なら
mov eax,[p]
mov [eax],3
でしょ
>>77 や
>>78 だと
(BYTE*)p += 2
80 :
デフォルトの名無しさん :03/09/20 00:25
すごい初歩的なんですが・・・ 勉強用にエミュレータを作ろうと思い、Z80をターゲットにしたんですが、 DAA命令の動作が理解できません。 ハーフキャリフラグを使用、とか命令実行後にハーフキャリを操作、 などと、ネット上で検索しても要領を得ません。 Bit3→Bit4のキャリーでなんで002h+008h→010hとなるのでしょうか?
BCDとか調べてみるといいかも。
コボラーに聞けば懇切丁寧に説明してくれるぞ。
>>81 一応調べたんですが、いまいち自信がありません。
動作をプログラムで書くとこんな感じでいいんでしょうか?
LD A,008H
LD B,002H
ADD A,B
LD C,A
AND 00FH
CP 00AH
JR C,LABEL1
LD D,006H
ADD A,D ← ここでハーフキャリフラグセット?
LABEL1:LD A,C
AND 0F0H
CP 0A0H
JR C,LABEL2
LD D,060H
ADD A,D ← ここでキャリフラグセット?
LABEL2:JR $
なんの勉強だろう
>>80 DAAは直前の命令実行後ののハーフキャリーで動作が変わるということ。
直前の命令(LD 等フラグに影響しない命令を除く)が加算の時は、
(1)直前の命令でハーフキャリーがセットされているか又は下位4bitsが0?AH〜0?FHの時、06Hを加算する。
(2)直前の命令でキャリーががセットされているか又は(1)の結果キャリーがセットされたか又は
上位4bitsが0A?H〜0F?Hの時、60Hを加算する。
実際にエミュレータを作るなら、直前の命令が減算の時は動作が異なるしDAA実行後のフラグの状態
も考慮しないといけないので、もう少し複雑。がんばって勉強してくれ。
>>79 いちどレジスタに入れないとダメなんですか・・・
勉強になりました。
>>85 ありがd。大体理解できました。
「初めて読む486」とかのCPU関係の本を読んで動作を勉強中です。
ただ、どの本も命令の結果フラグが変わるとしか書いていないので難しい・・・
>>84 CPUの動作の理解 & C++ & デザインパターンです。
ちょっと親切な人がいたみたいだな。 教えてチャンわきまくり
>89 質問は別スレですべきですか?
>>88 まず、「今、アセンブラのコンパイラって結構手に入らないみたいですね。」なんてわけわけわからんこと書いてあるサイトは今すぐ見るのやめたほうがいいと思うぞ。
そのページ読むだけでも...
> 私がよく読むアセンブラの本を紹介します。
> 技術評論社 8086マクロアセンブラ入門 4-7741-1442-1
> なぜ今頃?と言いたくなるような2002年3月出版のアセンブラの本
> ちなみに私は読んだ事はありません。
まあ、世間に向かってこんな恥をよくさらせるもんだと思うよ。
で、本題...
> 4bitの場合は書いてありませんでした。
と言うのは、結局何がしたいの ?
0〜15 の数を 0〜15 の数で割りたいと言うことか ?
普通の人が、2桁の割り算をやるのにわざわざ2桁の電卓を買ってこないのと同じで、普通の CPU もわざわざ 4bit に特化した割り算命令なんか持ってないよ。
普通に SRC = byte, DST = byte でやればいいと思うけど。
> mov ax,4c4ch
> div ch
> としてみたらフリーズしました
ch < 4ch になってて、#DE (除算エラー) が発生しただけじゃないの ?
>>90 いいだよ。
>>89 みたいな奴は放置に限るよ。
>91 レス有難うございます。 >結局何がしたいの ? mov ah,2ch int 21h によってレジスタCHに時間(0から23までの数字)が格納されます。 この数字を十進数で表示したいので、 10で割って10の位と1の位に分離して、 順番に表示したいのです。 そのために1byteの量CHをahで割りたいのです。
>>91 >まず、「今、アセンブラのコンパイラって結構手に入らないみたいですね。」なんてわけわけわからんこと書いてあるサイトは今すぐ見るのやめたほうがいいと思うぞ。
>そのページ読むだけでも...
>
>> 私がよく読むアセンブラの本を紹介します。
>> 技術評論社 8086マクロアセンブラ入門 4-7741-1442-1
>> なぜ今頃?と言いたくなるような2002年3月出版のアセンブラの本
>> ちなみに私は読んだ事はありません。
本題と関係ないけど激しくワロタ
「よく読む」「読んだ事」のない本ってどんな本やねん
でもさらっとサイトを見てると気づかないと思う
このスレはなぜか殺伐としていない。なぜだ・・・
マシン語の神がそうさせるのさ
>>92 文字列を格納するバッファのアドレスが BX に入ってるとして...
(手近なアセンブラが無かったので、Delphi のインラインアセンブラ)
mov dl, 10
mov ah, 0
mov al, ch
div dl
add ax, '00'
mov word ptr [ebx], ax
mov byte ptr [ebx + 2], ':'
mov ah, 0
mov al, cl
div dl
add ax, '00'
mov word ptr [ebx + 3], ax
mov byte ptr [ebx + 5], ':'
mov ah, 0
mov al, dh
div dl
add ax, '00'
mov word ptr [ebx + 6], ax
> そのために1byteの量CHをahで割りたいのです。
ちゃんと 0ah って書く癖つけないと、つまんないところではまるぞ。
あと、86系プロセサには aam なんていう命令があって、こっちは al = 0 にする必要が無い。 ただし、商と剰余が div とは逆に入るので、上みたいなやり方すると ah/al を入れ替える必要があるので一長一短。 mov al, ch aam xchg ah, al add ax, '00' mov word ptr [ebx], ax
>96-97 有難うございます 上手くいきました
次の命令の流れは、UパイプとVパイプでペアリングできますか? lea edx, dword ptr [eax+4*eax] add eax, 4 lea では eax を変更してませんが、add で eax を変更しています。
可だと思いまっする
Cのmemcpy(),memmove()とか WinAPIのCopyMemory(),MoveMemory()とか src領域とdst領域がオーバーラップしているか否かで 使い分けが必要だけどさ、その違いって、内部では どう影響してくるのでしょうか? rep movsb にも影響があるの?
滅茶苦茶ある 領域の前後によって cldして前から stdしてサイズ分足して後ろから (逆だったかも)
もう少し詳しく説明してほしいな 以下の4つの状況で4つのアルゴリズムが必要なの? 記号 ○ ... src a ...... dst - ...... 無関係 @ ... オーバーラップしているところ 方向 ←メモリの前方 メモリの後方→ 状況A ○○○○○○○○○-------aaaaaaa 状況B ○○○○○@@@@aaaa 状況C aaaa@@@@○○○○○ 状況D aaaaaaa-------○○○○○○○○○
103だけど、srcとdstの領域の大きさが違ってた… (○とaの数が違ってた) 同じ数だとして読んでね
A,Dは先頭からコピーしようが末尾からコピーしようが関係ない。 Bは末尾、Cは先頭からコピーしないとデータが破壊される。 図をよく見れば分かると思うが。
それじゃmemcpy()とmemmove()って、実は、たいした違いがない? memcpy()は、いきなり rep movsb を行って終了。 memmove()は、スタート地点の設定とコピー方向の設定を行ってから rep movsb を行って終了。 前処理があるかないか、ただそれだけの違い? この2つの違いって、もっとパフォーマンスに影響するような 特別な処理をしているのかと思ったけど、勝手なおもいこみだったのか
コンパイル時にアセンブリリストを吐き出させて比較してみては? あと速度も。
>>106 普通バイト単位なんかでコピー/移動しないよ。
>>106 パフォーマンス的にはmemmove()が前処理するだけ僅少だけど悪い。
但し
>>105 さんも言っているように、コピーする領域が重なっていると
memcpy()の結果は未定義。memmove()は重なっていても正しく動く。
>>108 コンパイラにもよるがrep movsd→rep movsw→rep movsbとなるようだ。
110 :
デフォルトの名無しさん :03/10/11 20:53
VCで_asm{}で囲って今日からアセンブラやりはじめました。 インラインアセンブラっていうんだっけ? アセンブラで書く理由はMMXの命令とやらを使えば速くなるらしいからです。 クロック数ってどうやって測るんですか? 単純に命令数だけ少なければいいというわけじゃないみたいですので。 どなたかお教え願います。
速くなるって言っても、 パディングとかの制限で結局使えなかったりするが
>>69 仕事でやってるわけじゃないが、あれは難しすぎる。
ハードのエンジニアの感覚じゃソフトならなんでも
できるだろって思うのかもしれないけど、、、
Windows2003にx86コードのエミュレーションが実装されてる
らしいけど、その変換アルゴリズムを一度見てみたいな。
113 :
デフォルトの名無しさん :03/10/11 23:22
Z80上がりの俺は OR EAX,EAX 派
>>115 cmp eax,imm32は5バイト長、test eax,eaxは2バイト長。レイテンシは
どちらも0.5で変わらないが、cmpの方が命令長が長い分フェッチ効率
が低下するのでtestの方を使っているのでは。
本質的には影響ないんだが、、、 imm32は0との比較だと符号拡張が使えるから3byteに収まるんじゃない? mov reg,0はxorと比べてえらく冗長になるけど。
>>119 という事はほんの1バイトの差もコンパイラメーカは惜しいと。
当たり前だろ。 おんなじことができるなら、ちょっとでも短いほうを選ぶよ。 0 との比較って結構多用されるしな。
昔はテキストサイズの減少が重要だったが(ROMイメージなど)、 今はキャッシュに乗る確率を上げることが重要だな
>>115-122 そういう特定のアセンブラ(やCPU)に特化したエディタって無いでしょうか。
VC++はクラスのメンバを補完してくれたり、関数の引数や機能を教えてくれたりしますが、
そんな感じでレコードのメンバを補完してくれたり、
今の命令が何バイトになるか、
そのほかに同じことが出来る命令があるか(もちろんエディタが理解できる範囲でですが)、
後は命令のつながりを色で表示してみたり(パイプライン用)。
CPUもどんどん複雑になっていくし、
そろそろ(?)そういうのに頼ってもいいんじゃないかと思ったのですが。
>>124 Intel自身もアウト・オブ・オーダー動作やハイパー・スレッディングが
起きた時の正確なレイテンシは分からないと言っているくらいだから、
RDTSC命令でクロック数を測るしかないな。分岐予測などが働いた
際にはますます予想が困難になる。
WindowsならばQueryPerformanceCounter()もあるしな。
127 :
デフォルトの名無しさん :03/10/12 19:51
アセンブラ用の構造化エディタとかところであるんでしょうか? ないなら、これで未踏ソフトウェアに応募できたりして。
>>126 そうですか。
でも大雑把には分かった方がありがたいですよね。
>>125 ,127
未踏ソフトウェアといのは良く知りませんが、
無いなら自分で作れば儲けものかも、とは思って聞きました。
とはいってもシェアウェアにしても誰も買わないだろうなぁ。
仮に作れてもやっぱフリーか。
>>128 VSのプラグイン形式にして、
マイクロソフトに売りにいくとか。
>>128 このご時世、シェアウェア作ってレジストで(゚д゚)ウマーって
考えない方がいいよ。
みんなGNUが悪い。
GNUというよりも、Windows上の無料アプリが多すぎるせいでは? UNIXのソフトなんて無料だろうが、どうせ一般人は使えないし。 binutilsなんてこのスレの住人じゃ誰しもありがたく使ってるもんだと思うが。
スレタイ的にはgasが(・A・)イクナイ
134 :
デフォルトの名無しさん :03/10/13 18:14
オール・アセンブラで書かれたフリーウエアってあるのけ?
それなりにあると思う。
DOS時代にはよく見かけた
DOS用ならいくらでもあるけど Windows用だとあまり無いんじゃないかな。 UNIX系はそもそもCPUが違うからアセンブラで書ける部分がほとんど無いし。
株た
>>137 > UNIX系はそもそもCPUが違うからアセンブラで書ける部分がほとんど無いし。
意味わからん...。
Unix ってそんなに特殊な OS なんか ?
(て言うか、X86 系でも Unix 動くんだが...。)
x86上のUNIXでしか動かないソフトなんて使えなねえだろ
もしかしてLinuxと*BSDしか知らないのかな?
VZやFDはアセンブラだったよな。 ウイソでメジャーなのは無いんじゃないの?
143 :
デフォルトの名無しさん :03/10/13 19:25
インラインアセンブラってgccでもできます? VC.netはMEで動かんし、マジでふざけるなっての。
144 :
デフォルトの名無しさん :03/10/13 19:27
調べたらできるようですね。
できるけど、書式がIntelのとかなり違うよ
エンディアンの違いよりも、こっちのほうが大きな違いにおもえる
どうも見てみたら、違いますね。 やっぱりVC++6.0買おうかな。 別にフリーでなくても良いんだが、MASMと互換さえあればなんでもいいんだよな。 参ったなぁ。 ところでアセンブリでアセンブラ作る人っているのだろうかと素朴な疑問。 そんな面倒なことやるわけないか、一部の人以外は。
>>147 何がやりたいの?
x86アセンブラレベルで書いてみては試しての勉強なら、Delphiがけっこうイケルよ。
タダだし、ニモニックとか書き方は MASM と殆どおなじだし。
MASMだけならVC6SP5.EXEを落とせば入ってるってどっかに書いてあった これとbcc使えば一応は
MASM互換のフリーのアセンブラがどっかにあったはず。 スモールモデルしか作れないけど。
>>149 ちゃうちゃう。
VCPP.EXE, VCPP5.EXEだ。ここの過去スレにあったはず。
NASMでいいんじゃないか? それと、知ってる人なら知ってるだろうけど、 VC7はコマンドライン部のみ一式を抜き出して使える。 パス設定するだけで、インストール不要。
コマンドライン部ってのは、clやnmakeとかのことね。 スレとあんま関係なかったな。
gas使えgas!
gasなんて直接触るものじゃないよ
>>140-141 はぁ ?
複数の CPU で動く OS が Unix だけだと思ってるの ?
そういう意味なら、WindowsCE でも同じだろ。
わざわざ "Unix 系は" なんて書く意味がわからんよ。
なにこのヒト
>>156 Windowsも複数のCPUで動くだろ?
漏れのはDualだぞ。
まあまあ。 多分実生活でつらいことがあってイライラしてるんだよ。
Alpha用のWinNTは・・・
PowerPCのも忘れないでクレ
CP/Mはなぁ、
gnuの書式は68kやってると、それほど違和感なかったり。
CP/Mなんて現存しているのか?
現存してるだろうが、使われているかは知らん。 俺の周りでは、MS-DOS 2.11 はまだ現役。
NASMとBCCで無理やりインラインみたいなことできることを知りました。 どうもオブジェクトファイルをリンクするらしいですね。(半分意味分かっていないですが) これってMASMからオブジェクトファイルを作ってリンクみたいなことってできるのでしょうか? できるかできないかで充分ありがたいです。後は、ヤホーに逝きます。 まぁmasmに固執する理由は無いんだが、どうもmasmという響きが好きだ。
169 :
デフォルトの名無しさん :03/10/14 04:11
x86でOPは RISCふうの単純なマイクロコードに分解されるそうですが このRISC風のマイクロコードってどういったものなのでしょうか? やっぱりadd x xとかそういう命令表が別にどっかにあるのでしょうか?
特定企業の担当者しか答えられない(含企業機密関連) 質問はやめましょう。
fasmがたしかセルフビルドだったような
>>169 X86はどこかで公開されていたような。
マイクロプログラムともいうね。
CPUのアーキテクチャにおいての話になるのだが
アセンブラのaddとか、分岐命令・・・・・、と色々合って
そのコードをOPコードとして受け取ると命令制御部でその命令がどんな命令か判別しなければならない。
それを判別して実際に処理を行う制御回路に対して有効にするロジックを指定する。
それでは有効にするロジックとは何か。
それは、
CPUの中のレジスタで待機させてあるアドレス情報をアドレス出力レジスタ(アドレス出力PINにつながってる)へ、とかレジスタで待機させてあるデータを実際に処理するALUに送るとか、CPU内各部に対して指示をだしてあげなければならない。
(あたかもCPU内にバスがあるように、REQ、READ、WRITE信号のようなもので有効にする部分をアサートする。)
或いはCPU外部に対してREQ、READ、WRITE信号などを出さなければならない。(このCPUのコントロールPIN出力を一手に扱っているコントロールレジスタに命令制御部がコードを送り込んでいる。)
これが有効にするロジックであり制御回路のやること
こうみてくると、受け取ったアセンブラコードを判別し処理を振り分けるために制御回路に指示を出す部分をワイヤードロジックで組むのは非常に難しい。
従って、RISCのようなCPU命令の多いCPUはHDLなどで処理をプログラミングしてマイクロプログラムを形成している。
ワイヤードロジックで組んだものをワイヤードロジック制御部(処理コードが少ない特定機能の高速LSIに見られる。例えば高周波用LSIとか)
といい、
上述のようにマイクロプログラムで組んだものをマイクロプログラム制御部という。
また、書くのが遅れたが、制御回路は高速にするため、ワイヤードロジックで組まれているのが通常だろう。
以上、X86にぴったり当てはまるかどうか分からないが、CPUアーキテクチャでした。
>RISCのようなCPU命令の多いCPUは (゚Д゚)ハァ?
>>173 ちうか、マイクロプログラムとuOPSを同じレベルにしているところがすでに…
>>169 そりゃあるだろう。
ただ、表から流し込む手段が無ければ、知ってても意味がない。
Nx586とか言うCPUがこれ出来たんだっけ?
175 :
デフォルトの名無しさん :03/10/15 20:45
大学で6502アセンブラやってるけど意味わかんないです。(゚Д゚ )マズー
>>175 取り敢えずYレジスタを使った間接アドレッシングの意味がわかればよし。
他にはADD命令がないからCLC、ADCと。
SUBもないからCLC、SBC。
後何か難しかったっけ?
>>175 ファミコンやアップルIIか?
それともポーカーゲーム機。w
>>175 スタックが 256 バイトしかないから気をつけろよ。
>>176 >>176 さんの言ってる言葉が全く理解できないレベルです。
まだ大学一年生で今年から講習を受けています。
最初のほうの授業では「変数x、yを置いて四則演算を行え」と言った簡単な
問題が出てたんですが、最近は「12個の整数を入力して2x3と3x2の2個の
2次元配列a,bにセットし、axbを計算してその結果を2x2の2次元配列rに
セットし,ディスプレイに出力せよ.ただし,冗長計算を避けるため,
Cプログラムにコメントで示すインデックス計算を該当ループ内ですること」
といった問題になってきています。今までパソコンなんてホームページを
見るといったことぐらいしかしてないので、ヒントでC言語で書かれた
プログラムが載っているんですがそれさえ意味不明な状態です。
大学の授業だけでは厳しいので初心者用の参考書を買って勉強したいのですが
売っていますでしょうか。愚痴っぽくなっちゃってスイマセン。
>>177 どういうことかよくわかりませんが、LINUX立ち上げてemacs起動して書けー
って言われていますヽ(`Д´)ノウワァン
>>179 >大学の授業だけでは厳しいので初心者用の参考書を買って勉強したいのですが
10年前に既に6502の本は入手不能になっていたので今買うのは無理。
>>179 配列×配列の計算ね。それは簡単だが、6502にはかけ算命令が
ないのでシフト命令(ASL)を使ってエミュレートしませう。
>>179 ああそれから、6502の資料なら
ttp://www.6502.org に豊富にあるし、65816も6502エミュレーションモードを持っているから
65816で文書を検索してもよい。
それと、これが一番気になっているんだが、そのLinuxには6502シミュ
レータはもちろんあるんだろうな?
z80を実習で触らされたなあ。矢印が走るプログラム書いて喜んだもんだ。
186 :
デフォルトの名無しさん :03/10/15 21:53
アセンブラってループとか分岐処理でラベルを多用しますが、 ラベルの命名方法って皆さんどうしてますか?
かなり古いものみたいですね。・゚・(ノД`)
講師の人も結構歳がいってるみたいで・・・。
>>184 ウホッいい英語。
シミュレーターとは書いたプログラムを実行するものですか?
それなら入っていますー。学校から支給されたPCですので。
構造化マクロでラベル激減
>>187 そりゃ、黄金時代はZ80と人気を二分した8bitCPUだからな。
日本はどういうわけかZ80ばかり売れたが、アメリカじゃAppleII
が大ヒットしてどこもかしこも6502だらけだったもんだ。
あの時代にパイプライン実行ハードウェアを備えたCPUとして
結構注目されたもんだよ。
シミュレータがあってよかったね。ないとバグ取りができないも
んな。
6800 も忘れないでくれぇ〜〜〜。
>>190 惜しかったな6800。折角アキュムレータが二個あるのにインデックス
レジスタが一個しかなくて使いにくかった。
68000が出てそれは完全に解決されたが、既に8086/8088が出ていて
組み込み用になってしまった。今でもSH4として残ってるじゃん。
そうそう、その陰に6809という究極の8bitCPUがあったが寿命が短かっ
たねえ。当時の8088に匹敵するスピードが出ると言われたが、MMR
を使ってもPCが16ビットしかないから一タスク64KB以内という制限
があったり(それは8088もほぼ同様だったがメモリモデルの考え方を
取り入れてユーザーの目を眩ましていた)。
80386が出た事で68系はメインストリームから完全に除外されてしまっ
たな。PowerPCなどのRISCで一時期は盛り返しそうだったがPentium
シリーズが意外な速度の伸びを見せてIBM/PCもオープンアーキテク
チャになって今じゃWindowsだらけ。FreeBSDやLinuxももちろん必要
だがホントにマイナーな研究用か鯖用に特化されてしまった。
>>186 後ろに数字。
range_check:
range_che010:
range_che020:
BASICの行番号の感覚に似てたな。
ああ、今でも某VUアセでは(ry
8085 も忘れないでくれぇ〜〜〜。
>>193 出た〜。でもできれば8085Aの方が・・・・8085は思い切りハードウェア
にバグがあったし。
6502は今でも現役だったりするなぁ
>>192 やっぱり後ろに数字ですよね。
ありがとうございました。
197 :
デフォルトの名無しさん :03/10/16 18:40
EAX, EVX, ECX, EDX, EDI, ESIだけでは大変。 EBI, ECIレジスタが欲しい。
198 :
デフォルトの名無しさん :03/10/16 18:41
EVX → EBX
どうしたんだ?久しぶりに来てみたんだが、えらい活況じゃないか!
初期のカード型公衆電話機は8085Aだったね。
>>195 ロックウェルがあぼーんしかけて6502の利権を売ったので
えらく安く作れるようになったからなー。
ファミコンとスーファミとゲームボーイの話はあえて避けてるのか?
>>202 スーファミは65816で、ゲームボーイはZ80だったっけ?GBAのCPUは知らん。
>>197 x86-64規格では16本の汎用レジスタが使えるようになるので、64bit版
Windowsが広まるまで首を長〜くして待て。
>>204 x86の汎用レジスタって汎用ってかんじが微妙だけど
このかんじはどこまでも踏襲されていくのだろうか
フリーとなったMASMでWindowsのCOMコンポーネントを開発しようと思っています。 とりあえずはマクロライブラリの整備から始めようかと。
>>191 MAC の話を避けてるのは、何かトラウマでもあるのか ?
Sony NEWS とか X68000 を語れとは言わないけどさ。
>>207 MASMってフリーなのけ?
何処でダウソできるのだ?
>>203 ゲームボーイはZ80 likeなCPUではあるが、
あれは決してZ80ではないぞ。裏レジスタもないしIX、IYもないし。
まるで8080みたいだな
>>206 ARMシリーズなら値段も安いしGBA自体電池で動くのでとにかく
低消費電力のCPUという事でぴったり来たんだな。しかしあれは
ピュアなRISCなのでアセンブラでの開発はほとんど皆無でしょう。
>>208 富士○に裏切られたから。FM-77AVを使っていたのにFM-Vシリー
ズはx86にしやがった。当時はまだ学生でワークステーションなぞ
は高嶺の花でとても手が出なかったからね。仕方なくPC-98シリー
ズにしたよ。途中でMacへの浮気も本気で考えたが、その当時俺
は既にC言語を覚えており、アセンブラはほとんど使わなくなって
いたのでPC-98が廃れてからはAT互換機一直線。デバイスドラ
イバを書く事が仕事で多くなってからは386のマシン語と戦うという
奇っ怪な運命だ。MS-DOSの時に頭が狂いそうになった事がある
が。8086の16ビットマシン語は二度と嫌(w。
そういやMS-DOS版のLotus1-2-3はオールマシン語で書かれていた
そうだが、書いた人はきっとどこか頭がおかしくなったに違いない。
>>210 そんな半端な仕様だったのか。もともとIX, IYがあったとしてもとても
汎用レジスタとしては使えず、しかもインデックスレジスタとして使うと
(HL)に比べて異様なレイテンシがかかっていたから思い切って取り
除いたか。裏レジスタも割り込みが頻繁に掛かるハードウェアでな
いとほとんど出番なしだし。
昔のPC板池
>>214 今昔のPC板に初めて行ってみてきたが、互いに立場を全く譲らず
考え方が固化してしまったヤシばかりで吐き気がした。
結局8ビット16ビットだけで燃え尽きて32ビット以降の世界について
これないような人たちの集いの場のように感じた。
おそらくめいっぱいアセンブラばかり書かされて脳みその一部が
熱暴走で破壊されたんだろうな(w
>>212 ARMもMIPSも必要であればいくらでもアセンブラで書くよ。
ARMはフラグの扱いまわりが楽しいよ。
個人的には、x86よりはどれも書きやすいと思うけどなぁ。
…MIPSはそうでもないか。
分岐条件はARMでなくともフラグを見に行くからなぁ。 フラグ判断、操作はテンコ盛りになるだろうな。 なんせ、ifのあるところはこれがあることになるから。
219 :
デフォルトの名無しさん :03/10/17 13:40
>>217 以下、他スレから転載。
目次を見る限り、ネット上で入手できる情報ばかりだね…
OllyDbg、PeRdr、スペシャルねこまんま57号、Stirling、Resource Hacker等を
使った解析手法やアセンブリ言語での初歩のプログラミング手法なら、
検索すればすぐに見つかるから、個人的にはこの本の購入は勧められないよ。
知らない人もいると思うので、その手の情報が入手できるサイトをひとつ。
http://gamereverserz.cjb.net/
今からアセンブラやろうと思うのですが、 どれをやれば良いでしょうか。
ブラクラ
223 :
デフォルトの名無しさん :03/10/17 19:37
△△_?#6Vカ・ス゚堊△△ーP△z△サ△>△「ケカ△△9ユセオヨ>>>△_?卆=>
>>221 >どれをやれば良いでしょうか
?????
>>221 masmかnasm。
nasmの方がいいのかもしれない
>
>>217 このページで立ち読み(PDF)で見たが、笑ってしまった。
虫食いじゃねぇかよ
マシン語でないと書けないようなテクニックってどんなのがありますか? オブジェクトファイルの話を除外したら。
自己書き換え。 書き換え自体は他の言語でも出来るが 書かれる内容はマシン語
自己書換えプログラムのTipsみたいなのは、 Webや書籍になってないですかね? あれば見てみたいのですが(^^;
>>230 タスク切替え
例外・割り込み処理エントリ
拡張機能付きのコンパイラなら書けない事もないか。
>>230 大事なテクをわすれていた。
ローテート
ファミコンのプログラムはROM容量の節約のために、 自己書換えが当たり前のように使われていたとかいないとか。 といっても多くは命令列のテンプレートを置換するような 使い方が多かったらしい。
>>238 ローテートはうれしいけれど、mipsとかなかったような・・・
ローテートもっててもキャリー付ローテートがない事もありますね。
たしかに使用頻度は少ないんだろうけれど。
>>239 ファミコンで主に使われていたのはバンク切り替え。
スタック操作は結構使われていますが。
386のプロテクトモードで、 書き込みと実行属性のついたセグメントって 設定できたっけ?
そんなものはない
>>231 Windowsならリソース書き換えで同じ様なことができるよ
NASMで分割アセンブルする方法がわかりません 公式のマニュアルに書いてあるそうなのですが、 「分割アセンブル」を英語でなんていうか分からないので、 上手く検索できないです。 英語でなんて言うのか教えて下さい
>>239 ROMだから自己書き換えはできないよ。
メモリにコード配置しなおしてまで自己書き変え使うのは
ほとんど無かったと思う。
自己書き換えバリバリしてるのは、PC8801やX1の頃のゲームだろうな。
「分割アセンブル」って、ただ単にリンカを使うことじゃないのか?
パイプライン構造のCPUの中には自己書き換えに対応していないもの があるので注意。
>248 それぞれobjファイルを作っておいて、alinkで一緒にすればいいのですね ありがとうございます
>>249 むしろ対応してるCPUを知りたい。
自動でパイプラインをフラッシュしてくれるの?
>>251 >自動でパイプラインをフラッシュしてくれるの?
Pentiumはjmpでクリアでしたっけ…?
>>252 > Pentiumはjmpでクリアでしたっけ…?
そうだね。プロテクトモード <-> リアルモード移行時には自動で
やってくれてもよさそうなものだが。
>>253 それだとフラッシュが必要ない場合にもフラッシュしてしまって
パフォーマンスの低下を招くんじゃないの?
pentium以降はプリフェッチキューにある命令が上書きされた時に 自動でフラッシュかかるんだが
基本的なアセンブリ言語と機械語の対応表ってのはあるのでしょうか? 例えば MOV AH, 01 だったら B401 とかって一対一に対応している関係を表したものですが、あるのでしょうか? すんません、よろしくお願いします。
intelのpentiumとかだとうれしいです。ッて書き忘れてしまいました。 無駄な労力すみません。 やはり全言語使った方がよさそうですね。 こうなったら地道にdebugで調べるか
>>259 よくよく考えたら、ah なんてレジスタ (or レジスタペア) は 8080 にはなかったな...。
ありがとうございます。 嬉しくて鼻血が出ました。
NASMを今から覚えようと思うのですが、 本とかどれを買えば良いでしょうか?
>>264 本を買う必要はないと思う。
Googleで検索すれば役に立つ資料がタダで手に入るから。
NASMで何をしたいのか、具体的に書いたほうが良いかと。
公式にNASMのドキュメント置いてあるけど、 英語苦手だから大変。
日本語もどこかで見たような気がするなあ。 機械翻訳でやたら詠み難かったが。
callってパイプラインに悪影響が出ますか? 出るならば、jmp系と比べて、影響に差が出ますか? callってブランチターゲットとかいう予測機構と 相性がいいですか? NullObjectパターンは、関数ポインタと何もしない関数によって nullチェックをしないようにします。 素直にifとかswitchとかを使う場合と、NullObjectパターンを 使う場合とでは、パイプラインへの影響に違いが出ますか?
無条件jmpと同じ わずかに差があるとしたら リターンアドレスを格納するバッファに限りがあるというだけ 関数ポインタはアセンブラ的には良くない テーブル(レジスタ)jmp/callは初回は必ず分岐予測ミスになる 2回目以降で履歴が残っていればそこに分岐すると予測する if等でも前回と分岐先が違うのなら どこかで予測ミスをする可能性が高い が、ある程度パターン化されたデータからなら if系ならほぼ全ての分岐予測が当たる可能性がある その意味ではifの方が当たりやすいかもしれない ただ、BTB等を消費することも考えると一概にはいえない と思う。
スタック操作のコストはかからないの?
AMDの場合はスタックアクセスはレジスタアクセス同等のようだね。
テーブルjmpとかテーブルcallとかがよくわからないのですが call dword ptr [_fp] のようなものですか? あるいは call [eax] のような > 2回目以降で履歴が残っていればそこに分岐すると予測する 関数ポインタは、あっさりと予測するのか。 BTBの消費量が異なるというのはしらなかった。 多いのも少ないのも、それぞれ、良いとも悪いとも 一概にはいえないというのも、なるほどと思った。 それから、アセンブラやパイプラインのしくみを勉強して いるのですが、昔は知らなかったから気にならなかったけど、 ある程度、何が起きているのかを知るようになると、 気にならなかったことがへんに気になってきました… キャリーフラグやcmovなどを使えば、変数に値をセットする ことについては分岐をなくすことができるけど、ある程度以上の 処理の分岐になると、なくすことはできまない…ですよね? パイプラインへの悪影響って「必要なコストを削ることはできない」 のだから、あってあたりまえ、という姿勢でいいのでしょうか?
関数ポインタとifでBTBや分岐予測っていうのは、、 例えば、 if (a % 2) func_a(); else func_b(); というコードがあったとして aが1,2,3,4,...と順番になってたら、 分岐予測は(4回目以降)すべて当たる。 これが関数ポインタだとすべてはずれる。 これがswitchの場合だと、コンパイラは内部的に複数のif文を羅列したのと同様のコードを出す。 具体的には上限と下限を判定して2分探索するようなコードになるのが一般的。 こうなると、複数の条件分岐があるのと同じことになる。 そして、その分岐の最低1つが前回と異なる分岐をする。 この分岐予測が当たるかはデータ次第だけど テーブル/レジスタジャンプと比較して、確実に多くのBTBを消費する。 cmovで分岐を減らすのは可能ならできるだけやるべき。 よほど分岐予測が当たり続けるデータ列で無い限り cmovの方がトータルで速い。 分岐予測が当たった方が速くなるのは、 cmov等は、条件の判定が終わってからでないと実行できないのに対し 分岐予測は判定を気にせずどんどん登記実行してしまうから。 cmov実行前の判定結果待ちの間に他の演算を実行しているのであれば その差は埋もれる。
> これが関数ポインタだとすべてはずれる。 すべてはずれるというのは、以下のようなもんでしょうか? typedef void (*vfv)(); void func_a(); void func_b(); const vfv func[] = { func_b, func_a }; void foo(int a) { func[a & 1](); } アセンブラコードを吐かせたらこんなかんじでした mov eax,dword ptr [ebp+8] and eax,1 mov edx,dword ptr [_func+4*eax] call edx やっぱりまだテーブル/レジスタジャンプの言葉の意味を わかってないのですが、上の例のfunc[]のことでしょうか? 関数ポインタのconst配列を用意して、添え字を使って分岐するような
>>274 > これがswitchの場合だと、コンパイラは内部的に複数のif文を羅列したのと同様のコードを出す。
もっと賢いコンパイラ使おうよ。
277 :
デフォルトの名無しさん :03/10/29 01:18
>>274 >これがswitchの場合だと、コンパイラは内部的に複数のif文を羅列したのと同様のコードを出す。
んなわけねーだろ
278 :
デフォルトの名無しさん :03/10/29 01:30
subl $24,%esp ってなんですか? esp=esp-24 ってこと? 違うよね?
さぶ 24ドルでOK。 エスパー
>>277 むかーしの最適化激甘なコンパイラはそういうの吐いてくれた。
仕方ないので関数ポインタのテーブルこさえて…なんて姑息な手段でメモリをけちったことも。
>>278 esp -= 0x24;
>>277 んなわけなくはないよ。実際コンパイルして確かめてみろよ。
>>276-277 > これがswitchの場合だと、コンパイラは内部的に複数のif文を羅列したのと同様のコードを出す。
> 具体的には上限と下限を判定して2分探索するようなコードになるのが一般的。
↑こう書いてあるけど
>>281 んなわけねーだろ。実際コンパイルして確かめろよ。
必ずBreakが必要なあたりがいかにもアセンブラ的ではないか。 VBのSelectなら文字列も使える関係上、if羅列になりそうだけど。
>>284 Breakが必要なのはcaseでor構文を実現するため。
アセンブラのとは違う。
case 1:...; case 2:...; case 3:...; case 4:...; case 5:...; default:...; で、全部breakが入っていると if (eax < 1 || eax > 5) { case_default; } else { if (eax < 3) { if (eax < 2) { case_1; } else { case_2; } } else if (eax > 3) { if (eax < 5) { case_4; } else { case_5; } } else { case_3; } } こんな感じになりそうな気がするけど これを羅列と呼ぶかはしらないが。 breakなしなら if (...) goto case_1; かな。
>>285 そんなことはない。break→jmpでつよ。
>>286 普通はこういうコードになる。
if (eax < 1 || eax > 5)
goto default;
static void *cases[] = {&&case1, &&case2, &&case3, &&case4, &&case5};
goto cases[eax];
case1: case_1;
case2: case_2;
case3: case_3;
case4: case_4;
case5: case_5;
default: case_default;
>>282 だから常にそうなるわけじゃないだろ。
コンパイラや、case の個数や値によっていろいろだよ。
gcc(MinGW)3.2.3だとcase4つまでがcmpで、それを超えるとテーブル化されたよ。 昔bccは6つだった記憶が。
291 :
デフォルトの名無しさん :03/10/30 13:00
98ユーザーのための86アセンブリ言語入門 工学社 5インチ2HD2枚付きというのを買ったのですが、 DiskBasic版をやると 「Falt Rem Mark」 とでてうまくいきません。 どうしたものでしょうか。
>>284 VBのSelectも数値だけの場合とか条件が揃えばテーブルになる。
>>274 > これが関数ポインタだとすべてはずれる。
あの〜、すべてはずれるという例は
>>275 でいいのでしょうか?
あるアドレスにおいて前回と違うアドレスに間接ジャンプ/コールすると分岐予測ミスする
というか
>>269 を見る
ありがとうございました
296 :
デフォルトの名無しさん :03/11/01 12:07
直接アセンブラに関わる質問でなく恐縮なのですが VC++で、別セグメントのアドレスへjmp若しくはcallするマシンコードを プログラム内で動的に生成しようとしているのですが {FF 25 (移動先のポインタ)} これだけではうまく飛ばずに強制終了を起こしてしまいます。 OllyDbgで調べてみたところ、DSセグメントレジスタが関係している?ようなのですが どう手を加えたら良いのか分からず困り果てています。 どなたかヒントを戴けないでしょうか?
32ビットOS上ではセグメントなんていう概念はない
あるだろ
VCで別セグメントに飛ぶ必要性あるんか? それからDSは直接関係ない。そのコードセグメントが ちゃんと確保できてるか確認汁
300 :
デフォルトの名無しさん :03/11/01 12:46
>>297 ありがとうございます、セグメントは関係ないのですね。
ということは、関係しているのはセレクタ値というものなのでしょうか。
どうもうまく説明し難いのでコード例を出させていただきます、
10006995 FF15 4CA40210 CALL DWORD PTR DS:[<&GDI32.BitBlt>] ; GDI32.BitBlt
DS:[1002A44C]=77C23C6E (GDI32.BitBlt)
2行目に、77C23C6Eへ飛ぶコードであると表示されているのですが
これはどういう計算方法で、1002A44Cから77C23C6Eになるのでしょうか?
予備知識が足りずチンプンカンプンな事を言っているかも知れませんが
どうか御教授くださいませ
301 :
デフォルトの名無しさん :03/11/01 12:57
>>299 ある実行ファイルにDLLとしての自分を読み込ませて
WriteProcessMemoryでその実行ファイルがコールする関数をハックする
というものを、単にVCでビルドしているというだけです。紛らわしくてすみません。
>>102 DLLの場合はFLATじゃだめぽ。
GetModuleHandleの値からの差だった様な。
>>300 DLLのことはよく知りませんが、
DS:[1002A44C]のアドレスの中身は"77C23C6E"って事じゃないんでしょうか。
違ってたらごめん。
>>302 >>304 の言う通り,メモリにジャンプ先アドレスが入ってる。
APIをフックしたければインポートテーブルを書き換えれば良いんじゃねえの?
うまさ最強 .def___main;.scl2;.type32;.endef .text LC0: .ascii "hello World!!\0" .align 2 .globl _main .def_main;.scl2;.type32;.endef _main: pushl%ebp movl%esp, %ebp andl$-16, %esp movl$0, %eax movl%eax, -4(%ebp) movl-4(%ebp), %eax call__alloca call___main movl$LC0, (%esp) call_printf leave ret .def_printf;.scl2;.type32;.endef
AMD(IA32)のインストラクションマニュアルってやっぱ英語しかないんですか?
久しぶりです。 ニーモニックと機械語の対応表、intelのpdfに普通に載っていました。 お手数かけました。
2ちゃんで他にアセンブリ関係のいいスレありますか? リンクきぼん
311 :
デフォルトの名無しさん :03/11/06 20:07
MS VC++で VBのシンボルデバッグできる? VBのシンボル読み込みかた わからん。
312 :
デフォルトの名無しさん :03/11/09 08:32
HDDをLBAで読み書きしたいんですが、どんなコードになりますか?
313 :
デフォルトの名無しさん :03/11/09 09:46
おまいらこたえろ。わからんのか? アフォー。
過去ログ(前々スレと前々前スレ)が読めないんですが、これは仕方ないんですか?
>>314 私に答えてくださってるんですよね???
一応OADGのテクニカルリファレンスは読んでみました。
しかし、HDDをCHSで読み書きする方法は書かれてるみたいなんですけど
LBA方式については見つからないんです。
リアルモードでのBIOS叩きならinterrupt listのどっかに載ってたな。
基本的な質問なのですが、 足し算 2+3+4+5+6+7=? をやるにはどーすればいいのでしょうか? まだ始めたばかりでうまくできないので 参考HPなどありましたら、紹介してください。 よろしくお願いします
>>319 xor eax,eax ;; eaxレジスタを0に初期化
add eax, 2 ;;以下、定数の足し算
add eax, 3
add eax, 4
add eax, 5
add eax, 6
add eax, 7
push eax ;; print_numberの引数
call print_number ;; 10進数で表示する関数の呼び出し(cdecl)
add esp, 4 ;;cdeclなので呼び出し側がpushした分を調整する
>>318 拡張int13hのやり方見つかりますた、どーもありがとん。
Z80のアセンブラはどうすればいいでしょうか。 どこか良さげなサイトないでしょうか?
324 :
デフォルトの名無しさん :03/11/11 00:24
mov si, 100 mov [si], 10h ;構造体のサイズ mov [si+1], 00h ;予約済み mov [si+2], ? ;読み込むセクタの数 mov [si+4], ? ;読み込み用バッファのポインタ mov [si+8], ? ;セクタの番号 mov ah, 42h int 13h LBAでの読み込みは↑みたいな感じでいいですよね??? セクタ数1ならバッファは512バイト確保しておけばいいですよね???
>>319 素直に書けば
mov ecx, 2
xor eax, eax
HEAD:
add eax, ecx
inc ecx
cmp ecx, 7
jbe HEAD
;; あとは eax を表示するだけ
参考 HP は Intel かな。
Pentium のリファレンスマニュアルがある。
326 :
デフォルトの名無しさん :03/11/11 08:23
もまえらいい加減に アセンブリとアセンブラの区別付けろ コンパイル(le)するのがコンパイラ(ler)であって それと同様にアセンブル(le)するのがアセンブラ(ler)だろ er付くのは実行する物や人だろ playするのはplay・er,2channnel見るのがchannel・er アセンブラはアセンブリ言語をアセンブルしてを機械語に直すソフトだろ 言語を指すときはアセンブリだろ
>言語を指すときはアセンブリだろ そうですね。 でもそれはご自分の胸の中にしまっておいて下さいね。
2ちゃんねら は例として適当ではないと思うがー。
糞下部とかbigpapaみたいな臭いがぷんぷんするな。
最近ム板で英語の文法にいちいち細かく突っ込むヤシがいるが、 学生時代英語ができなくて未だに英語コンプレックスでも持って いるのか?
>>326 みんなそれはわかっているけど、あえて言わないだけだろ。
もしかしてコピペか?
332 :
デフォルトの名無しさん :03/11/11 22:51
「アセンブリ」って言い方はあんまりしないなあ。 「アセンブリ言語」ってちゃんと言うか、 もしくは略して「アセンブラ」って言ってしまう。。。 何故略したらアセンブラなのかは自分でもよくわからんけど 言葉の響きを考えるとその方が言いやすいし違和感ないし。。。
333 :
デフォルトの名無しさん :03/11/11 22:52
もしかしたらアセンブリ・ランゲージを略してアセンブラなのか。。。?
>>332 > 何故略したらアセンブラなのかは自分でもよくわからんけど
「アセンブラでアセンブルする言語」の略だと思われ。
うるせーボケ
337 :
デフォルトの名無しさん :03/11/17 20:34
X番地、X+1番地、X+2番地の内容をGR0GR1GR2にそれぞれ格納する LAD GR7,0 LD GR0,X,GR7 LAD GR7,1,GR7 LD GR1,X,GR7 LAD GR7,1,GR7 LD GR2,X,GR7 このプログラムとして完成させよっていう問題がでたんですけど、 どなたかお願いします。CASLUを使っております。
一応、アセンブラやってたけど今仕事になる?
「アセンブラで仕事する」っていうスタンスの人には 仕事はなさそうだな。
どうしてだか、MASM32でアセンブルしたオブジェクトファイルをLinkでリンクできません。 なぜなんでしょう? あと、MASM32でそのままアセンブルできるコードに逆アセンブルしてくれるソフトって在りますか?
>>337 お前は向いてない。俺もな。さっさとCOBOLでも勉強しれ。
だって、完成してるじゃんw
>>341 DC命令とかいれるんだけど・・、粘ったあげく完成しました。
アセンブラ使えるって胸張っていえるのはどの程度のレベルですか? x86限定) 1)インラインアセンブラが書ける 2)アセンブラだけで単体com作れる 3)アセンブラだけで単体exe作れる 4)動的にインストラクションコードを並べて実行できる 5)自己増殖ウィルスを作れる 他にありましたらどうぞ
>>343 アセンブラの使われる業務からみて、1〜5 なんかよりもむしろ、
1) 各種OSのデバイスドライバが書ける
2) インラインアセンブラや SSE 等を利用して高速なコードが書ける
3) 小規模な組み込み用CPU向けにコンパクトなコードが書ける
ではないか、と。
よく考えるとこんなのもアリか。。 4) shellcode が書ける 5) エミュレータ等が書ける
ハードウェアの知識もないのにアセンブラも糞もないよな
俺はアセンブラを読めるが書けない。 VCの混合モードを読んで、Cのコードを直す事で 速度を改善する。 アセンブラの利用ってこういうのもありでしょ?
あり
フローチャートとPADのどちらが良いんだ?
>>349 読めれば書けると思うのだが????
アセンブラソフトの使い方を知らないから書けないという意味かな
書けるが、読みたくはないって人のが多い希ガス
読めると書けるじゃ全然違いますが 漢字を読めると書けるじゃ(略
>>356 字が読める書けるよりはもう一つ上の階層の話だからね、うんうん
英語の技術文章は読めても書けないのと一緒
>>353 パーツは分かっていてもそれを組み上げることができない、ってことかと。
漏れも大体そんな感じ。
でもそれで十分じゃない。 Cでプログラム→アセンブラで高速化 ってな感じで。。。
うちはVBでサクサク作って高速化が必要なトコだけアセンブラ登場ってかんじ
あのー、自分で作ったソフトをアセンブラで高速化してみたいんですけど、 高速化のやり方が良くわからないんです。 高速化のやり方をまとめた様なページってありませんか?
ベンチマークしてボトルネック見つけてそこを潰す サーチアンドデストロイ
人間オプチマイザーなんぞじゃ最近のコンパイラには勝てんが・・・ コンパイラが吐かないようなCPUの命令を使うしかないべな。
プロファイラ使って呼び出し回数の異常に多い関数をいくつか ピックアップし、それに対してアセンブリ化して高速化の余地が ないか検討する。 最近のCやC++コンパイラは賢いから手で高速化すると言っても 微々たるものだと思うが。
俺は某特殊デバイスの開発をやってるが こっちの分野じゃアセンブラの手直しは超効果あり。
>>366 そのせりふは聞き飽きた、みんなそうやって言うだけで
ちゃんと実証して見せてくれた奴にはまだ合ったことがない
>>368 >最近のCやC++コンパイラは賢いから手で高速化すると言っても
>微々たるものだと思うが。
こっちのことね
自分でやってみりゃわかるけどな。 高速化したいならコンパイラが吐くのを叩き台にした方が早いぞ。
>>370 でその実例のソースを誰も見せてくれようとしないのはなぜなんだろう?
やってみれといわれてもC使いじゃないので自分ではやってみれないし
>>371 ああだこうだと論じながら速いコードを模索するならともかく、
Cもわかんない人に見せても意味ないじゃん。
というのはともかくとして、AMD のサイトに K7 あたりに最適化した
memcpy のコード(アセンブラ)があるわけだけれども、これなんかは
手元の VC7.1 のライブラリより数パーセント速い (Pen IV で計測)。
ってわけで、投入する手間を惜しまなければやはりアセンブラは
安易な小手先の高速化としていぜんとして有効みたい。
>>371 すでに絶版っぽいけどアスキーやソフトバンクから出てたMMX本に簡単な例があったな。
興味あるなら図書館でも探してみれ。
>>372 >
>>371 > ああだこうだと論じながら速いコードを模索するならともかく、
> Cもわかんない人に見せても意味ないじゃん。
アセンブラがわかるからいいじゃん
吐き出したコードがどうなってんの?って話だよ
キャッシュのヒット率とか気にする?
メモリーの?
たまに。
キャッシュってia32の場合はやっぱり4k単位なの?
L1は32bytes/lineだったかなあ
アセンブラであんまり長大なコード書かないし 適当に書いてもズッポリキャッシュに浸かってる予感
>>379 あ、そんなに小さいんですか。これまた失礼しました。
382 :
デフォルトの名無しさん :03/12/05 00:06
アセンブラ使ってゲームの改造とかして見たいんだけど最低限何覚えとけばい いですか?
>>382 覚えなくてもいいからインストラクション表もっとく
384 :
デフォルトの名無しさん :03/12/05 02:56
>>383 インストラクション表とは何ですか???
ソースから改造するんじゃなかったら バイナリーエディターと逆アセンブラ 根性あるならハンド逆アセンブルでもいいけど やる気なくすことうけあい
>>382 インストラクション表って言われて自分で調べない奴じゃあ到底無理。
このスレの上のほうにもインストラクションマニュアルとかのキーワードあるのに。
リバースエンジニアリング、イクナイ(ものによっては)
逆汗かけずにやるリバエンもだめなん?
グレーゾーン?
調べました。でも初心者だからよくわからない;。 ジャンプ命令とか簡単なのはわかるけど。 とりあえずツールはollydbg使いたいんだけど・・・。
392 :
デフォルトの名無しさん :03/12/05 14:10
アセンブラはマシン語の16進をただ人間に分かりやすいように文字にしただけ。 その文字と機械に分かるマシン語(機械語)16進数との対応がインストラクション表に書いてあるでしょう。 例えば、アセンブラの LD A, がマシン語7F(あるいは7fH:おしりのHは16進数HEXを表す) 7Fを2進に直せば01111111となる。だから、基板のバスが8bit(並列(パラレル)8ライン)なら、まさに01111111の信号が流れる訳だ。 それと、アセンブラやるなら、CPUの内部をある程度知ってなきゃ書けない。 プログラムカウンタ、ALU、アキュームレータ、オペコードとオペランド、アドレス方式、アドレス指定方式。 これくらいは、最低限でも知ってないとどんなCPUでもアセンブラは書けないよ。 それが分かった上で更に必要なのが、基板の回路情報。アドレスバスが0〜どこまでがROMであり、どこからがRAMか知ってなきゃならない。 或いは、ゲームなら、外部表示装置へ信号を送ってやらなきゃならないから、そのアドレスも知ってなきゃならない。 しかも、画像情報は画面の1点に対して、RGBそれぞれあるわけだからアセンブラでやるとかなり大変だよ。 ゲーム機が何か分からないが、ROMに載せられる容量が軽い組み込みOSが乗っている気がするな。
>>391 ツールがどうとかではないだろ。
命令が判るのは、「文字が読める」レベルだよ。
別に命令をすべて暗記する必要は無いが、
命令表見てでも理解できるようでなければスタートにも立ててねぇ。
ゲームは普通のPCゲーム。exeをちょっといじくって改造しようと思って。 じゃあ手順としては逆アセしてわかった16進数をバイナリで変えるでいいのかな?
組み込みマイコンだとCとか(趣味で使うには、ICが250円とかに対して10マン とかだから)べらぼうに高いから、アセンブラ使うけど PC上のx86とかってアセンブラどういうときに使うの? 拡張命令とかだけ?
396 :
デフォルトの名無しさん :03/12/05 15:33
>>394 ドスで>でdebutと打ってごらん
-とでるから。
ここがPCのアセンブラ入力モード
通常PCは100番地からプログラム用に割り当てられてるから
そこからインストラクション表見ながら書けばよい。
100 命令 アドレス或いはデータ データ
という風にね。この場合、2アドレス方式で
命令 アドレス がオペコード或いはデータ
その後の データ がオペランドだね。通常そうだけど・・・。
で、気をつけなきゃいけないのは、命令+アドレス或いはデータ で一バイト
その後の データ で一バイト使用するから、プログラムは
100 〜
102 〜
という風に一バイト飛ばしで書く。すなはち101には100のオペランドが入っている訳だ。
ということは、CPUはオペコードを読み込んで準備してから、オペランドを読み込むことが分かるね。
ただ、OSの立ち上がりですでに使ってる場合もあるから、
U 開始アドレス 終了アドレス
で逆アセンブルか
D 開始アドレス 終了アドレス
でメモリダンプして味噌。
現在のメモリ占有中のファイルのアセンブラコードみれるよ。
その後、ゲームを立ち上げて、新しく占有したメモリを同様に見れば、ゲームのアセンブラコードもしくはマシン語じかに、を見れるな。
CPUはPENの何?
INTELのページにPENのリファレンスあるから、そこに出力アドレスや入出力データ番地、アドレス、データをストックするためのレジスタアドレス、計算用に一時保存用のアキュームレータ(レジスタ)のアドレス、設定フラグのアドレスやデータが載っているから、見ると良いよ。
かな〜り膨大な量だけど。そうだなぁ、全部を本にすると、広辞苑2、3冊はあるな。
397 :
デフォルトの名無しさん :03/12/05 15:34
ていせーーー。 ドスで>でdebut じゃなくて ドスで>でdebug
398 :
デフォルトの名無しさん :03/12/05 15:38
もう一箇所訂正。。。 命令 アドレス がオペコード或いはデータ 命令 アドレス或いはデータ がオペコード 何書いてんだか・・・俺。(::)
399 :
デフォルトの名無しさん :03/12/05 15:44
そうそう、アセンブラモードの-からDOSに抜けるには Q とやればよい。
デビューわらた
401 :
デフォルトの名無しさん :03/12/05 16:46
で、
>>394 の
>じゃあ手順としては逆アセしてわかった16進数をバイナリで変えるでいいのかな?
への答え。上記uコマンドでゲームのコード画面に晒して(画面から溢れたら、数十行ずつ)、コピーしてTEXTに貼り付けといて、
改更分含めて、全部打ち込みなおすのが良いんじゃない。
で最後の行はアドレスだけ打ち込んでエンターすればそこが終了点。
で
-G 開始アドレス 終了アドレス
とすれば、実行するとともにDOSマークの.EXEファイルのアイコンをデスクトップに勝手に作ってくれる。
現在のDOSはDOSといってもOSが動かしているから、アイコンも作ってくれる訳だ罠。
DOSアセンブラといっても、WINAPIが動かしているインラインアセンブラな訳だ罠。
だめだ・・・よくわからないTT ollydbgの使い方も完璧にしなきゃな。。
405 :
デフォルトの名無しさん :03/12/05 17:42
(´`)チャ、頂くよ。スス。。。
⊃◇
>>402 OS以外何も立ち上げないで、DOSのプロンプト>でdebugと打って美奈代。
-とでるでしょ。
ここがアセンブラプログラムできるモードだよ。
で、uコマンドというのは、メモリ上のマシン語
(メモリ上では電圧が掛かってるか、掛かってないかの2進=1/0。で画面上に出るのはそれを16進になおしたもので表示するのが通例)
をアセンブラに逆変換して、表示してくれるコマンドだよ。
使い方は
u 開始アドレス 終了アドレス
で、上にも書いたけどプログラム用に確保してるのは100番地(16進数の100だから10進表記だと257)からと書いたね。
では、それを確認してみよう。
u 0 99
を実行してみると、何もコーディングされてないでしょ。
次に、メモリのosが使ってる部分を見てみよう。
u 100 ffff
を実行すると、アセンブラコードが右側にでるね(左はマシン語16進のHEX表示)。速くて分からないかも知れないけれど、何も書かれていない部分もあると思う。
そして、ゲームを立ち上げておいて、uコマンドで使用領域を再び調べると、増えてると思う。 その増えた分がゲームのアセンブラコードだよ。それをコピーして、textかなんかに貼り付けとく。
その際。ぜんぶメモリスキャンさせると、DOS画面に収まりきらない。
だからu 300 310
というように10行ずつ位表示してコピッとく。
そうしてゲームのコードを全部取り終わったら、メインの作業、アセンブラコードを変更。
そして、それを、一からdebugモードで打ち直していくんだよ。
そして、終了の位置はアドレスだけ書いてリターンすればそこがプログラムの終了となる。
そして、Gが実行コマンドで
G 開始アドレス(書き始めた場所) 終了アドレス(アドレスだけ書いてリターンした場所)
とやれば実行してくれる。実行するだけじゃ、2回目は又打ち直さなきゃいけないかというとそうじゃないんだよ。
Gをやったときに実行ファイルのアイコンを画面上に作ってくれる。
PC上のアセンブラはWINが動かしてる。WINがプログラマの負荷を軽くするように実行ファイルをHDDに作るとともにアイコンを作ってくれているんだよ。
406 :
デフォルトの名無しさん :03/12/05 17:43
そうして2回目以降はアイコンをクリックするだけで実行してくれる。 そうしないと、プログラマが書いたアセンブラのアドレスを全部HDDのアドレスに流し込んで、 もっと大変な作業は、アイコンを作って、クリックするとHDDのプログラム開始アドレスからメモリにロードして実行させるというOSと連携させる大変な作業をしなければならなくなっちゃう。
407 :
デフォルトの名無しさん :03/12/05 18:19
>>405 訂正
>u 0 99
>を実行してみると、何もコーディングされてないでしょ。
u 0 20
位までと、その後、歯抜けで自分のPCだとコードが書かれてる。
これは、PC立ち上がり時に、フラッシュBIOS(不揮発RAM。ROMの役割)からBIOSを読み込んで(基板全体から見たアドレスの0番地)、
HDDを読み込みRAMにupするループを形作っている。
uコマンドの0番地はRAMの0番地になる。(基板全体から見るとおそらくフラッシュBIOSの次)
長くて読む気にならん。 お前の糞文書最低
しかしWindowsXPにもDebugコマンドが未だに残っている事に改めて 驚いた。
W2kにexe2binがあると知った時程でもないがな
ふむ。やってみます。質問に親切に答えていただきありがとうございました。 どうもです^^
DOSのdebugとかでは、全部自分で決められたからプログラムは書けたけど 今は関数のいくつかをアセンブラで書こうと思っても スタックポインタとレジスタを、どう使っていいかよくわからないので MMX命令使ったインラインアセンブラしか利用していない。
>>382 まず"OllyDbg"で検索したほうがいいでしょう。
「いまどきのアセンブラプログラミング」の元ネタサイトが見つかりますよ。
414 :
デフォルトの名無しさん :03/12/05 23:25
>>382 ところでメモリ上のマシン語のアセンブラコードを出すU命令使ってみて、疑問に思わなかった。
Uは0000〜FFFFまでしか出せないでしょう。
FFFFって16^4で65536、システムで使ってるのを差し引いて64Kバイト。
RAMってメガ単位であるでしょ。
さて、どうしちゃったのか。
U 100 110とかやったとき表示が
2371:0100 〜
2371:0102 〜
・・・・・・・とか出てるでしょう。
実は、この0000〜FFFFまではオフセットアドレスといって、メモリ空間のある位置からどれだけ進んだかを示してる。
自分のパソコンはOS立ち上がってる状態でデフォルトで上位が16進数で2371だった。
PCによって違うけど。だから、
u 0000 FFFFは自分のパソコンだと
23710000バイト〜2371ffffバイトまでを示している。
じゃあ、他のアドレスは?それは、バンク切り替えといって、あるCPU内部のレジスタの値を変えることによってCPUがあやつるバイトが変わってくる。
それを変えてやれば、Uでスキャンする(CPUが読みに行く)場所も変わるから例えば今の2371が変えられる。
どうやって変えるか?それは、アセンブラコードで直接CPU内の切り替え用レジスタの値を変えてやればいい。
もちろん、CPUによってそのレジスタのアドレスは異なってくる。
自分のPCはメモリ128Mあるから、メモリ全部のコード見ようと思ったら、今言った切り替えは128M/64kでガクブルな回数しなきゃなんないな。
それを自動でやって、該当ファイルを探して、メモリ上にすべてロードして、常時スキャンしてコードを採取してくれるのが逆アセンブラソフトな訳だ。
内蔵debugは16bitDOSモードじゃなかったっけ? i386命令って理解でけた? ちゃんと確認した方がいいよ(つっても確認できるのか知らないけど)
>>414 >23710000バイト〜2371ffffバイトまでを示している。
嘘っぱち書くなよ
>>416 RAMのアドレスとしてはROMとかキャッシュがあるから違ってくるけど絶対アドレスとしてはそうでしょ?
>>415 「内蔵debugは16bitDOS」
そうかも知れない。でも、アドレスの量としては変わらないでしょ。
8bitなら
100 100のオペコード
101 100のオペランド
で1命令二行消費てなるし、16bitなら
100 100のオペコードとオペランド
で1命令一行消費で結局ゴワサンでいっしょでしょ。
>>417 全然わかってないな。
16bitやるならセグメントをちゃんと理解しとけ。
SEG:237100+OFF:0000(237100)からSEG:237100+OFF:ffff(2470ff)の64kまで。
x86の16bitモードでセグメントと組み合わせた場合の範囲は24bitまで。
間違えた24bitじゃなくて20bit。
>417 たぶん>415は、debugではmovzxとか使えないんじゃないか? ってことが言いたいんだと思う。
>>414 勝手な妄想するよりちゃんと勉強したら?
第一条:登下校時や校外学習などは原則として制服を着用する。 また全裸で登校する場合は時前に連絡をする。 第二条:頭髪は生徒らしく清潔(もしくは不潔)にする。 第三条:屋上の利用は基本的に認めないが「どうしても」と言うなら認める。 第四条:刃物やウォークマン、学校に関係のないバター等は持参しない。 第五条:授業中はマウスピースをはずす。 第六条:えりあしはなるべくオシャレにする。 第七条:遅刻3回は遅刻2回とみなす。 第八条:校内暴力も遅刻2回とみなす。 第九条:基本的に、ガッツポーズは禁止する。 第十条:ハムは学校指定のハムのみとする。 第十一条:もち肌は停学とする。 第十二条:おちょぼ口は退学とする。 第十三条:校長先生に石を投げない。 第十四条:消しゴムを食べない。 第十五条:草を食べない。 第十六条:セミを食べない。 第十七条:許可なく豆を煮ない。 第十八条:線から出ない。 第十九条:なるべく奇声を発しない。 第二十条:体育教師に難しい事(漢字の読み書き等)を聞かない。 第二十一条:ハゲは控え目に行動する。 第二十二条:家庭の事情以外の理由でのダムの建設は認めない。 第二十三条:やむを得ず脱皮する場合は、授業の妨げにならないようにする。 第二十四条:平熱は36度とする。 第二十五条:いい匂いはミントのみとする。 第二十六条:必要以上のゼリーを持って来ない。 第ニ十七条:隋に派遣されない。 第ニ十八条:教頭は原則として人類以外は認めない。 第ニ十九条:変な汁を出さない。 第三十条:先生が指定した相手以外の奉仕活動は控える
>>409 同意。
enter/leaveさえも通らない(涙。
8086互換?
OllyDbgダウンロードして日本語化パッチも当てました。 それでファイル→開くでexeを開くといろいろ出てきますよね? やっぱりそこに出てくるのをすらすらわかるようにしないと駄目ですか?
まず改造したいプログラムを起動。 OllyDbgを起動。 ファイル>アタッチでプロセスを選択。 あとは適当にトレースしる。
426 :
デフォルトの名無しさん :03/12/06 03:46
Win2k/XPなどのDOS窓の中で動く32ビットコマンドを作るのには、 どんな風にすればいいのでしょうか? 例えば以下のような16ビットコマンドを、32ビットのコマンドとして 作る方法です。 assume cs:_TEXT, ds:_TEXT, ss:_TEXT _TEXT segment .186 org 100h START: mov ah, 9 mov dx, offset DATA int 21h mov ax, 4c00h int 21h DATA db 'hello world', 13, 10, '$' _TEXT ends end START
428 :
デフォルトの名無しさん :03/12/06 10:28
>426 をを、ありがとうございます。 まさに欲しかった情報です。これから読んで、勉強させてもらいます。
>>425 それがそのゲームアタッチすると(たぶん)メモリ監視があって途中で終了しちゃうんですよTT
トレースするとなぜかフリーズしちゃうし。。
>>429 合法ならターゲットをあげろ。非合法なら首釣って市ね。
>>423 昔の奴そのままのっけてるとかじゃないかな。
ヘルプ (? コマンド) みると、EMS がどうたらとか書いてあるし...。
まあ、debug はまだ許せるけど、edlin なんて使ってる奴いるのか ?
>>431 スレ違いネタだけど、この間「Xpのboot.iniを書き換えたら起動しなくなった」
という依頼で、コマンドプロンプトしか起動しないから思わずedlinと入力した。
当然、そんなコマンドはなかった (w
MS-DOS 3.3cのころedlin使ってcom作ったこともあったんだけどね。
N88BASICのまだ、ハードディスクなんてものがなく記録はもっぱら5inchぺらぺらフロッピーの時代、 BASICの画面立ち上げるとmonでアセンブラに入れた。 もぐらたたきゲーム作ったよ。(w 正にCPUとの対話感があったね。
N60mBASICのデータレコーダーの時代にやった
>>433 そーなんだ。デフォでは入らないのかな?しかし、他人のマシンは分からん。
>>433 アフォにかまうな。
> MS-DOS 3.3cのころedlin使ってcom作ったこともあったんだけどね。
438 :
デフォルトの名無しさん :03/12/07 16:34
>>414 の言うところのセグメント切り替えはDOSコマンドのgotoでできるよ。
>でgoto 値
でdebugに入ってみな。頭のセグメントの数値が変わってるから。
440 :
デフォルトの名無しさん :03/12/07 22:42
>>439 そうだね。
普通に
C:\>debug
-u 開始アドレス(例:0100) 終了アドレス(例:0100)
2731:〜
・・・・
-q
C:\>goto 変えるセグメントの値(例:1000)
C:\>debug
-u 開始アドレス 終了アドレス
とやっても
2731:〜
で前後で変わらなかた。
まず、
C:\>command.com
とやって、command.comの中に入って、
C:\>goto 変えるセグメントの値
C:\>debug
-u 開始アドレス 終了アドレス
とやってみて。2731が変わってるはずだから。
でqでアセンブラモードから抜けて、command.comを抜けるには
C:\>exitで抜けて。
その後、念のためCTRL+Cを押してからDOSプロを閉じる。
↑スマン。_| ̄○  ̄ command.comやるとただセグメントが変わるだけだた。 gotoでどこに飛ぼうがuで見ると値は同じだた。。。
r コマンドで DS 書き換えればいいやん
>>427 > API は「パスカル呼び出し」で、API 側でスタックの処理を行ってくれます。
いつの時代の話ですか?
>>442 Uで見るならCSでないの?
つか、u segment:offsetだったような記憶もあるが。
>>443 16bitなWindows APIの時代だな。
そんなに昔かなあ?
>>444 そうだなあ、Win32 APIがどんな形式の呼び出しか特に気にした事は
ないけど、windows.hを見れば書いてあるんだよね。
なんかあやふやな知識の嘘だらけ 釣りなのか指摘してやるべきなのか・・・
信じてしまった人が可哀想なので、指摘してあげるべきではないかと。 漏れも突っ込みたいけど、細かい所忘れてるし、調べるの面倒なので任せた。
>>信じてしまった人が可哀想なので、指摘してあげるべきではないかと。 てわけで調べてみました。 大半の API は __stdcall 呼び出しで、API側がスタックの処理をする。 ごく一部の API (wsprintfなど) は __cdecl 呼び出しで、呼んだ側がスタックの処理をする。 んで、Pascal のデフォルトの呼び出し規約が __stdcall で、C のそれが __cdecl 。 昔も今も、多分もうしばらく先にも。 (↑なぜかは知らんがIA32でもPowerPCでも68Kでもそういう実装が普通)
パスカル呼び出しと__stdcallは複数の引数をスタックに積む順序が逆
ためになるなぁ。
だめになるなぁ・・・。
>>448 pascal呼び出しするWin32APIなんて無いぞ。
それこそwindows.hをよく見れ。
__stdcallか__cdeclのどっちか。
規約的に__pascalも残ってるけど、もはや使われてない。
曲解してるヤシがいるなあ・・・。
やっぱPGって読解力があさっての方向に向いちまってる 奴が多いんだな
>>452 つっこみどころが違うのではないか、と。
となるとデフォルトでpascal呼び出しするコンパイラも探すのが厄介になるな Delphiも _stdcall + レジスターだし
VisualC++もクラスメソッドとかは__stdcall+レジスタ(ecx)じゃない? まあAPIではないし、extern "C"すれば考える必要ないけど。
WATCOMでpragma使えばできたような記憶がある
>>457 クラスメソッドも __cdecl (+ecx) だと思うけど?
COM では __stdcall だけど。
クラスメソッドはthiscallだからcdeclでもstdcallでもない
MOV EAX,天国 JMP [EAX]
昔はアッセンブラて呼ぶひともいましたね。
465 :
デフォルトの名無しさん :03/12/14 17:54
漢ならwindbg
何もかもが、炎の中に沈んだ。 微笑みかけた友情も、芽生え欠けた愛も、秘密も。 そして、あらゆる悪徳も同じだ。 全てが振り出しにもどった。 兵士は死んだ魂を疲れた身体に包んで、泥濘と、硝煙の地に向かった。 次回「アッセンブルEX−10」。 傭兵は誰も愛を見ない。
ボトムズの次回予告が良いとおもうぜ
最近、「いまどきのアセンブラプログラミング」を本屋で 見かけておもしろそうだったから衝動買いしそうだったん だけど…。 パラパラとめくってみたら、なーんか変だし。でも俺アセンブラ 詳しくないから皆こんなふうに勉強してんのかなと思っ たんだよ。念のため買うのはネットで調べてみてからに しようと思ったら…。 アマゾンでもボロクソに言われてるし、こことかの2chの スレでもボロクソだし、いやぁ買わなくて良かったねぇ…。 まぁ、知識のない俺でも、前半がツールの使用例(説明ではない…) 、後半がアセンブラ語のリストになってりゃおかしいってことに 気がつくもんだ。タイトル的に詐欺じゃねーのかなこれって。 しかも、この著者ってむかーーーしっからゲームラボで記事書いてた 方ではないか…。性懲りもなくレベルの低いPerlの記事を書き続けて いた記憶が…。(2年くらいゲーラボ見てないので今も書いてる かは不明)
「方」は余計
俺には、バイナリエディタでのセーブデータ改造が、 なんでアセンブラと結びつくのかわからんな。
今どきだからじゃない?w
いまどきのアセンブラってゲームのセーブデータを改造することを指すのか(w
ゲーム改造なんて昔からあるじゃないか。
>ゲーム改造なんて昔からあるじゃないか。 d の文字コードが 100 というのはその時覚えたな。
>474 どこの世界の文字コードですか?
>>475 10進表示だと思われ。
100D=64H
時に、自分は1年未満ですが皆さんのアセンブリ言語歴はどんくらいですか?
10年
15年
専念
>481 > 今、アセンブラのコンパイラって結構手に入らないみたいですね。 アセンブラのコンパイラって何?
>>477 約7年
>>481 >ここで勉強したらMapleStoryの競合回避ぐらいはできるようになると思いますか?
思わない。それと、ネットゲームの改造の話題は板違い。
MapleColorsと勘違いしていた漏れは逝った方がいいでつか?
最近VCのインラインアセンブラを使い始めたんですが、 構造体のメンバにアクセスするときは、先頭アドレスから 計算していくしかないのですかね? 今は定数定義して使っているのですが…。
>>489 ありがとうございます。試したら出来ました。
探せばしっかりヘルプに載ってますね…。
今度はもっと注意深く探してみます。
>>489 // mov ebx, OFFSET hal
コメントアウトしてあるのは何でだろ?
>>492 おもしろそうなサイトですね
ありがとー
494 :
デフォルトの名無しさん :03/12/21 23:18
昔のパソコンしか使ったこと無いので質問させてください。 (1)WindowsXPで、メモリの特定の領域をユーザーマシン語領域として確保する方法。 (2)その領域の任意のアドレスからマシン語を実行する方法。 以上2点、ご教示願えませんか?
>>494 何でそんなことがしたいんだ?
デバイスドライバ書けばできそうな気がするけど。
>>495 ええ?
マシン語を学習するときってまずこれじゃない?
今のパソコンのマシン語学習はちがうの?
ポケコンやファミリーベーシックはこれやんないと暴走したんだぞ。
氏ね、ハゲ。
マシン〜が 叫ぶ〜 狂った朝の光にも似た〜
本当に叫んだら怖い
釣れた
494は予定通りのレスを見てPCの前でほくそ笑んだ しかしその時…!
マジレス DOSエミュレーターを入れて 昔どおりにスル
なんか激しくハズしたみたいなので逝ってきます。たぶん20年くらい遅れてるなたぶん。 そのへんのEXEファイルでも逆アセンブルして勉強してみるよ。 最近のマシン語ってひょっとしてリロケータブルが主流なのかな。OSが勝手にメモリの適当なとこに展開するのか? 絶対ジャンプとかは使えないのかなあ。
生きた化石がいるスレはここですか?
510 :
デフォルトの名無しさん :03/12/22 11:34
>>508 8080→8086で充分。
8086のコードなら保護に引っかかるようなことをしていない限りそのまま動く。
>505 マクロアセンブラとリンカについて勉強するように。
コマンドプロンプトのDEBUGでやってろ
>>494 VirtualAllocについて調べよ
遅レスだが、セグメント切り替えは、例えば
-a 1000:0100
1000:0100 |←カーソル
とでるから、ココから書き始められる。
この場合、セグメント1000のオフセット100。
uで逆アセするなら、
-u 1000:100 110
とかするとオフセット100-110まで逆アセされる。
また、逆アセソフト自作したいなら、
xxxx:xxxxを全て逆アセして保存するコード書いて、↓にあるように.comファイルにして作る。
http://black.sakura.ne.jp/~third/programming/asm/assembly29.html その後、目的のアプリを実行前で.comを実行と、実行後に.comを実行して、コードの差分が目的のアプリの逆アセコードになるんじゃないかな。
↑ただし、debugで入ったセグメントは、その画面で操作するセグメントだから、 一度 a 1000:〜やu 1000:〜とやった後でも、 u 100 110 とかやると、 debugモードのセグメントで表示されるよ。
昔の PC98 に MS-DOS の環境のことなんだけど、 動作が完全に保障される最小のプログラム 「リセットするだけのプログラム(3バイト)」 ってのがあったよね。 どっかのポートに 0 以外のデータを入れると リセットになるんだけど、 そのポート番号をすっかり忘れてしまった。 何番だったっけ?
F0
神様ありがとう。 でも、AL に1バイトで非0値を入れることってできたっけ? あかん。記憶が曖昧や。 もしかしたら4、5バイトくらいあったかもしれんなぁ。
一応4バイトは思いついた。 push CS pop AX out F0, AL これ以上はお手上げ。 それより、無限ループしかしないプログラムの方が 小さいことに気付いた。 A: jmp A 2バイト。これ、最強。
COMならretで最小じゃないか
どこに戻るの?
何ぃ〜〜〜そうだったのか! なら COM だと mov AH, 4Ch → int 21h じゃなくて ret で十分だったのかー。
dosのマニュア読呼んだことないのか?
昔、店頭の98に… A:\>COPY CON RESET.COM 跼^Z (CTRL+XFER で6C72) A:\>COPY CON AUTOEXEC.BAT RESET.COM^Z
>>525 AUTOEXEC.BAT書き換えるより
CONFIG.SYSのSHELLに指定するほうが
より工作が見つかりにくくなるよ。
デバドラにするつわものはいないのか
>>524 MASM の本しか読んだこと無いです。
そこでは COM モデルでも int 21h で終了してたので
てっきり そういう事はできないもんだと思ってました。
もっと早くに知っていれば活用できたものを...。
529 :
デフォルトの名無しさん :03/12/25 14:03
>>528 int 21hで終了させるほうが礼儀正しい。
エラーレベルを変えられるから、
バッチの分岐を制御可能。
sageで書く方が礼儀正しいね
531 :
名無しさん :03/12/25 14:35
アセン… (゚д゚)ブラー
ret で戻れるのは CP/M との互換性を保つためだぁね。 CCP (DOS で言う COMMAND.COM) から CALL 0100H でユーザプログラム呼んでたから。
ヌー(_人_)ブラ
互換も何も最初のバージョンはCP/Mクローンだし
536 :
デフォルトの名無しさん :03/12/26 00:59
ああああっっっΣ(・∀・`;) 顧客のデータが馬鹿、俺の馬鹿ぁぁっっっ 会社から書き込みしてます、当分このアセンブラスレにはこられそうにありません 皆元気で・・いっその事首なら思いのほか早く書き込みできるかもしれません では
アブソリュートディスクアクセスで華麗にデータを復帰。 昔アブソリュートディスクライトで AX じゃなく AL にドライブ番号入れちゃって フロッピーじゃなくハードディスクの FAT を 壊してしまったことがあったな...。 しかも学校の部室にあったやつを。 苦い思い出だ。
DOSでリセットするだけCOMは実はテキストエディターのみで作れるというのは案外しられていない 0.5へぇ
540 :
デフォルトの名無しさん :03/12/26 15:27
>>535 CP/M86よりも、よりCP/Mだったね。
>>539 そうだっけ。そのあたりも忘れてるなぁ。
DFはセットしたらクリアしなきゃいけませんか?
うん。 他のところではクリアされてることを前提に 組まれてることもあるからね。
MSのライブラリがそうだったな… あれには悩まされた。某島のライブラリは自前で設定してくれたからなあ。
>>536 がんがって。
547 :
デフォルトの名無しさん :03/12/29 15:37
64bitCPUになったらどうするんすかね〜?すかね〜?
>>548 どーもです。
03f8は自分のPCのシリアルポートです。
P4でもF〜命令の後はwait入れないとだめ?
>>590 結構前からいらなくなっているはずですが。
287か387のころだと思ったけど。
287で要らなくなってる。
アセンブラ(゚д゚)ウママッママー
アセンブラの誤用が多いのはなぜだろうか・・
質問します。 VCの混合モードではいてくれるアセンブラのソースって MASMで用いられているようなマクロ命令とか入っていませんよね? 私の乏しい知識でソースを眺めたところ入ってなかったようなのですが 確認させてください。
559 :
デフォルトの名無しさん :04/01/03 21:11
x86アーキテクチャにおける IVT(interrupt vector table)と IDT(interrupt discroptor table)の違いって何ですか? あるサイトによるとIVTは 0x00000000から1024バイトまでの位置に4バイト刻みに256個のハンドラへのポインタが置かれる とありました あるOSのソースコードによると IDTが任意(といってもOS定義)の場所にセグメントディスクリプタを256こ8バイト刻みに配置し 各々のディスクリプタはハンドラが格納されるセグメントへのポインタとオフセットetcの情報を持つ といった感じです これだけの情報から推測すると IVTはプロセッサ定義のハンドラへのポインタで IDTはユーザ定義のハンドラへのポインタという感じで取れるわけですが 俺ってアホですか?
>>559 Real Mode/Protect Mode
IVT=リアルモード IDT=プロテクトモード
562 :
デフォルトの名無しさん :04/01/03 21:21
>>560 >>561 素早い返答ありがとうございます
実アドレスモードではプロセッサ定義(?)のハンドラをしようする
保護モードではOS(ユーザ)定義のハンドラをしようする
といったところでしょうか?
IVTという言い方をするようになったんだ 知らなかったよん。 IntelのドキュメントではIDTしか見た記憶が なかったなぁ
>>562 ハンドラはどっちもOS定義のものを使う。
そうじゃなくて、プロテクトモードでは
IDTRによってテーブルの先頭アドレスを指定する。
あと「実アドレスモード」っていう言い方は
あんまりよくないかも。プロテクトモードでも
当然、ページングはオフに出来るし。
565 :
デフォルトの名無しさん :04/01/04 20:06
>>564 ありがとうございます
ハンドラを起動するには86系(=AT系という解釈は正しい?)の場合
>プロテクトモードの場合
IDTRに保存されているハンドラのコードグメントのベースアドレスとオフセットetcの情報を使って
ハンドラを起動する
>リアルモードの場合
リセット(起動)直後にはIVTのベースは物理アドレス0とし、その地点から4バイト刻みに256個の
ハンドラ、へのポインタがおかれるみたいです
それぞれ各々のハンドラを起動するにはINT n命令を発行すると思うのですが
Plan9(OS)のローダプログラムはハンドラを定義する以前に
INT 0x10
とし
浮動小数点エラー例外ハンドラを呼び出しています
566 :
デフォルトの名無しさん :04/01/04 20:06
実際にはローダは下記のような命令郡からスタートします TEXT origin(SB), $0 MOVWCS, AX MOVWAX, DS XORLAX, AX MOVB$0x0F, AH INT$0x10/* get current video mode in AL */ CMPBAL, $03 JEQsayhello しかも横のコメントによると浮動小数点例外ハンドラを呼び出すことでビデオモードをチェックしています(そういうものなんですか?) 上記の理由からプロセッサ(ハードウェア)定義のハンドラが物理アドレス0-255の向こう側に存在するのじゃないかなと推測しますが 間違っていますか? CPUから見えるROM上に格納されていたりはしませんか? どうでしょうか
INT 10H は、VIDEO BIOSの呼び出し。 浮動小数点例外とは無関係。 VIDEO BIOS自体はROMに格納されている。 BIOSのイニシャライズ処理で、 BIOS内の処理ルーチンのアドレスが割り込みベクタテーブルに設定される。
知識不足の感が否めないな。どれも中途半端 そもそもアセンブラの勉強にosのソースはよくない (前提知識が多い)
bcc32とtasm32を使ってます bcc 5.5.1 にはスタートアップオブジェが c0w32.obj ぐらいしかありません これは __GetExceptDLLinfo/__CPPdebughook などをexportするし、また、必ず cc3250.dll(標準C++ライブラリ)を リンクします このようなものがいらない! シンプルなスタートアップオブジェが欲しい! と思いました 自分でスタートアップオブジェを作ることはできますか? 難しいですか? 作りたい意欲はありますが…(今は) 自分のアセンブラの力量は インラインアセンブラで割り算をできる インラインアセンブラでMMX命令をできる インラインアセンブラでfsincosをできる インラインアセンブラでjcc,callをできる __fastcallを使える つもりですが、 __declspec(naked)を使ったことがない です
570 :
デフォルトの名無しさん :04/01/10 20:19
OSなしでPGを動かすにはどうすればいいですか?
日本語が不自由な
>>569 よ
> __declspec(naked)を使ったことがない
> です
そんなことではbootstrapは書けないぞ。
オブジェって・・・
>>571 startup と bootstrap は別もんだよ。
まあ、
>>569 に startup が書けないと言う意見には賛成だが。
>>インラインアセンブラで割り算をできる >>インラインアセンブラでMMX命令をできる >>インラインアセンブラでfsincosをできる >>インラインアセンブラでjcc,callをできる >>__fastcallを使える >>つもりですが、 >>__declspec(naked)を使ったことがない >>です アセンブラの世界では何もできないと一緒じゃん?
>>573 > startup と bootstrap は別もんだよ。
そう言い切るのは厳しいと思う
OSのbootだけがbootstrapじゃないし...
私には無理ですか…
そもそも、どのくらい難しいのでしょうか?
アセンブラに慣れている人でも、限られた人くらいしか
できないくらい?
何か参考になるものとかないのでしょうか
お前には無理だの一言でかたづけられると悲しいです
>>574 とにかく自分のレベルがどの程度かを伝えようと
必死に説明したつもりでして、別に私が自分が
アセンブラができると自慢したがっているわけでは
ないです…もちろん、そんなこと思ってません
これが精一杯でした
かんにさわったらごめんなさい
>>575 > そう言い切るのは厳しいと思う
??
>>573 が startup と bootstrap を混同していると指摘しただけだが。
まあ、startup が bootstrap を含んでいるケースなんかもあると思うが、意味的には別もんだと思うぞ。
>>576 て言うか、「インラインアセンブラできます」程度じゃ難しいと言うだけのこと。
アセンブラの知識はもちろん必要だけど、それだけじゃダメだし。
つーか、bcc32 使ってないからよく知らんのだけど、c0w32.obj のソースは付いてないのか ?
スタートアップというものがある、というところまでたどり付けてるんだから、 それを解析すればいいんじゃないの?ソースは付いてこないんだっけ。 インラインアセンブラ使えるってことは基礎的なことは分かってるんだから、 解析するうちに理解が深まるよ。
目的は、シンプルなスタートアップコードを作ることだよな。 bcc は知らんが、VC なら C だけでスタートアップコードは書ける。
startupって、BIOSとかのブートストラップシーケンスじゃなくて、IPLとかのことでしょ。 すなはち、BIOSなどのブートプログラムにより呼び出される、OSの最初のイニシャルプログラムで、これによりOSが動き出す。
>>580 > startupって、(...中略...) IPLとかのことでしょ。
また、知ったか厨がでてきたよ...。
せめて、c0w32.obj をググルなりしてから書けばいいのにねぇ。
>>581 >せめて、c0w32.obj をググルなりしてから書けばいいのにねぇ。
スマソ。
ただ、
>>569 =
>>576 >アセンブラに慣れている人でも、限られた人くらいしか
できないくらい?
全然そんなことないと思うけどなぁ。インライン内でアセンブラ書いてるわけだし。
Cなどで作ると、Cコンパイラは最適化してくれちゃったりするのもあったりして目的のコード吐かなかったり、API関数などとのしがらみもあるでしょう。
アセンブラONLYならターゲットのことだけ考えればいいし・・・。やりやすいと思うけどなぁ。
スタートアップコードってcrtみたいなの?
>>582 > Cなどで作ると、Cコンパイラは最適化してくれちゃったりするのもあったりして目的のコード吐かなかったり、
はぁ ?
volatile とかの話か ?
>>583 そう。
>>584 VC7だと/O2オプションとかである条件の関数呼び出しがcall/retじゃなく
jmpになったりするけど、そういうことかと。
>>586 その程度のことで
>>582 > Cなどで作ると、Cコンパイラは最適化してくれちゃったりするのもあったりして目的のコード吐かなかったり、
こんなこと言ってるんなら、普段書いてるコードのたかが知れますな
BCB5のディレクトリを探したらsource/startupに startup.c c0nt.asm 等々がありました もっと調べておけばよかったのに…と反省しました インストールした当時に俺には関係ないやと 完全に無視をしていたのでノーマークでした すっかり忘れてた makefileの中に $(LIBDIR)\c0w32.obj : c0ntw.asm c0nt.asm $(ASM) $(ASMFLAGS) c0ntw.asm,$<; という部分があったのでやった!と思いました たぶん私が欲しがっているものだろう… これから中をみて勉強します 解析したら?とのアドバイスをいただいたので それっぽいものをグーグルで探したら、 逆アセンブラとかのツールがあるようでした これはexeファイルからアセンブラソースを 出力するようですが、objファイルから アセンブラソースを出力するようなツールは あるのでしょうか?
>>588 なんでまた、ソースが見つかったと言うのに逆汗なんか調べてるんだろう ?
>>589 解析ツールとか使ったことがないので、使ってみたいなと思ったのです
しかもソースがあるから比べて見ることもできていいな、とも…
>>569 c0nt.asmのソースがあるなら
publicdll ___CPPdebugHook ; export the symbol
を
public ___CPPdebugHook ; export the symbol
にすればexportされない。
AFLAGSは/mx /w2 /zdでいけると思う。ただしBCB6での場合。
oggのdllをSSEで高速化するときに完全vc互換のdllを作成するためにやったことがあるんだけど
bccは最適化やSSE対応(16Byte Alignment指定)の面で劣っているので今ひとつだった。
それにbccではdllのexport順がソース内の宣言順かソートされた順番でしかできずdefファイルの記述順
通りにはどうしてもできず断念した。
結局dllの作成にはgccを使いGUI周りの速度を要求されないところはbcbを使っている。
プロテクトモードでは、セグメントレジスタって 特権モード3じゃ操作できないの?
>>594 セグメント・ディスクリプタのDPLが3になっていたら特権モード3でも
操作できる。
wdisを使ってみましたが Ran out of memory in during initial reading of the object file or bad object fil e record Borlandのobjには使えないようでした 資料をもとめてLASMをダウンロードしましたが、 これに付属のマニュアルがとても丁寧でした 今の私にはアセンブラのK&Rです 思わぬ掘り出し物でした
ところで、セグメントとセクションって 何が違うのでしょうか? bcc32 -S で出力されるソース内の _TEXTsegment dword public use32 'CODE' _TEXTends _DATAsegment dword public use32 'DATA' _DATAends _BSSsegment dword public use32 'BSS' _BSSends これってセグメントを記述してますよね? exeファイルにマウスを合わせて右クリックメニューの クイックビューアのウインドウにある セクションテーブル .text .data .tls これってセクションについての詳細ですよね? セグメントもセクションも、プログラムにおける メモリ空間のディレクトリみたいで、メモリ空間を 小分けして名前を付けているようにみえます ディレクトリとフォルダのように、名前は違うけど 意味は同じといった程度の差でしょうか?
>>597 セクションは分からんけど、セグメントは上位アドレスだろ。
例えば、アドレスffff0000ならffffがセグメント、0000がオフセットアドレス。
ちと不明確なこというけど、CPU16bitアドレスバスだとhexで4桁が限界だ罠。
だから、バス上にはカラムアドレスとロウアドレスの2回に分けて出してる。メモリもカラムとロウが縦横であるだろう。
で、通常x86CPUは、ある一つのセグメントのオフセットアドレス(下位アドレス)が0000〜ffffまでのメモリ空間か、もしくはI/O空間のいずれかで動作している。
そのメモリ空間アクセスの場合の今居るセグメントを決めてるのがセグメントレジスタ。
だからセグメントが違うメモリ空間をアクセスするときは、いやがおうでもセグメントレジスタを切り替えねばならない。
cf)I/O空間アクセスはどうだろう。
これは、レジスタの値を変えて切り替えるのではなく、IN/OUT命令で行い、この命令が来ると、命令デコーダで解釈され、コントロールレジスタのI/Oにするかメモリにするかのそれぞれのフラグbitの値を変える。
コントロールレジスタは、直接、I/Oアサート(要求)pin、メモリアサート(要求)pinにつながっている。
ちなみに、x86の全I/O空間(PCIだ〜、HDDだ〜、シリアルだ〜何だ。ただし、BIOSはメモリ空間の先頭であり、グラフィックメモリもメモリ空間の一部)は1オフセット分すなはち0000〜ffffまでしかない。
すなはち、I/Oをアクセスするのにセグメントは要らないし、当然アドレス出力も一回のみ。
>>597 Win32だったら、まあ同じものと思ってもよかろう。
目的別にまとめてるだけだ。
>>598 再提出
>>598 何言ってんの。初心者が本当だと信じ込んだらどうする。
8086でさえセグメントレジスタとオフセットは12ビットずらして
足し算してたぞ。80386の32ビットモードのセグメントセレクタは
根本的に16ビットのそれとは違う。
オフセットはフラットモデルで32ビット=4GBをまるまるアクセス
できる。セグメントセレクタは主にセグメントの属性を決めるも
のであって、メモリの上位アドレスではない。
もっともPentium Pro以降はアドレス空間が64GBに拡張された
けど、一プログラムからは8086のfarコールのように64GBをまる
まる使えるわけではない。64GB全部を使い切ろうとすると複雑な
手続きが必要で、結局OS任せになる。一プログラムが使える
最大メモリ空間はあくまでも4GBまで。
>>600 32bitモードの話でしょう?
最初から、それもやると分かりにくいんじゃ・・・。
>80386の32ビットモードのセグメントセレクタは
根本的に16ビットのそれとは違う。
オフセットはフラットモデルで32ビット=4GBをまるまるアクセス
できる。セグメントセレクタは主にセグメントの属性を決めるも
のであって、メモリの上位アドレスではない。
セグメントセレクタでの話ってことでいいんでしょう。
~~~~~~~
16bitモードのセグメントレジスタでは上位アドレスを表しているでしょう。
32bitモードは、そんなに使う?
追加。 >8086でさえセグメントレジスタとオフセットは12ビットずらして 足し算してたぞ。 確かに、セグメントレジスタは、そのまま上位アドレスではなく、計算されて、プログラムコントローラに入れられ次のアクセスアドレスとされたり、汎用レジスタに保管されて利用される。 その点で、 ・16bitモードのセグメントレジスタでは上位アドレスを表しているでしょう。 と書いたのは、そのまま上位アドレスとして使われるという意味で誤解を招くと思う。
セグメント値 XXXX0 +) オフセット値 YYYY ------------------- アドレス ZZZZY
386プロテクトモードでのセグメントレジスタの値は セグメントディスクリプタへのインデックスということでいいんじゃないの? あんまり正確に説明しようとすると混乱するだけかと。
>>602 ×プログラムコントローラ
○プログラムカウンタ
あ、もちろんそのインデックス値をあたかも上位アドレスの 値であるかのように扱って、異なるセグメントへジャンプしたり ってのはあるけどね。肝心なのは上位アドレスであるかのように 見させるのは8086との命令互換性から考えられたものであって、 その実はインデックス値から引けるセグメントの先頭アドレス ということになるけど。
>>600 セグメントの話しにページングおよびPAEは一切関係ないかと。
セグメンテーションによっていったんまったいらはらたいらな
リニアアドレスというものが得られるという点は大事だよ。
これこそがプログラムから見える唯一のアドレス値なわけだし。
>>608 インテルは本当は8086で80386のようなセグメンテーション機能
を実現したかったらしいが、その当時の集積技術とかかるコスト、
最初のダイが得られるまでの時間を概算してあっさり諦めたと
いう事だ。とにかく68000よりも先に8080の後継CPUを出してZ80
に奪われかけた主導権を取り戻したかったらしい。
8086はいかに低い集積度でたくさんの命令を詰め込むかに焦点
を当てて作られており、現在ではごく一部の命令にしか使われて
いないマイクロプログラムをふんだんに使用していた。アドレス・
バスとデータ・バスもマルチプレックス方式(時分割方式)で出力
しており、スピードよりも8bitCPUの部品を流用できる事に重点が
置かれていた。
>8086はいかに低い集積度でたくさんの命令を詰め込むかに焦点 >を当てて作られており、 現在使われてる大半の命令が0Fプレフィックスだらけになってるのはなんとも皮肉だな。
>>610 結局昔にオペコードを使いすぎて、空きがそれしかなかったんだ
ろうね。66と67もCでshort使うと普通に使われてるし。
現在PentiumWもAthlonもほとんどワイヤード・デコードだしな。
CISCの泣き所であったマイクロプログラムの遅さの欠点をほとん
ど取り除いてあるし。
x86で最も命令長が長いのは直接アドレスにDWORD値を書き込む
命令だっけ?
>もっとも長い命令 一般保護例外の条件で15バイトと決まってる。 seg 66 67 op ModR/M SIB disp32 imm32 でも14バイト。あと1バイト何だろう、、、
みなさんx86のアセンブラ歴は何年?
それにしても少し心配な事が。 IntelのIA-64とAMDのx86-64が正面からぶつかり合っている事だ。 これはMicrosoftにとっては大きな痛手だ。もし両者を認めると これから出してくる64ビットWindowsはつねに2種類作らなければ ならなくなる。で、実際そうなってきている。 ソフトウェアの互換性、再コンパイルの不要性がここまでパソコン をもり立ててきたのは明らかであり、64bitになってからの決別の 不利益はソフトウェア・メーカーと我々ユーザにどっしりとのしか かる。早い段階でどちらかが淘汰される事を祈る。
EFIの仕様はx86-64の存在を最初から無視してるね・・・
>>612 うーんなんだろうねえ。SSE命令だろうか?
インテルもAMD64の互換プロセッサを出すんじゃないの?
>>617 のドキュメントは古すぎるかと。
3DNow! vs SSE 再来でつか…
>>618 そっか古すぎか。しかしIA-64凄すぎだね。汎用レジスタファイル
128個か。よほどx86のレジスタの少なさが悔やまれたと思われて
面白い。
もっともr32〜r127はスタック汎用レジスタで、x86においてESPや
EBPに多大な過重がかかっていたのを大幅に分散する目的か。
仮想IA-32モードという響きが心地よい(w。あと数年もしたら皆
当たり前のようにIA-64 Windowsを使っているわけだ。
命令にもスペキュレーションと呼ばれるタグ命令が多くあり、コン
パイラがCPUに積極的に実行時のヒントを与えるようになってる。
今のRISCでは当たり前の機能かもしれないが。
>>620 SPARCやia64にあるようなレジスタスタックウィンドウだと
リターンアドレス書換えのバッファオーバーランはかなり
防げるのかな?レジスタをallocして使うってことは、
確保してない領域のレジスタに触ると例外飛んでくれるって
ならありがたいね。
>>619 そいつはまだ部分的なオペコードの相違だったから最悪の場合
80387の命令に限定すれば動いたからね。
今度は64ビットモードではオペコードの互換性そのものが全部、無い。
全く違うCPUって事だから。
>>621 ああ、自分で書いててわけわかめだ。逝ってくる。
>>621 >スタックされたレジスタのうち現在のフレームの範囲外のものを読み込むと、
>未定義の結果が返される。これらのレジスタに書き込むと Illegal Operation
>( 無効操作) フォルトが発生する。
とPDFにはあるから、Cのローカル変数の操作に起因するバグはかなり
食い止められそう。
>>623 という事はまたWindows95系のように、32ビット命令と64ビット命令
を混在されたOSを作るわけか。Microsoftならやりそうなことだ。
ia64、amd64用の二つのWindowsはいまβ版を誰でも 落とせるようになってるみたいね。 しかしpsdkにはia64用のコンパイラしかないんだよな。
>>626 64bitWindowsはカーネルには64bitコードしかないみたい。
>>627 Opteronが出てきたからM$としては取り敢えず「準備はありますよ」
という姿勢だけは見せておかないといけないからかな。
>>628 JITコンパイラ?.Net戦略もあまり芳しくないようですが。
>>629 それならよかった。初めからNT系のように安心して使えるのか。
cli jmp $
>>632 Clear Interrupt Flag??
そこでNMIの出番ですよ。
しかしIA-64のEPICは面白い。疑似ベクトル・コンピュータみたいな 事ができるんだね。
>>636 あんた変人だな。折れあんな機械語吐きたくねぇ・・・
>>637 そうか?しかし見れば見るほどItanium2は凄いな。Athlon64
なんてただのx86の強化版+64ビット化にしか見えない。
機能は満点だからなあ。まあ最終的にはコストに見合った 性能が出せるかどうかかねえ。
>>639 普及すればすぐ下がるっすよ。Pentium Proも発売当時は
10万以上したでしょ。
>>641 ソフトウェアエミュレータは遅いからねえ・・・・
ライブラリなんかがネイティブ物呼べれば 多少はましにならん?
"アドレス指定方式"というのを調べていて
インデックスレジスタとかベースレジスタとか
ごちゃごちゃしててわからないので
8086のアセンブラをいじってみようと思った。
Linux用のnasmのコードがFreeBSDで通らない。
へんだと思って調べてみると
システム・コールの関係で、同じCPUでも
OSによって書き方が変わるらしい。
ちょっと勘弁。
最強のOSはコメットIIなのか?
[Linux/FreeBSD/BeOS]
ttp://linuxgazette.net/issue53/boldyshev.html
>>646 標準ライブラリ呼べばいいやん。
アセンブラで書く意味が激減するような気もするが。
>システム・コールの関係で、同じCPUでも >OSによって書き方が変わるらしい。 これって当然じゃないの???
dosのプログラムがwinxpでも動くよ?
エミュレーションしてるからな。 動かないプログラムも山ほどあるわけだし。
>>647 どうも、ありがとうございます。
お蔭様でだいぶすっきりしました。
わけわからんうちは、この方式で逝くことにします。
> nasm -f elf -l hello3.l hello3.asm
> gcc hello3.o -o hello3
> ldd ./hello3
./hello3:
libc.so.5 => /lib/libc.so.5 (0x2807c000)
> ./hello3
Helloooooo, nurse!
> catl hello3.l
1 global main
2 extern printf
3
4 section .data
5 00000000 48656C6C6F6F6F6F6F- msg db "Helloooooo, nurse!",0Ah,0
6 00000009 6F2C206E7572736521-
7 00000012 0A00
8
9 section .text
10 main:
11 00000000 68[00000000] push dword msg
12 00000005 E8(00000000) call printf
13 0000000A 58 pop eax
14 0000000B C3 ret
>>652 64-bit CPU だと int が 32 bits でポインタが 64 bits ということも。
654 :
デフォルトの名無しさん :04/01/14 05:25
objdump -d の出力を眺めていて以下の記述がありました。 36f:8d 57 ff lea 0xffffffff(%edi),%edx 372:89 d0 mov %edx,%eax これの意味はどういうものなんでしょうか?leaがアドレス値をレジスタに ロードする命令というのは分るんですか、0xffffffff(%edi)というのは 何を意味しているんでしょうか?
%ediのアドレス値が一周して同じ値を示すことになるのではないかっていう疑問です。
mov edx, edi-1 // こんなインストラクションはない mov eax, edx
>>656 あ、なるほど。すっとぼけてました(汗
lea -1(%edi),%edx /*こういう書き方ができるかどうかはともかくとして*/
という意味だったんですね。ありがとうございました。
lea はいろいろと便利だよね...
AGIになりやすいのが難点だけど x3x4x5x8x9、reg+reg+immなど多彩
FreeBSD(に限らないと思うが)のシステムコールは、Cと同じくスタックに 引数を積んで、%eaxにシステムコール番号を入れて割込みをかける。 これのいいところは、libcのシステムコール関数で引数を触る必要がないこと。 (スタックポインタをちょっといじって割込みをかける、というコードをアセン ブラで書いたものになる。すると、カーネル側のエントリポイントがそのままC 呼出しされた感じになる) 方式としてCPUアーキテクチャに依存しないし、機械的にコードを生成できる。 IA-32のLinuxのシステムコールはDOSのint 21hを見て作ったんだろうなあと思わ される、レジスタに引数を載せて割込みをかける方式。 当然システムコール毎にコードが違う。 このへんだけでも、Linuxって学生が作ったんだなあと思う。
それでFreeBSDはあんなに遅いのか・・・
663 :
デフォルトの名無しさん :04/01/14 23:45
インデックスレジスタをもちいて以下のプログラムを作ってください。 なお、言語はM32のアセンブリ言語を用いてください。 100個のデータ:D00、D01、D02、・・・、D98、D99が700番地から順に入っている。 その各データの二乗の総和:D00^+D01^+D02^+・・・+D98^+D99^を計算して レジスタr1に入れるためのプログラムを作成して下さい。なお、M32には乗算命令 MULR(RR形式)があるものとします。
>>661 誤解を招いたのはうろ覚えで書いたのが不味かったか。FreeBSD遅くない。
エントリポイント:
lea システムコール番号,%eax
int $0x80
jmp cerror (errnoの処理してretする)
システムコールのlibc側はこれだけよ?
引数に触らずに割込みして、libc関数を呼ぶためにスタックに積んだものがそのままカーネル側で使われる。
666ゲトー
主要なまともなOSのシステムコールはスタックベースだよね。
668 :
デフォルトの名無しさん :04/01/15 20:33
質問です。 pentium以降の32bitアセンブラで、関数呼び出しをjmpの様な、 ある地点からの相対オフセットで求めて行いたいのですが、 call命令にそういうモードみたいなのは無いのでしょうか? 動的なメモリ上にコードを展開して実行させる必要があるので、 絶対距離に依存するインストラクションはあまり置きたくないのです。 今の段階ではカレントのipを以下の様なgetipという関数で取り出して、 それに目的の関数までのオフセットを加算するという方法で 呼び出そうかと考えていますが、もっと単純で良い方法がありましたら ご教授願います。 ;---------------- eaxに親のインストラクションポインタ(ip)を返す関数 getip: mov eax,DWORD PTR[esp] ;; スタックに入っているipをeaxに渡す ret ;---------------- func: ;; 呼び出す関数 : ;---------------- call getip ;; 現在のip ==> eax add eax, offset ;; eaxに関数funcまでの相対オフセットを加算する call eax ;;呼び出し
call ip+offset とか?
670 :
デフォルトの名無しさん :04/01/15 20:41
ちなみに、カレントipを取り出す手段として以下の様な方法がありますが、 ラベルのL1の呼び出しが絶対アドレスに依存するので、今回この方法は 使えないっぽいということは判っています。 ;---------------- call L1 ;; 直後のラベルを呼び出す。 L1: pop eax ;; eaxにipが入る。
push eipは?
>>667 PowerPC採用以降のMacOSではレジスタベース。
OS-Xは知らない。
push eipがない!!なんて直交性の悪いCPUなんだ。 (今に始まった事じゃないが)
>>668 ん?
0xe8は相対アドレスだぞ。
>>673 そんな命令のあるCPUがどこにあるのかと…
675 :
デフォルトの名無しさん :04/01/15 22:08
>>674 え、そうなんですか?
調べ直してみます。
どもでした。
call nearって相対アドレス生成してると思ったが・・・・???
677 :
デフォルトの名無しさん :04/01/15 22:15
あー、今まで何か勘違いしてました。 命令セットリファレンスのCALL(E8)の説明、 >相対near コール、次の命令とディスプレースメント相対。 ってのがそれみたいですね。(EIP抽出が必要なのかと思ってた)
最新流行はシステムコールごとに割り込み番号を割り振る。 これ最強。
ハァ?何言ってんの? 最近の流行はカーネルをスタティックリンク これ最強
保護機構が無くなってしまわないか
折れ様のコードは絶対だから保護など不要!
まあでもPc_Unixってのは、自由にカーネルにモジュールを 追加できるのがメリットの一つではあるな。
cli hlt ('A`) ノ( ヘヘ
ヘ!
まあ、アレだな、x86でリロケーションが必要なのは8086の マシン語でFAR CALLする場合だよな。セグメントだけは どうしようもないのでEXEファイルの場合ロードされた番地 によって内部を書き換えていたっけ。MS-DOSの仕事だが。 考えればトンデモな糞CPUだったがあれが世界を席巻する とはな。
兵は拙速を貴ぶ これだけの事
非常に初心者的な質問なのですが、Cの関数を使うにはどうすれば良いのですか? extern printf としても、Unresolved external printfって出てくるのです。 環境は Windows98SE NASM DOSプロンプトのexe形式 です
さあ、その環境の事は判らないけど 普通は × printf ○ _printf だね。
_printf にしたらUndefinedってなりました
C のライブラリ、リンクしてる?
Cのスタートアップコードも呼んだ方がヨイ予感・・・・
externだけ直して、callの方を直していないとか。
>>692 そうやね。
iob初期化しないと楽しい事になるな。
つーかマニュアル読め、ググレ、そして首つって逝け
8086ででかいプログラム書くとき、セグメントの壁ってどうやって越えるの?
セグメントをちまちま切り替える 遅いし面倒だYO
俺は世間で言うほど面倒だったという記憶がないな
>695 farポインタで覗く
far ポインタか...。 何もかもが懐かしい。
>>696 基本的にIPは操作できないでしょ?
CS切り替えたら違うところに吹っ飛びそうな。
>>698 それはつまり、64KBくらいかなぁと思われる地点で
次のセグメントにfarジャンプ?
コードの話しか 紛らわしい書き方すんなよ 64KB超えない単位でサブルーチン作って適当にfar call汁
>>701 スマンカッタ。
やはりfar callなりしなきゃいけないんだな。ひとまず納得。
>>700 8086時代のCコンパイラがあったらぜひ紐解いてみて欲しい。
スモールモデル、コンパクトモデル、ミディアムモデル、ラージモデル・・・
アセンブラにもそのままこの手法が使えるから。
ちなみに64KBぐらいかなぁと思われる所で・・・・はやめた方がいいヨ。
後からコード付け加える時死ぬ思いするから。初めから全部FAR CALL。
>>703 あぁ、そうか。おかげで勘違いしてた
>>701 の意味が完全に分かった。
初歩的なところごめん。
つーか64KB超える8086アセンブラのプログラムって・・・
>>705 Lotus1-2-3はオールアセンブリだったそうだぞ。
あ、MS-DOS用ね。念のため
そういえば、mifesに慣れていた俺がvzを見たとき .comだった事に感動したな
>>708 あったなあそんなエディタ。で、オプションは何と自己書き換えに
よって実現してたよな。オプション変えるとvz.comのタイムスタンプ
が変わるの。究極のミニエディタだった。
どうも記憶が曖昧だがV30にPUSH-IPがあったかも
>>710 うぉう!6809!なんという懐かしい響きだ!
でも逆に言うと単にマイクロプログラムですべてのレジスタ
に対するアクションを組み入れたって事だよね。歴史的な
事情も糞もない。
68000ではPSH命令、PUL命令はMOVEM命令に統合された
が、残念ながらPCは外されている。まあプログラムカウンタ
相対の結果ををLEA命令でロードすればそれに近いことは
できるけどね。
>>710 ああ、すっかり忘れてたよ。
PLUS hoge,PCはたまに使っていた。
そういえばUは本当にスタックなのか未だに疑問だ…
インデックスで使った記憶しかないよ。
>>713 ユーザースタックは意外と使いでなかったね。8086のBPみたいに
スタックフレームを作るなら役立つけど。
>>712 > まあプログラムカウンタ相対の結果ををLEA命令でロードすればそれに近いことはできるけどね。
pea (0,pc) でそのものズバリができる。
つーか、次の命令へのサブルーチンコールすれば大体の cpu でできると思う > push epi
まあ、ここは命令の直交性の話だからちと意味が違うか。
>>713 > PLUS hoge,PCはたまに使っていた。
ホントに使ってたのかと、小1時間問い詰めたいんだが...。
>>715 >pea (0,pc) でそのものズバリができる。
あっそうかその手があったか。6809から8086に乗り換えた
負け犬ですので。もちろん仕事でもSH4は使ってないよ。
>PLUS hoge,PCはたまに使っていた。
ああ、PULSと綴りが違うからか。本当に使っていたらtypo
なんて滅多にしないはずだよねえ。
アセンブラブラぶらさげて 愛たっぷり包まれた ああ、一口食べれば忘れられる
>>673 call hoge
hoge:
pop eax
で eax に eip が入る. ELF で GOT の実効アドレス得るのに使う.
…ってもう670に書いてあったわ。・゚・(ノД`)・゚・。 逝ってくる
720 :
デフォルトの名無しさん :04/01/17 11:10
Linuxで/proc/iomemに見える32bitのアドレス値と 16bitのIOポートアドレスというのはどう違うのでしょうか?
16bitのほうはI/O空間。 32bitの方はメモリ空間。 嘘です。シラン
722 :
デフォルトの名無しさん :04/01/17 17:32
typedef struct{ int flag; char name; int age; }USER_DB; これの、ageが分かってて、nameを調べたい場合 ループ回してやるしかないと思うんだけど なんせ、dbは5000超えてるんで凄く時間がかかる。 それでアセンブラで何とか高速化出来ない物でしょうか?
>>722 スレ違いの様な・・。
ageをキーにハッシュテーブル化すればいいんでは。
user = age_hash[age];
二分探索すれば?
>>614 > IntelのIA-64とAMDのx86-64が正面からぶつかり合っている事だ。
NT 時代には MIPS, Alpha とかサポートしてなかったか?
>>725 そして次はソートアルゴリズムでハマると。
722 に必要なことは、アセンブラを勉強することではなくアルゴリズムを勉強すること
だと思われ。C 言語なら qsort(), bsearch() あたり、C++ なら STL の map, hash_map
とかでぐぐれ。
>>723 age って年齢 ?
だとしたら、重複しまくっているんじゃないか ?
複数の結果が欲しいのか ?
それとも、任意の代表者名でいいのか ?
あと、その DB って名前が一文字しか入らんのだけど、それでいいのか ?
まあ、5000個ぐらいなら今時の PC で「凄く時間がかかる」なんてことないから、普通にループ回せよ。
>>726 当初はMIPSやAlpha, PowerPC版もあったけど、結局2000からx86だけになっちゃったんだよね。
Windows CEもPocket PCに関しては事実上ARM専用になってるし。
M$としては複数のアーキテクチャに対応してサポートに手間を取られるよりも
単一のCPUで売りまくって稼ぎたいんだろうな。
>>729 その通り。M$側にしたら開発コストが2倍まではいかなくても
複数のCPUをサポートする事でかなりの追加コストがかかる。
テスト数はリニアに倍になり、テスト要員も倍必要になる。
AMDのx86-64をM$に継続してサポートして欲しければ、M$
に多額のロイヤリティを渡すしかなかろう。
>>729 逆の意見もみた覚えがあるな。
Intel 専用 OS になってしまうのを嫌って他アーキテクチャもサポートしていたのだが、
RISC 陣営がワークステーション商売あがったりになって手を引き始めてしまったので、
結局 x86 以外残らなかった。
真偽のほどは知らないけど、Microsoft と Intel の間に隙間風が吹いてるのは確か。
今 Microsoft が狙っているのはハイエンドサーバだが、Intel はそこには IA64 を突っ込む
つもりで IA32 を展開する気はさらさらない。IA32 市場で築いた資産を活かしてハイエンド
サーバ市場に攻め込むつもりの Microsoft としては、x86-64 の方が嬉しい選択肢では
ある。
もちろん、Microsoft が心底望んでるのは Intel 版の IA32 互換 64ビットプロセッサだろう
けど。
>>732 となるとM$が逆にイソテルを脅してx86-64をすぐに出すように
密談済みという事もあるだろうな。
>>731 ワリィ。
はじめは、age がバリバリ重なるからハッシュなんてダメよ〜〜〜ん、って書いてたんだけど、よくよく考えたら
>>722 がよくないことに気づいて内容書き換えたけど、レス番書き換え忘れちまったよ、すまん。
>>722 とりあえず、SQLにまる投げしちまうとか?w
>>720 ちょと、farcallだけど・・・
>Linuxで/proc/iomemに見える32bitのアドレス値と
>16bitのIOポートアドレスというのはどう違うのでしょうか?
まんま、倍食ってるてことじゃないの。
32bitモードではCPU側にパイプラインバスが要ると同時に、メモリ側にもソレに対応したインターリーブする椰子が必要なんじゃなかったけ。(32ビットモードはハードによる?)
しかも、最低32bit分はアドレス連続してないといけなかったような・・・(気がする)
フェッチかエグゼキュートもしくは両方のサイクルでアクセス中に次のアドレスを指定して、受ける方(メモリ側)も受け付けてるんだよね?(細かい動作忘れた)
>しかも、最低32bit分はアドレス連続してないといけなかったような・・・(気がする) しかも、アクセスするときは最低32bit分は ~~~~~~~~~~~~~~~~~ アドレス連続してないといけなかったような・・・(気がする)
I/Oだから
>メモリ側にもソレに対応したインターリーブする椰子
~~~~~~~~
メモリじゃないね。
でも、I/O空間でパイプラインバス、インターリーブは覚えがないなぁ。
てことで、
>>736-738 はアボーンで。
ごめん。ナニ言ってるかさっぱり
>>739 ごめん、重修正で・・・。
x86系はメモリ空間にI/Oがあるわけでなく、メモリとは別にin、out命令アクセスによる16bit(XXXXh)になるけど、
32bitってことは、CPU側がパイプライン、I/O側がインターリーブ使って、32bit分を連続アクセス(前のサイクル中に次のアドレスアサート)かなぁと思って。
でも、I/Oにはパイプライン、インターリーブってあったかなと思って・・・。ゴメソ。
確か、x86はREQ0〜REQ4pin(昔のW/Rpin[リード/ライト]、M/IOpin[メモリ/IO]、D/Cpin[データ/コード(データバスの値をペリフェラルチップの設定用のステータス信号にするかデータか)])のコントロール信号の組み合わせのstatusで、ペリフェラルチップがメモリアクセスかI/Oアクセスか判断して、 そのREQ0〜REQ4にI/O指示を出すのがIN/OUT命令ってことでいいんだよね。CPUのアーキテクチャ上ハードでそうなってるってことで。
>>720 Linux板で聞いたほうが早いと思われ
みなさんどうもありがとうございます。自分なりに調べたら
/proc/iomemとは現時点での物理メモリの状態を返すファイルらしいです。
http://www-online.kek.jp/~yasu/Kenshu/linux-virtual-address.html ちなみにIOポートアドレスは/proc/ioportsで見れるらしいです。
自分の環境では以下のようになりました。
$uname -r
2.6.1
$cat /proc/iomem
00000000-0009f7ff : System RAM
0009f800-0009ffff : reserved
000a0000-000bffff : Video RAM area
000c0000-000c7fff : Video ROM
000f0000-000fffff : System ROM
00100000-0b3fffff : System RAM
00100000-00367837 : Kernel code
00367838-0044ab9f : Kernel data
fb000000-fbffffff : 0000:00:0f.0
fc000000-fcffffff : 0000:00:0f.0
fd000000-fd00001f : 0000:00:10.0
fd000400-fd00041f : 0000:00:11.0
fffe0000-ffffffff : reserved
これを見ると低位1MBと0xfb000000-0xfd00041f
の間が何か特別なことに使われているように見えます。
これからLinuxの実装を少し調べてみます。どもでした。
>>710 eipって知らないんで何を話してるのか分からないんだけど
>こいつは、ユーザースタックにユーザースタックをプッシュすることもできる。
それは無理でしょ。
6809のスタック操作命令のオペランドは8bitです。
対称となるレジスタを指定するのに1bitずつ使用します。
で、A,B,CC,DP,X,Y,PCで7bit使うので残りは1bitしかありません。
だからシステムスタックに対する操作(PSHS,PULS)の場合には
残りの1bitはユーザースタック(U)と解釈され、
ユーザースタックに対する操作(PSHU,PULU)の場合には
システムスタック(S)と解釈されます。
・PSHS,PULSではUを扱えるがSは扱えない。
・PSHU,PULUではSを扱えるがUは扱えない。
で、リンク先のPSHU,PULUの欄を見たけど単なる誤記ですね。
ちなみにDレジスタ(16bit)はAレジスタとBレジスタ(ともに8bit)をつなげて1つのレジスタ扱いする場合の名前です。 アセンブラには PSHS A,B のかわりに PSHS D とも書けますが結果は同じです。
いや、まともにやったのが6809だけというアマチュアです。
>>747 どうしてx86やんないの?6809の頃はサブルーチンで書くしか
なかった実数演算がそのままアセンブラで書けるよ。64MBの
束縛もないし、MSVCRT.DLLをリンクすればよく使う関数はだい
たい揃ってるし。まあ人それぞれだが。
俺はC++中に_asmで埋め込むのが好きでよくやってる。SSE2
とかね。
Pentium4 マシン持ってないから SSE2 使えない...。
x86の載ってるマシンは所有した事がないもんで。68000系かPPC。(つまりマカ) 68000とPPCはちょっとかじった程度。いや眺めた程度か。
>>749 了解。
>>750 すげえ。初心貫徹ですか。俺はヘタレだからすぐにPC-98XX
買ったけど。PPCはRISCだからかなり違うけどそれにしても
マイナー路線で頑張る孤独なランナーといった感じ。
>>722 >なんせ、dbは5000超えてるんで凄く時間がかかる。
ほとんどディスクアクセスの時間だったりして。
逃げます(笑)
>>744 > それは無理でしょ。
うぉっ、ホントだ。
さすがに使ったのは 20年前頃だし、うろ覚えだった...。
指摘ありがと。
ちなみに、eip は (68 系で言うところの) pc のことです。
((Extended) Instruction Pointer)
>>748 > 64MBの束縛もないし
MC6829 (Memory Management Unit) 使っても 1MB までだったと思うけど。
>>750 > x86の載ってるマシンは所有した事がないもんで。
う〜〜〜ん、すごい。
おれも、X68000 までは 68系だったけど、兄貴が持ってた MAC が馬鹿高い + 当時すぐに爆弾マークが出てたので、泣く泣く宗教換えしちまった...。
なんか変な人がいるね。 748とか。。
?? 64MB の件は typo として、あとは趣味の範疇だろ。 別に変とは思わないが。 (つーか、今時アセンブラ云々言ってる奴ら (=このスレにいる奴) は、世間から見たら充分に変な人だと思われてるだろう。)
長年すみなれたtasm族ideal村を離れて、nasmに移住するか 悩み中・・・・
>>755 Σ(゜ロ゜)ガーン。64MB→64KBのtypoです。スマソ。
でも前後の流れからわかるよね。
>>754 あ、でもOS-9 LevelUを見てもわかるようにMMU
使って1MBまでは拡張でき、かつ使用できたよね。
確か。それでOS-9/6809の寿命が大幅に伸びた
んだ。
簡単な足し算命令をさせると、FPUとMMXではそう
差は出ないが、SSEやSSE2を使うと簡単に2倍の
速度が出る。チューニング次第ではもっと出る。
prefetch命令とか使えば。。。
C++ BuliderX にTASM32.exe付属age 既出?
760 :
デフォルトの名無しさん :04/01/18 21:54
あがってなかった。
バージョンは?
C++ BuliderXに付属するのは Turbo Assembler Version 5.3
tasm5を勝った俺の立場がないじゃないかぁあああ
治った
なんかさ、2chの表紙画面ハックされてない?
ごめんそれ俺
おさるが nasm + gdb で言語訓練中。 とりあえず、axとspを操作。 (gdb) break main breakpoint 1 at 0x80484a3 (gdb) run テスト Starting program: /mnt/ero/asm/foo テスト (no debugging symbols found)...(no debugging symbols found)... (gdb) disassemble main Dump of assembler code for function main: 0x80484a3 <main>: mov al,0xf0 0x80484a5 <main+2>: mov ah,0xf0 0x80484a7 <main+4>: push 0xa 0x80484ab <main+8>: push 0xb 0x80484af <main+12>: add sp,0x4 0x80484b4 <main+17>: push 0x0 0x80484b8 <main+21>: mov ax,0x1 0x80484bc <main+25>: call 0x80484a0 <_syscall> 0x80484c1 <main+30>: nop 0x80484c2 <main+31>: nop 0x80484c3 <main+32>: nop End of assembler dump.
(gdb) info registers eax 0x10 16 ecx 0x2 2 edx 0x10 16 ebx 0x2 2 --- esp 0xbfbfe764 0xbfbfe764 eip 0x80484a3 0x80484a3 (gdb) print **(char ***)($esp + 8) $1 = 0xbfbfe88c "/mnt/ero/asm/foo" (gdb) print *(*(char ***)($esp + 8) + 1 ) $2 = 0xbfbfe8b5 "テスト" // 0x80484a3 <main>: mov al,0xf0 // 0x80484a5 <main+2>: mov ah,0xf0 (gdb) stepi 0x080484a7 in main () (gdb) info registers eax 0xf0f0 61680 ecx 0x2 2 edx 0x10 16 ebx 0x2 2 --- esp 0xbfbfe764 0xbfbfe764 eip 0x80484a7 0x80484a7
// 0x80484a7 <main+4>: push 0xa // 0x80484ab <main+8>: push 0xb (gdb) stepi 0x080484af in main () (gdb) info registers eax 0xf0f0 61680 ecx 0x2 2 edx 0x10 16 ebx 0x2 2 --- esp 0xbfbfe760 0xbfbfe760 eip 0x80484af 0x80484af (gdb) print *(int)$esp $3 = 655371 (gdb) print *(int)$esp & 0xff $4 = 11 (gdb) print *(int)($esp + 2) & 0xff $5 = 10 <以下略>
CPU:AthlonXP 1400+(25w版) M/B:A7V266 MEM:512MB HDD:60GB VGA:自慰Force2MX400 SOUND:SB Live!
名は無いのか…
NASMでTASMのGLOBALみたいなことできないですかね? TASMでは、これでINCファイルにCのように宣言を集めて 使ってました。いろいろ考えてますがいい知恵がうかびません TASMの例: <test.inc> global foo: word <test.asm> include "test.inc" foo dw 10 ;; 実体があるとpublic扱い <use.asm> include "test.inc" mov ax, [foo] ;; 実体がないとextrn扱い
試行錯誤の末、ようやく GDB で DEBUG 相当の画面。つらい。 0x080484cf in _compare () 4: /x $eax = 0x1a 3: /x *(int) $edi = 0x1a00 2: x/i $eip 0x80484cf <_compare+4>: inc %edi 1: /t $eflags = 1010000011 (gdb) 0x080484d0 in _compare () 4: /x $eax = 0x1a 3: /x *(int) $edi = 0x1a 2: x/i $eip 0x80484d0 <_compare+5>: loop 0x80484cb <_compare> 1: /t $eflags = 1000000011 (gdb) 0x080484cb in _compare () 4: /x $eax = 0x1a 3: /x *(int) $edi = 0x1a 2: x/i $eip 0x80484cb <_compare>: cmp (%edi),%eax 1: /t $eflags = 1000000011 (gdb) 0x080484cd in _compare () 4: /x $eax = 0x1a 3: /x *(int) $edi = 0x1a 2: x/i $eip 0x80484cd <_compare+2>: je 0x80484d2 <_compare+7> 1: /t $eflags = 1001000110 (gdb) 0x080484d2 in _compare () 4: /x $eax = 0x1a 3: /x *(int) $edi = 0x1a 2: x/i $eip 0x80484d2 <_compare+7>: ret 1: /t $eflags = 1001000110
質問します。 参考書を見ると cs=es=ds=ss となっていて 現在実行されている場所は cs:ipで セグメントベースcs、オフセットip 具体的には 3AA0:0100 3AA0:0103 3AA0:0106 というようになっているのですが GDBで見ると eip 0x80484a0 0x80484a0 cs 0x1f 31 ss 0x2f 47 ds 0xbfbf002f -1078001617 es 0x2f 47 のような感じになってます。 ipが現在実行している場所、というのは同じのようなのですが セグメントレジスタが何をやっているのか、不明です。 どういうふうに考えればいいのでせうか?
>>774 その参考書が古い。
まあ、フラットモデルだからとりあえず気にしなくても困らんだろう。
気になるならプロテクトモードについて書いてある本を読んで下さい。
参考書=real mode、多分MS-DOSのCOMファイルの説明 GDB=32bit protected mode まったく別物です。
777 :
デフォルトの名無しさん :04/01/22 04:20
オペランドサイズプリフィックスを使えば 386のReaModeでは32bitレジスタを操作できるみたいですが、 これは386からの拡張機能というふうに考えていいんですか? あ、それとも286からなのかな。
286には32bitレジスタなどない。
>>775 >>776 どうも、ありがとうございます。
とりあえず気にしないことにします。
参考書は[はじめて読む8086]で、
1987年4月1日初版
2000年3月11日第一版34刷発行
序文に、著者は[Nowい]。
と書いてあります。
たしかに古い本のようで、
32ビットのレジスタは登場しないし、
当然32ビットの乗除算なども出てこないです。
大筋がつかめたら、そのうち
real mode/protect mode
インテルの日本語マニュアルでも
チャレンジしてみるかもしれません。
# EDX:EAX <- EAX*r/m32
日本語マニュアルってあんの?本で売ってる奴のことかな いつもdeveloper.intel.comしか見てない
thanks!
8086 について
DS,ESは、必要に応じて、いじくり廻していい。
それだけ広いメモリ空間にアクセス出来る
ただし、ややこしくなるので、
初めのうちはごく狭い範囲での操作とするのがいい
「CS:」を明示的につけることでコード領域の
静的データなどをアクセスする場合もある
なお、
>>779 で既出だが
乗除算ではDXが上位ワードになり
DX:AX で32ビットとなる
>>779 「はじめて読む486」だっけ? あれ読めば? 分かりやすかった。
80386/486プログラミングガイド(富士ソフトウェア)が 教科書だった
8086アセンブラ。結構楽しいので、はまってます。 080484a0 <main>: 80484a0: e9 16 00 00 00 jmp 80484bb <sub2> ; e9 == 相対nearジャンプ(32ビット) ; オフセット 16 00 00 00 == 0x00000016 ; 0x00000016 + ($eip == 0x80484a5) == 0x80484bb に飛ぶ 080484a5 <sub1>: 80484a5: b3 10 mov $0x10,%bl 80484a7: 88 d8 mov %bl,%al 80484a9: a2 a0 96 04 08 mov %al,0x80496a0 80484ae: fe c3 inc %bl 80484b0: 88 1d a1 96 04 08 mov %bl,0x80496a1 80484b6: e9 1d 00 00 00 jmp 80484d8 <post> ; ($eip == 0x80484bb) + 0x0000001d == 0x80484d8 に飛ぶ 080484bb <sub2>: 80484bb: b0 18 mov $0x18,%al 80484bd: b3 26 mov $0x26,%bl 80484bf: f6 e3 mul %bl 80484c1: 66 a3 b0 96 04 08 mov %ax,0x80496b0 80484c7: b3 15 mov $0x15,%bl 80484c9: f6 f3 div %bl 80484cb: a2 b2 96 04 08 mov %al,0x80496b2 80484d0: 88 25 b3 96 04 08 mov %ah,0x80496b3 80484d6: eb cd jmp 80484a5 <sub1> ; eb == 相対shortジャンプ(8ビット) ; オフセット 0xcd == 1100|1101 負数は2の補数 ; |0xcd|== 11|0011 == 0x33 ; ($eip == 0x80484d8) + (-0x33) == 0x80484a5 に飛ぶ 080484d8 <post>: 80484d8: 68 00 00 00 00 push $0x0
くだらんもの晒すなよ
デバッガ動かしていて、レジスタの値が変わっただけでハァハァしていたものだが
レジスタが変わるなんて日常ちゃはんじ(←なぜか変換できない)だろ
>>792 日常茶飯事
× ちゃはんじ
○ さはんじ
プ
えー。本日も コピペ物を公然と陳列しようと思ったのですが、 そろそろスリッパが飛んできそうなので、 打ち止めにします。 あえてつけ加えると 晒したモノに使ってるものが、 ハードウェア以外、ぜんぶオープンソースもの である、という点が味噌でした。 OS: FreeBSD マクロアセンブラ: nasm リンカ: ELF形式 + ld + libc.so.5, crt1.o デバッグ: gdb,binutils(readelf,objdump) 追加情報: "The Art of Assembly Language" というPDF文書 (wwwで公開されていて、aoa.pdfという呼称で通っているらしい) の"System Organization" "Memory Layout and access" の章あたりに 80x86 のハードウェアに特化した詳細な説明があるようです。 さぞかし難解なのだろう、と思って"拾い"読みしてみると アセンブラ以前の、データ表現、論理演算 などを、まるまる1章使って根本から説明してあったり、 インテルのマニュアルよりも 敷居が低くなるように工夫してあるようです。
オプソ厨ほんま気持ち悪い。 消えろ
おれも惣思う 乞食かよおめーらは
オープンソースという理念は 日本においても大昔からある。 岩波文庫のいちばん最後の頁 読書子に寄す 岩波茂夫 昭和二年七月 を参照
いや、話の流れとは全然関係ないし
オプソ厨=電波 なので、あんま相手にしない様に。
>>798 こういうこと書くからウザイって言われんだよ、オプソ厨
わかんねーかなプゲラ
>>791 カーネルドライバのDbgPrintにセレクタの値を入れてハァハァしたもんだが。
下位2bitが0でとってもハァハァでした。
804 :
デフォルトの名無しさん :04/01/24 01:14
804 リナクスが速そうだが面倒臭そう 素人意見ですが 実際どうなのですか
>Linux では たくさんあるシステムコールの引数に >それぞれ何を与えたらいいのか?の情報も乏しい。 オマエだけ
>>804 結局Windowsが一番楽。
普通の関数と同じ様にstdcall形式で呼ぶだけ。
可変引数のAPI(こちらはcdecl)以外は当然pop不用。
情報も豊富、ヘルプも充実。
かたやUNIX系のmanなんか読みずらい・クリップボードにコピペできない
(そもそもクリップボードという概念さえない)・あてにならん
で最悪の選択。
そもそもXじゃまともなGUIアプリさえ作れない始末。
それじゃコンソールだとどうか?というと、はるか昔にうち捨てられた
意味不明なtermcapやらを強いられる。どうみてもデベロッパやる気ゼロ。
比較するのが可哀相。
ハハハ、その通りだ・・ そもそもgasがAT&T形式を採用した時点で負け犬の道を辿ることは必至だった。 GNUは変人の集まりで、上辺だけの進歩しかない。ストールマンはイかれている。 いくらオプソでソースの見せ合いっこしても、所詮アウトローにしか受けない。 UNIXは負の遺産を抱えすぎたのさ。
またGNUとUNIXの区別もつかないVB厨が涌いているのか コモンコントロールのおかげで標準環境でも相当楽ができるとはいえWindowsでもGUIは結構面倒くさいぞ
そこでBeOSですよ。 っつーか俺らスレ違い。
アセンブラプログラミングにOSもツールも関係ないだろ とか言ってみる。
しかしすべてアセンブリ言語で書く場合WindowsならCreateDialogIndirect一発でしょぼいGUIアプリを作れるな
ハァ?システムコール使わんのか
>>812 ゼロから書くのが本物のプログラマだろ。
OSやビルドツールなんてものに肩入れしてるようなのは半人前。
しかし、最低限バイナリエディタは無いと辛い。
気でRAMに書き込む
>>813 違う、目的の物を意図した通り完成させてこそプログラマだ
製作手段は関係ない。
>>816 > 製作手段は関係ない。
プログラム書かない奴は、普通プログラマと言わないと思う。
プログラム書いて解決する方法と、書かないで解決する方法があって、 それを適切に選択できるのであれば問題ないと思う なんでもかんでも書くというアフォは趣味だけにしてほしい
819 :
デフォルトの名無しさん :04/01/24 17:52
高級言語の皮をかぶったアセンブラ
>>815 面白いな。 PowerON時のゴミが特定のコードの並びになるまで電源オンを繰り返すわけか?
それとも北朝鮮からプルトニウム貰って来てパソコンの横に置くのか?
いや、シナンジュだろ。きっと。
∧||∧ ( ⌒ ヽ ボクのお兄ちゃんはICの端子触った時の抵抗でメモリ書き換えできるYO ∪ ノ ∪∪
誰かさんのおかげでスレが台無しだ。これだから・・・
824 :
デフォルトの名無しさん :04/01/24 21:53
UNIXが(随分前から)変な方向に行っているのは分かる気もする というよりも未だにシリアルコンソールみたいな時代錯誤デバイスに気を使いまくっているのがあきらかにおかしい BeOSとかPlan9とかのほうが明らかに時代を先駆してるよなぁ UNIXは逝ってヨシかもなー
完全にスレ違い。お前が逝ってヨシ。
NASM使いのガイジンに聞いたほうが早い 自身持ってNASM使えるぜ!ってやつはここにいなさそうだし
>> 多分無理。NASMのTODOのfeatureとしてあがってた気がする
831 :
デフォルトの名無しさん :04/01/28 00:03
以下は nasm 用に書いたつもりだが、これを tc 2.01から far call すると、こける。一応 キー入力のところまでは 動いているがこれ以降は帰らぬ人となる。込めんときぼんぬ。 segment code align=16 class=CODE _xxx: pushaw push ds push ss mov ax, data mov ds, ax mov dx, msg mov ah, 9h int 21h mov ah, 8h int 21h ;mov ah,4ch ;int 21h pop ss pop ds popaw retf
しまつた、先頭部分が抜けていた。 global _xxx segment data class=DATA msg db 'hello, world$'
tcがないんでwatcomで動かしたけどOK Cの呼び出しを確認汁 extern void far xxx(void);
ひとまず、 segment code align=16 class=CODE _xxx: retf で確認してみたら?
int 21hが3発もあったら、21h掛かったときの帰りアドレスとIFレジスタ値(割り込みレジスタ値)がスタックポインタに交互に3個溜まってるジャン。(w 1個retfして、スタックはLIFO(後入れ先出し)だから最後のINT21で退避したIFレジスタ値とret-address(へ戻し)は復帰するけど、IFレジスタ値がスタックに2個残ってるからIFレジスタロックされてて割り込み掛かりっぱじゃないの。
>>835 が何を言いたかったのか理解できない(´・ω・`)
気を取り直して・・・! pushaw push ds push ss はスタック退避させてて、その状態で、movでアクセスできるの。 INT掛かる前にスタック入れてるから、底にあって、先には取り出せないし・・・(LIFOだから) 別に領域にワークメモリ確保した方が良いんじゃないかな。
>>838 んン?ゥギャ===!
事故レス自爆レス。
aw,ds,ssは値だけスタック退避してるから、
後のmovで弄ってるのは、新たな値なだけだ、退避値とは関係ない。
ただし、movで煽った値は退避してないから、INT21の割り込みルーチンで変えられる可能性あるよ。
アボ、ぼぼぼぼぼ、グモ・・・。
アセンブラの前に日本語を勉強しよう
_, ._ ( ゚ Д゚) ガシャ ( つ O. __ と_)_) (__()、;.o:。 ゚*・:.。
tcだからax, dxは壊してもいいんだよ
>>845 そこ。知ったばかりの言葉を得意げに使わない
離縁と乱と(´・ω・`)
>>844 >>835 ,
>>838 は完璧に忘れてください、何の筋道もなく、デタラメです、スーパー誤爆です。
悩ましてスイマセソ・・・。
>>839 に関しては自分では誤爆でないつもりでしたが、
>>843 そうですか、21のベクタテーブルでCALLされるとび先の割り込みルーチン内で壊してもよいのですか。なるほど。
キミint 21hが何する割り込みか知ってる?(´・ω・`)
追加ですいません。 確かに、mov ah,〜はINT21ファンクションコールでのルーチン上で読まれるAHレジスタ→この値で更にCALLして場合分けでした。 調べてみたところ AH 08h 直接コンソール入力 09h 文字列の出力 04h 補助出力装置から1文字出力 でした。
>>848 おかしなとこがあったので・・・。
>21のベクタテーブルでCALLされるとび先の割り込みルーチン
CPUが割り込みうけると、現在のCS(セグメントレジスタ) 、IP(オフセットアドレス)をスタック退避、
IFレジスタ(割り込みレジスタ)の値もスタック退避させると同時に、IFレジスタを下位に対して割り込み禁止に設定。
CPUが21のベクタテーブルのセグメントとオフセットアドレスを読み込み取得して、CSとIPにセット、これをプログラムカウンタに流し込み、セットされた割り込みルーチンにジャンプ。(従ってこの部分はBIOSのCALL命令ではない)
で構わないですよね?
>IFレジスタ(割り込みレジスタ)の値もスタック退避させると同時に、IFレジスタを下位に対して割り込み禁止に設定。 この段階でかなり勘違いしてる。IFレジスタなんて初耳(´・ω・`)
INT命令を実行するとベクタテーブルからCSとIPを読み取るのはOK 保存するレジスタはフラグレジスタ・CS・IPの順番にPUSHされる。 フラグレジスタの中にIF(割り込みフラグ)がある。IFレジスタという単独のレジスタはない。 x86の割り込みには上位下位という概念はないので下位割り込みがマスクされる事はない。 リアルモードの場合は無条件で割り込み禁止になったかも(←なぜか自信ない) こんな感じかな(´・ω・`)
>>854 あぁぁぁぁ、なるほど、たいへんに有難うございます。
割り込み番号に対してIDT(割り込みベクタテーブル)は物理アドレスの0番から2ワード単位で割り当てられているので
INT21の場合に、CPUがプログラムカウンタに流し込むアドレス、すなはち、割り込み処理ルーチンアドレスが書かれてるIDT上の読み込みアドレスは、
21×2FFFFF=####:####(CPUが計算)となる。
という理解で良いですよね。
_, ._ ( ゚ Д゚) ガシャ ( つ O. __ と_)_) (__()、;.o:。 ゚*・:.。
正直に言え。出身国はどこだ。年齢は。 日本にきた目的は。
>>855 へ事故レス
あぁ、とんでもないこと書いてしまった・・・。
CPUが計算するアドレスは
21×4=####:####です。
いかがなモンでしょうか、ご評価のほどを・・・(汗焦;;
859 :
名無し@沢村 :04/01/28 17:30
ちなみに、INT21のIDT上のベクタ書かれてると勝手に思ってる INT21×4=84〜(あってるかなぁ)をメモリダンプしたところ C:\>debug -d 0000:0084 0087 0000:0080 A0 04 97 0F -d 0000:0080 0087 0000:0080 92 49 FF FF A0 04 97 0F -q C:\>exit でした。INT21の実際の割り込みルーチン書かれてるのA004:970F(物理アドレス???)でいいのかなぁ。
バイトオーダーについて個一時間勉強汁(´・ω・`)
ヴァ〜〜〜、ごめんなさい、違います違ってます。 DOSファンクションコールINT21がメインメモリ領域A004:970Fにあるわけないですゥ〜。 DOSのシステム領域は0000:0500〜0009:ffffの640Kにあるはずですからして・・・(ry いったいどこにあるんだろゥうううう・・・、ドテッ。 ヴァヴァヴぁヴぁぼぼぼぼ〜〜ん・・・・。ガクッ。
>>857 に答えたら教えてやる。が、その前に
>>862 にも激しく勘違いが含まれてるので、それも
直せ
>>854 > リアルモードの場合は無条件で割り込み禁止になったかも(←なぜか自信ない)
SWの割り込みでは禁止にならない
あっ!とりあえずINT21×4=84の間違い見つけました INT0〜20の21コ×4BITE=54hでINT21は55h〜58h。 C:\>debug -d 0000:0055 0058 0000:0050 00 5D D0-20 -q C:\> で後ろがセグメントで、エンデアンするからINT21の割り込み処理ルーチンはD020:005D。 でも、D020:005DはメインメモリでDOS領域じゃないし・・・。
どういう発想でそういう計算になるんだ?(´・ω・`)
あっ、エンディアン違いますね。
アドレスは20D0:5D00ですね!でもDOS領域には変わりない・・・。ショボ。
>>868 ごめんなさい・・・。全然駄目駄目です・・・。
>>869 訂正
>でもDOS領域には変わりない
INT21の割り込み処理ルーチン20D0:5D00は
DOS領域ではないことには変わりない
~~~~~~~~~~~~~~~
デス。
>>869 でも、INT21がインストラクションレジスタに入って、CPUが21だけ取り出してアキュームレータに入れて、ALUで計算させて、それをIDTのベクタ参照アドレスとしてプログラムカウンタに突っこんで、IDTのアドレス指して、
そこから割り込み処理ルーチンアドレスの値を抽出だと思うんだけどなぁ。
その計算の仕方が分からない・・・。
スイマセンデス・・・。トホホ・・・。
スイマセンです。
2個目の>869は
>>868 へ訂正です。
仮想86モードで動いている時は、素直にINT 21Hを実行 してくれんよ。Windowsに内蔵しているモニタでエミュレート する。割り込みベクタのアドレスならIntelのPDFを見たまえ。
>>867 > INT0〜20の21コ×4BITE=54hでINT21は55h〜58h。
もう少し落ち着いて考えろ
>>833 >>834 ども。合理的なアドバイスありがとございました。
>Cの呼び出し
オリジナルは
void far xxx();
だったのを指摘された形で行ってみました。
>_xxx:
>retf
>で確認
行ってみました。
残念ながら結果に変わりはありませんでした。
で、結果的にはヒンシュク買いそうですが、コンパイルの仕方に問題が
あったようでした。
Cのコンパイルは tc の統合環境で obj のみ作成して、これでコンパイルが通ったら
コマンドで tcc c.obj xxx.obj で exe 作成してました。それを、
tcc c.c xxx.obj でやったら、症状がなくなりました。
お騒がせしました。
(*゚ー゚) じー
自分も分かりまスタ!がしかし・・・ C:\>debug -d 0000:0024 0027 0000:0020 65 00 5D D0 //キーボード -d 0000:0028 002b 0000:0020 14 1A 00 F0 //未使用 -d 0000:002c 002f 0000:0020 14 1A 00 F0 COM2 -d 0000:0030 0033 0000:0030 14 1A 00 F0 COM1 -d 0000:0054 0057 0000:0050 54 00 5D D0 //INT21ファンクションコール -q C:\> COM1,2の処理がF000:1A14で同じなのでこれでよいかと。 INT21はD05D:0054になるわけですか・・・。 -u D05D:0054 D05D:0054 9C PUSHF D05D:0055 80FC4F CMP AH,4F D05D:0058 7504 JNZ 005E D05D:005A 2E CS: D05D:005B A26400 MOV [0064],AL D05D:005E 9D POPF D05D:005F EAE64BF505 JMP 05F5:4BE6 E64B:F505に飛んでますね。 E64B:F505 06 PUSH ES E64B:F506 7032 JO F53A E64B:F508 CB RETF あれ〜、RETFって、これだけで割り込みから戻っちゃうの? アドレス計算ちがうかな・・・。それともcomモードだと、何か違うかな。欝だ、氏・・・。
↑違ってますね。 >E64B:F505に飛んで 05F5:E64Bでした。 05F5:4BE6 3D0049 CMP AX,4900 05F5:4BE9 7508 JNZ 4BF3 05F5:4BEB 32DB XOR BL,BL 05F5:4BED 32E4 XOR AH,AH 05F5:4BEF FB STI 05F5:4BF0 CA0200 RETF 0002 05F5:4BF3 2E CS: 05F5:4BF4 FF2E4A34 JMP FAR [344A] AXレジスタに4900入ってる条件付ですが344A:05F5にFARCALLしてます。 それ以外はBL、ALを0にして割り込み解除してます。4900の意味は分からないですが・・・。
少しもちついたほうがいいよ(´・ω・`)
もう止めた方がいいんじゃないでしょうか? 16進の計算も出来ないようですし
881 :
デフォルトの名無しさん :04/01/29 19:31
>>880 ありがとう!ありがとう!!ほんとありがと!!!
てことで、早速見てみました。
INT21ファンクションコールその実体!
C:\>debug
-d 0000:0084 0087
0000:0080 A0 04 97 0F//IDTの参照アドレス
で0F97:04A0見てみました。前述キーボードも含めてDOSではな<<872さんが「Windowsに内蔵しているモニタでエミュレート」
するとおっしゃっているようにWINが代行してるみたいです。
では、実際の割り込みルーチンどうぞ!↓
-u 0f97:04a0
0F97:04A0 80FC72 CMP AH,72
0F97:04A3 733E JNB 04E3
0F97:04A5 2E CS:
0F97:04A6 F606350002 TEST BYTE PTR [0035],02
0F97:04AB 7420 JZ 04CD
0F97:04AD 2E CS:
0F97:04AE F60635000C TEST BYTE PTR [0035],0C
0F97:04B3 7418 JZ 04CD
0F97:04B5 2E CS:
0F97:04B6 F606350004 TEST BYTE PTR [0035],04
0F97:04BB 7508 JNZ 04C5
0F97:04BD 2E CS:
0F97:04BE F606520101 TEST BYTE PTR [0152],01
2WORDしか出てませんが、見事にCMPでAHをチェックして、その後のBYTE PTRでオフセットアドレスずらして順次チェックしてます!
ここ変えれば、INT21+AH値で割り込みかかるIF変えられるんだなぁ。シミジミ・・・
さらにこのジャンプ先JZ,JNZの内容変えれば、新しいI/O作ったときのの割り込み時の動作変えられるんだなぁ。
ウザイヨー
883 :
名無し@沢村 :04/01/29 22:46
↑ネタ?
>>883 宣伝?
変な書き込みが続いてるけど割り込みの逆アセンブラリストは自分の
ところではこんな感じ。(DR-DOS on DOSEMU)
-d0:84 l 4
0000:0084 96 05 9F C8 ....
-uc89f:0596
C89F:0596 80FC0D CMP AH,0D
C89F:0599 7421 JZ 05BC
C89F:059B 80FC3F CMP AH,3F
C89F:059E 740A JZ 05AA
C89F:05A0 80FC4B CMP AH,4B
C89F:05A3 7434 JZ 05D9
C89F:05A5 EA39100001 JMP 0100:1039
C89F:05AA 0BDB OR BX,BX
C89F:05AC 75F7 JNZ 05A5
C89F:05AE 1E PUSH DS
C89F:05AF 2E CS:
C89F:05B0 8E1E1200 MOV DS,[0012]
C89F:05B4 803E6C0205 CMP BYTE PTR [026C],05
違いますね。
886 :
デフォルトの名無しさん :04/01/29 23:29
>>885 なるほど〜。CMPでAHレジスタの値チェックしてフラグの立て立てないして、次のJPでZフラグ見て条件ジャンプ。これが続いてる。
>>876 のシリアル割り込み時の飛び先アドレスF000:1A14での割り込み処理ルーチンをたどって解析してみたが、
DMAのホールド(使う使わないに関わらず動かさないためか。)とチップセットの割り込みレジスタ読み込み・設定しかしてないようだた。
すなはち、読み書きコードはプログラム任せのようだ、当然ちゃ当然だな。
887 :
デフォルトの名無しさん :04/01/29 23:58
↑のつづき。 ということは、送るときはこちらが主導だから良いとして、受けるときは INT0BhあるいはINT0Ch(外部でも内部でも同じ)の割り込み着てるかどうか、別にドライバ等で定期的に確認しないといけない訳か。 でも割り込みベクタアドレス、割り込みルーチンアドレスは一瞬で変わるから、他で見ないといけない訳か。 定期的にデータ着てるかレジスタスキャンしかないのかな。(OSのデバイスドライバはこうしてるか?)ステータスレジスタ等で判断する方法はないのかな。
とりあえず、何をして 何に至ろうとしているかだけでも 説明して欲しいなあ>int 21h を解析して報告してる皆さん
intなんてもういいだろ。 今はsysenterでっせ
CALL 0005H
アセンブラでHello worldを書きました。 が、なんでファイルサイズが484バイトもあるんですか? stripしたサイズがこれです。 ELF形式のヘッダー込で200バイトくらいにならいんでしょうか?
MOV 斧,棒
>>891 UNIX USER連載「GCCプログラミング工房」
第1回 (2001.12)、第2回 (2002.1) を読め。
211バイトだったそうな。最小 Hello, world!。
ELFヘッダーとPE,NEヘッダーを解析しようぜ!? とりあえず日本語の資料ない?
資料程度の英語も読めない香具師にプログラマは_
鳥取砂丘タンがこのスレで初めてカコイイことを言いました
∧||∧ ( ⌒ ヽ 今までカコワルカッタのかYO ∪ ノ ∪∪
ヽ(`Д´)ノ
>>888 モニタ作成です。
>>887 のシリアル割り込み(外部:IRQ3(ベクタ番号:00001,011=0bh)、内部INT0bh)に関して
>割り込み着てるかどうか、別にドライバ等で定期的に確認しないといけない訳か。
の確認方法は、DOSのINT21のようにAHレジスタ値を確認。もしくはINT21を使って処理もそれに乗る。
あるいは、シリアルドライバ(チップセットに内臓か)のIIRレジスタ(I/Oアドレス03FA)の確認。
IIRは、b7b6000110が受信ラインステータス(オーバーラン、パリティエラー、フレーミングエラー、ブレーク割り込みが発生)
b7b6000100が受信データ有効(データ受信した)
b7b6000010がTHRエンプティ(THRレジスタ(送信ホールドREG)空)
b7b6000001がなにもなし
を使えばいいのかな。b7b6は16450/16550モードでそれぞれ違って16450のときは00、16550のときは11になる。(おそらくControlPinのPullUp、PullDownで決まるのかな)
ちなみに自分のPCでは
C:\>debug
-a100
2389:0100 MOV DX,03FA
2389:0103 IN AX,DX
2389:0104
-G=100 104
AX=FF01 BX=0000 CX=0000 DX=03FA SP=FFEE BP=0000 SI=0000 DI=0000
DS=2389 ES=2389 SS=2389 CS=2389 IP=0104 NV UP EI PL NZ NA PO NC
2389:0104 B91A00 MOV CX,001A
-q
C:\>
だったので、AX=FF01でFFを切り捨てて、01(なにもなしモード)だから、16450モードでb7b6=00の模様。
とりあいずDOSのシステムコールに割り込みベクタ扱うファンクションがあるからそれ使っとけ(゚听) ターゲットは当然生DOSだよね?
>ターゲットは当然生DOSだよね? WIN CEなんですが・・・。生DOSじゃないと、な、な、何か・・・;(汗焦;;
ターゲットがCEならおまいのやってる事はほとんど無駄になるような・・・
あ、もしかしてシリアルのターゲットがCEでモニタがDOS?
>>904 はい(^^、そうです!
いかがでしょうか!
普通にターミナルソフト使うんじゃダメなん?
WinAPIでもシリアルを十分細かく制御できると思うが
908 :
デフォルトの名無しさん :04/01/30 14:20
>>907 あっ、はい。それも考えてます。
Winの底で同期シリアルのスタートビット、ストップビット、SYNコード、HUNTコードの送出をどうしてるのか分からないもので・・・、
PC側Target側ともVC++インラインアセンブラか、.txt→.asmに拡張子書き換え→アセンブラコンパイラのハンドアセンブルでTargetのドライバ作りHYPERTERMINALでやろうかと・・・。ターゲットが生生なシリアルドライバ入ってない物でして・・・。(^^;
>>908 > 同期シリアルのスタートビット、ストップビット、
ネタなのかアフォなのかはっきりしてくれ。
>同期シリアルのスタートビット、ストップビット すっ、すいません。 この2つは、シリアルドライバ間で使用して、CPUには関係ない部分だからソフトにも関係ないですね。(^^;
16550は非同期だけだろ
>16550は非同期だけだろ あ、そ、そういうわけですか。;; 失礼しました。 てことは、SYNコード、HUNTコードも関係ないですね。(^^;; ドライバがTxRDY-RxRDY確立すればどんどん垂れ流しでデータ来ますね。
… ひょっとして仕事?
人の前だから、あせっちゃうんでしょうね。 勝つところ見せたいだろうし
ごめん!
sysenterって本当に速いの? int萌え〜
従来のセグメンテーション保護を無視した素敵な仕様だから それなりに早いはず
919 :
デフォルトの名無しさん :04/02/03 12:25
アセンブラとはちょっと違いますがお願いします。 cmovbでSIGILLを受け取っているっぽいのですが、 この命令はPentiumのどのバージョンからサポートされて いるんでしょうか?
PenPro
そういやCPUIDにフラグなかったっけ?
>>917 WinXPで、int2Ehとsysenterで(何もしない)ファンクションコールの
呼び出し時間を比較したことがあります。
intの方はキャッシュさせない状態で約3400clock、キャッシュさせて約2000clock
sysenterは同じく2100clock、1350clockでした。
測定に使ったコード↓ //int mov eax, 0x2000 int 0x2e //sysenter mov eax, 0x2000 mov edx, 0x7ffe0300 //SystemCallStab call edx
far call ト sysenter ドッチガハヤイ?
926 :
デフォルトの名無しさん :04/02/04 18:25
質問です。 今の時代でもアセンブラ覚える意義はありますか? 当方、BASIC、C/C++ とやってきましたが 最近のコンパイラは性能が良く、最適化はコンパイラに任せた方が良いと聞きます。 それでも今からアセンブラを覚えるメリットはあるのでしょうか? 当方は組み込み用途では一切コーディングしませんし、Winでしかコードは書かないと思います。
>>926 知っていればデバッグする時に便利な事もあります。
>>926 別にアセンブラ=最適化でもあるまいに。
ハードの知識が足りないと思うならかじっとくべきだよ。
>>926 そういう趣旨は10年前からずっと言われてる。
本物のアルゴリズムも、神のアセンブラ最適も知らない
無学の輩
コンパイラがする最適なんぞ、人間は息をするかのように
自然にこなすものだ。
>>925 far call→retf戻りの処理時間、1800clock、キャッシュして1600clock。
sysenterはジャンプ先でいろいろやっているので、それを考慮すると
命令自体の速さはsysenterが一番速いと思う。
ブル-スクリーン1回やってしまった。
組み込み系の事は素人なんだけど
>>926 「当方は組み込み用途では一切コーディングしませんし、 」
これって、どうやってCPU動いてんの?出来合いのプログラム
つっこんでるって事かな?
>>931 Embedded-Windows があるでしょうに。
>>926 意義はあります。
まず、ローレベルデバッグの必要性が生じたときに助かります。
次に、プログラミング・パラダイムが豊かになります。
低次元で何が行われているかを知っているかどうかで、
プログラミングのスタイルもより洗練されるでしょう。
例えば、現在主流のSIMDアーキティクチャ(IA-32も、PowerPCも、CELLもそうですね)
では、並列実行を常としますが、コンパイラの吐くコードがどういう風に並列化されているか
見てみるのも、勉強になると思いますよ。
「〜しかしないから、これは覚える必要がない」
というのでは、進歩がなさ過ぎると思いませんか?
>>926 意義は無いがメリットはある。
こんなチマチマしたモノを覚える時間で別の言語でもやれば?
>>926 高級言語を使うときでも
何をすればプログラムが遅くなるか、速くなるか、などの
見通しが付きやすくなる。
あとは、逆汗解析したい時には必須かな。
アプリケーション層だけど、ハード直接アクセスのドライバ書くときも必須です。 インラインで埋め込まなくてはなりません。
940 :
デフォルトの名無しさん :04/02/05 18:59
おいおい。
943 :
名無し@沢村 :04/02/05 23:21
ここも沢村がきてからすっかり糞スレになったな
と言うわけで、
>>950 は早々に次スレを立ててくれ。
> (*´д`*)アハァ… これは確定なのか・・・?
950 :
名無し@沢村 :04/02/07 21:14
よりによって沢村が950かよ・・・
特令により
>>952 にスレ立てを命ずる。
沢村は帰っていいよ
Σ(゚Д゚||) がんがってみます・・・
乙(*´д`*)アハァ…
早くも沢村が・・・_| ̄|○
>>950 <BODY onresize=ResizeWindow(); leftMargin=0 rightMargin=0 topMargin=0 MARGINWIDTH="0"
MARGINHEIGHT="0" bgcolor="CCFFCC">
なんでマージンが全部ゼロなんだ。ハァ?
960 :
名無し@沢村 :04/02/08 23:10
ザコのおまーらよ、言語は何やってる?
C言語?C++?Java?VB?COBOL?HSP?ふっ…おまーらって、ホントザコだな。
おれはE言語やってるね。
おまーら、D言語ってのは聞いたことあるが、E言語って聞いたことないだろ?
おまーらよ、E言語ってのはな、「executive language」日本語に訳すると「実行可能言語」だよ。
まあ、ぶっちゃけ、早い話がマシン語のことなんだよ。わかる?
おまーらよ、E言語はまたの名を「実行可能言語」とか「実行ファイル記述言語」とか呼ばれるよ。
それにしても、E言語ってすげー命名だな。命名者はおれだぞ!このおれだ。
おれはもしかして、E言語の祖と呼ばれるようになるかもしれないな。どうよ?
http://hp.vector.co.jp/authors/VA015412/
なぜ沢村とかいう人は嫌われているの? このスレを見る限り、あまり悪い印象はないんだけど。
どうか他のスレや板も見てから判断してください
このスレだけでも充分わかると思う
× E言語 ○ アセンブリ言語
それはマシン語ではない。
>>962 俺は別に嫌いじゃないぞ。
……なぜ評判悪いかは普段のレス見てりゃ何となく分かるけど。
粘着荒らし野郎という訳ではないから比較的無害な方。
あと、最近そこら中で宣伝してるマシン語のページは悪くはないと思う。 しかしあの嫌がらせとしか思えない文章とデザインはどーにかならんのだろうか。
ただ、根本的に、「マシン語(機械語)」と「アセンブリ言語(アセンブラ)」は違う ということをわかってないようだが。
今時16bit DOSのアセンブラで > ここは世界初のマシン語完全解説サイトになるかもよ。楽しみにねぇ♪ って言われても・・・ Win32でアセンブラならもうちょっと評価してやらんこともないんだが。
>>969 俺は、マシン語とアセンブリ言語は同じだと思うけど。
マシン語に直すのをアセンブルっていうわけだから・・・。
確かに、プログラミングするときは.txtで書いて、拡張子を.asmにしてコンパイルするわけで、プログラミング段階で.asmファイルだけど。
でも、プログラム言語はニーモニックでしょ。
マシン語はマシン語の文法があるわけで。
マシン語ってのは2進数(16進数で表記されることが多い)の羅列ですよ。 ソースをアセンブル/リンクした結果がマシン語になるんです。 ソースをコンパイル/リンクした結果がマシン語になるんです。