アセンブラ… (゚д゚)ウマー

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
アセンブラ全般に関するスレッドです。

全スレ
アセンブラヽ(`Д´)ノモルァ
http://pc2.2ch.net/test/read.cgi/tech/1040297337/

全々スレ
アセンブラヽ(`Д´)ノモルァ
http://pc2.2ch.net/test/read.cgi/tech/1016991911/

全々々スレ
アセンブラ… (・∀・)イイ!
http://pc2.2ch.net/test/read.cgi/tech/1002267809/
Z
31:03/08/15 18:20
誰もいないんで自分で 3ゲトー!

ついでにage
4メモ帳:03/08/15 18:31
>>1
案外はやってるんだね。このスレ。
6Seisei_Yamaguchi:03/08/16 22:32
Linux Zaurusでアセンブリプログラミング
http://www.nk.rim.or.jp/~jun/slasm/arm_idx.html


萌え .
アセンブラってなんですか
>>7
Pentium5用命令セットのコードネームです。
あせばんだぶらじゃー
>>6
レジスタ多いね。
ARMのオペコードクロック表と、
インストラクションコードの変換表ってどっかにない?
gccでVC++のcodファイルに相当する出力が吐ければ当面はいらないんだけど・・。
アセンブラ… (;´Д`)ハァハァ
特定のCPUでサポートされない命令があったら
どうなるの?
スケーラビリティを求めるな。
14デフォルトの名無しさん:03/08/16 23:33
洋書でお勧めのものありますか。ターゲットはx86、Linuxです。
156:03/08/17 00:17
>>10
>>6で紹介されてるpdf にはないみたいだな
166:03/08/17 00:47
すぐそばにあった . 変換表もどき .
http://www.peter-cockerell.net:8080/aalp/html/frames.html
の Instruction Set .
>>16
おおサンクス!
これさえあれば十分だよ。
やっぱ後発だけあって命令体系がすっきりしてる。
リナザウ買う目的が出来た(w
186:03/08/17 01:39
チョト前のインタフェース誌の arm特集 もええ感じ .

cmagaでゲボアドバンスソフト開発記事が連載されてるみたいだけどそっちはどうよ喪まいら ? .
>>18
TCP/IPが使えるようになったらGB2CHを作ってみたい。
20デフォルトの名無しさん:03/08/18 20:12
>>6は創価学会員
21デフォルトの名無しさん:03/08/18 20:27
aseg
22デフォルトの名無しさん:03/08/18 20:28
すまぬ、ちょっと聞きたいのですが
pc9801の古いパソコンを持っていて、これに搭載されているCPUがi486sxなんだ。
これをフロッピーブートさせたいと思ったのだが、古すぎて資料が英語だった。
まぁ意地で読んでみているのだが、なかなか上手く進まないんだな。
んで簡単なものでもいいのだが、フロッピーブートさせるソースが載っているwebページ知りませんか?
>>22
今日はどんな業務をされたんですか?
>>23
それは聞かないって約束やったやろぅに
>>22
FreeBSD(98) とかのソース見ればいいんじゃねーの ?

ftp://ftp.jp.freebsd.org/pub/FreeBSD/releases/pc98/5.1-RELEASE/src/
単にIPL書きたいなら、秀和の本でも探して読めば?
98のブート情報なんてググルでくさるほど出てくる
と思うんだが。

実際出てきたし。
だったらその一つでも示してやりゃいいのにね。
>>28
負け惜しみ、と。
で、結局示せないと...。
そういえば昔、IPLにCPUと機種を判別するプログラム書き込んで
PC88とX1とFM7でマルチブート(?)させてる土人ソフトがあったなぁ。
Z80と6809のマルチブートは燃えるな
3327:03/08/24 19:20
しょうがねぇなぁ・・・ググルも使えねーでアセンブラなんか
無理だからやめとけ

FreeBSD(98)のソースじゃ量が多すぎるからGRUB98の
ソースがいいだろう

さて示したが、>>30 君は何をしてくれるのかね?
>>33
体で奉仕しますが何か?
>>33
ぷぷっ、1日半も必死になって調べて GRUB98 だけかよ...。
(まあ、「くさるほど出てくる」と言うのは不問にしてやろう、これ以上は無理そうだしね。)

> さて示したが、>>30 君は何をしてくれるのかね?

俺は >>28 で「示してやればいい」と言ってるだけだけど ? 日本語も読めないヴァカですか ?

>>27 か、>>29 の時点で示せてればいい人になれたのにね。(藁
>>35
まぁ、頑張ってくれ。
そもそも>>25で十分じゃないか
他にもそれに類似のものでいいならいくつか見つかるけど、
そんなん並べても無意味。腐るほど出てくるってのも過言じゃああるまいよ。
もういいよ、
> 腐るほど出てくるってのも過言じゃああるまいよ。
って言うだけならいくらでもできるしね。
なんでメル欄?この板らしくないな
>>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
>>22
MS-DOS3.x用のIPLなら。
http://www.h4.dion.ne.jp/~sizzy99m/IPL3.ASM.txt
10年以上前に書いたものだから、動くかどうか不明ですが。。
勝手にDOSをインストールさせる変な機能付き。

>>31
X68000とPC9801のデュアルブートを見たことある。
>>49
ここの人のやつ?(ページないに等しいが)
ttp://hp.vector.co.jp/authors/VA001325/
5149:03/08/28 03:02
>>50
IPLは自作。
デュアルブートのは、当時同人ソフトだったよ(クトゥルフを題材にした探偵もの)。
5249:03/08/28 03:10
当時=13年ぐらい前。
>>47
環境?
54デフォルトの名無しさん:03/08/28 22:07
>勝手にDOSをインストールさせる変な機能付き。

まるっきりウイルスのメイン機能ではないか。
5549:03/08/29 01:28
>>54
「Bドライブにシステムディスクを入れてキーを押してください」とか出て、
指定ドライブにシステムディスクを入れないとだめだけどね。
# 勝手にというのは誤りですね。

今読んでたんですが、かなりDQNなコードですね。。
>51
アナンデュールのホラー オブ クラウドウェルだね。
懐かしいな。SOLさん元気かね。
5722:03/08/29 22:16
南下俺のせいでものすごいことになってしまったようで・・・
まじで済まない。俺の無知のせいでここまでの議論になってしまったことは、俺の責任以外何者でもないと思う。
確かに俺はただの馬鹿だった。
>>27-39
悪かった。すべて俺が悪い。お前らはなんでもない。俺を煽れ。それで住むなら腐るほど煽ってくれ。
そして一般人となってくれ

そして参考資料ありがとうございました。
まだまだやらねばならぬことが腐るほどあることに気づきました。
それまでこのブートプログラムなどなどについては、保留しますが、参考資料保存させていただきました。
ありがとうございました。
本当にすみませんでした。これ以上言えない位、俺はあほでした。
だから闘争は止めてマッタリと話をしてください。

ムナシク逝く。ありがとうございました。
>>57



なんかまた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 命令は、大きいメモリ・ブロックを初期化する最も速い方法である。」
と書いてある。
6765:03/09/01 22:20
>>66
そうでしたか・・・

パイプライン化でストリング命令よりも単純な命令の組み合わせの方が
速くなってるとばかり思っていたのですが。
ストリング命令もまだ捨てたもんじゃないですね。
逆にAthlonではストリング命令はあまり速くないと思った。
どうでもいいけど漏れ、IA64のアセンブラのコード見てる・・・
アプリ開発やってて、コンパイラが発展途上(と漏れは思ってる)
なので、どのようなコードを書けば速くなるか、はき出された
アセンブラコード見てチェックしてる。
が、よくわからん。IA32に比べて判断が段違いに難しくなった気
がする。
他にIA64の仕事している人いる?
IA64ってまだあったんですか?
Intelも見捨てたんじゃなかったっけ・・・
NASMのDOS,COM形式で文字列を入力する方法を教えて下さい

mov ah,0ah
mov dx,buff
int 21h

とするのは分かるのですが
buffの部分をどうすればいいか良く分からないのです
>>71
buff db N     ; 入力可能な文字数
   db ?      ; 入力された文字数
   db N dup(?) ; 入力された文字列の格納場所

詳しく説明すると長くなるんで、↓を読め。
ttp://www.geocities.com/chaoh2000/board/function.txt
ttp://hp.vector.co.jp/authors/VA003720/lpproj/drdos/progdoc/sysprog/chap4j.htm
それで…PNIという新しい拡張命令セットはどうなの?
対応するのと非対応とでパフォーマンスに差がでる例とかありそう?

素人目にはさほど強力には感じられないんだけど、
バリバリのアセンブラプログラマの方にはどうなのでしょうか
7471:03/09/14 18:36
やっと解決しました
72さんの記法はMASM用で、NASMでは使えないみたいです

buff: db 11,0
times 11 db '$'

で上手くいきました
素人な質問で申し訳ないのですが、SSEでパック演算をするときにインテル
のドキュメントの例ではメモリのアドレス値をEAXに入れてますよね。
てっきりアドレス値はINDEXレジスタにいれるものと思ってたんですが。
でesi,ediに入れると数十倍も遅くなります・・・
これはそういう仕様なんでしょうか・・・
7675:03/09/15 20:56
すいません、ソースを点検しなおしたら私のミスでした(恥
てっきり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

みたいに、取り出して戻さないとだめだっけ?
79 :03/09/20 00:22
*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とか調べてみるといいかも。
コボラーに聞けば懇切丁寧に説明してくれるぞ。
8380:03/09/20 01:09
>>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 $
84 :03/09/20 01:44
なんの勉強だろう
>>80
DAAは直前の命令実行後ののハーフキャリーで動作が変わるということ。
直前の命令(LD 等フラグに影響しない命令を除く)が加算の時は、
(1)直前の命令でハーフキャリーがセットされているか又は下位4bitsが0?AH〜0?FHの時、06Hを加算する。
(2)直前の命令でキャリーががセットされているか又は(1)の結果キャリーがセットされたか又は
上位4bitsが0A?H〜0F?Hの時、60Hを加算する。

実際にエミュレータを作るなら、直前の命令が減算の時は動作が異なるしDAA実行後のフラグの状態
も考慮しないといけないので、もう少し複雑。がんばって勉強してくれ。
>>79
いちどレジスタに入れないとダメなんですか・・・
勉強になりました。
8780:03/09/20 14:35
>>85
ありがd。大体理解できました。
「初めて読む486」とかのCPU関係の本を読んで動作を勉強中です。
ただ、どの本も命令の結果フラグが変わるとしか書いていないので難しい・・・

>>84
CPUの動作の理解 & C++ & デザインパターンです。
初歩的な質問ですが、1バイトの量を割るにはどうすればいいのでしょうか?
http://www5c.biglobe.ne.jp/~ecb/assembler/assembler00.html
のページには
DIV SRC
でSRCが1byte,1word,1dwordで書いてあって、
4bitの場合は書いてありませんでした。

試しに
mov ax,4c4ch
div ch
としてみたらフリーズしました

時刻を
15:35:50
のような形で表示したいのです
89 :03/09/20 15:38
ちょっと親切な人がいたみたいだな。
教えてチャンわきまくり
>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してサイズ分足して後ろから
(逆だったかも)
103101:03/10/05 23:29
もう少し詳しく説明してほしいな
以下の4つの状況で4つのアルゴリズムが必要なの?

記号
○ ... src
a ...... dst
- ...... 無関係
@ ... オーバーラップしているところ

方向
←メモリの前方    メモリの後方→

状況A
○○○○○○○○○-------aaaaaaa

状況B
○○○○○@@@@aaaa

状況C
aaaa@@@@○○○○○

状況D
aaaaaaa-------○○○○○○○○○
104101:03/10/05 23:33
103だけど、srcとdstの領域の大きさが違ってた…
(○とaの数が違ってた)

同じ数だとして読んでね
A,Dは先頭からコピーしようが末尾からコピーしようが関係ない。
Bは末尾、Cは先頭からコピーしないとデータが破壊される。
図をよく見れば分かると思うが。
106101:03/10/07 20:34
それじゃ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
>>110
RDTSC命令。
>>110
ちなみにパイプラインを無視した単純なクロック数なら
http://www.intel.com/jp/developer/download/index.htm
内の
http://appzone.intel.com/scripts-util/download.asp?url=/jp/developer/jpdoc/ia32.pdf&title=IA-32+命令のレイテンシとスループット&fullpg=3&site=jp
からダウンロードできる。このページにはSSE2の応用例も
豊富にあるから参考になれば幸いです。
ここのページ見て思ったのですが

ttp://maccyo.hp.infoseek.co.jp/assembler/mado.txt

何故
test eax,eax
jz NEAR error
となっているのでしょうか?
MSDNによると失敗した時の返り値が0 or NULLなので、
cmp eax,0
jz NEAR error
とかのほうが簡単そうに見えるのですが、
何かまずい事があるのでしょうか?
>>115
ぐぐれ
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イメージなど)、
今はキャッシュに乗る確率を上げることが重要だな
123110:03/10/12 15:18
>>114
どうもありがとうございます。
>>115-122
そういう特定のアセンブラ(やCPU)に特化したエディタって無いでしょうか。

VC++はクラスのメンバを補完してくれたり、関数の引数や機能を教えてくれたりしますが、
そんな感じでレコードのメンバを補完してくれたり、
今の命令が何バイトになるか、
そのほかに同じことが出来る命令があるか(もちろんエディタが理解できる範囲でですが)、
後は命令のつながりを色で表示してみたり(パイプライン用)。

CPUもどんどん複雑になっていくし、
そろそろ(?)そういうのに頼ってもいいんじゃないかと思ったのですが。
>>124
作ってよ
>>124
Intel自身もアウト・オブ・オーダー動作やハイパー・スレッディングが
起きた時の正確なレイテンシは分からないと言っているくらいだから、
RDTSC命令でクロック数を測るしかないな。分岐予測などが働いた
際にはますます予想が困難になる。

WindowsならばQueryPerformanceCounter()もあるしな。
127デフォルトの名無しさん:03/10/12 19:51
アセンブラ用の構造化エディタとかところであるんでしょうか?
ないなら、これで未踏ソフトウェアに応募できたりして。
128124:03/10/12 20:00
>>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 系は" なんて書く意味がわからんよ。
無駄に荒れる前に貼っておこう。
http://www.genpaku.org/realprogrammerj.html
なにこのヒト
>>156
Windowsも複数のCPUで動くだろ?
漏れのはDualだぞ。
まあまあ。
多分実生活でつらいことがあってイライラしてるんだよ。
Alpha用のWinNTは・・・
PowerPCのも忘れないでクレ
CP/Mはなぁ、
gnuの書式は68kやってると、それほど違和感なかったり。
CP/Mなんて現存しているのか?
現存してるだろうが、使われているかは知らん。

俺の周りでは、MS-DOS 2.11 はまだ現役。
アセンブリ言語で製作されたWindows用ソフト(Vector登録分)

CPU情報取得ソフト
http://www.vector.co.jp/soft/win95/hardware/se171927.html

CDプレイヤー
http://www.vector.co.jp/soft/win95/art/se210568.html

メモリ開放ソフト
http://www.vector.co.jp/soft/win95/hardware/se221932.html

汎用プロセスメモリエディタ兼デバッガ
http://www.vector.co.jp/soft/win95/hardware/se254476.html

他にもあると思うが・・・
168147:03/10/14 00:11
NASMとBCCで無理やりインラインみたいなことできることを知りました。
どうもオブジェクトファイルをリンクするらしいですね。(半分意味分かっていないですが)
これってMASMからオブジェクトファイルを作ってリンクみたいなことってできるのでしょうか?
できるかできないかで充分ありがたいです。後は、ヤホーに逝きます。
まぁmasmに固執する理由は無いんだが、どうもmasmという響きが好きだ。
169デフォルトの名無しさん:03/10/14 04:11
x86でOPは
RISCふうの単純なマイクロコードに分解されるそうですが
このRISC風のマイクロコードってどういったものなのでしょうか?
やっぱりadd x xとかそういう命令表が別にどっかにあるのでしょうか?
特定企業の担当者しか答えられない(含企業機密関連)
質問はやめましょう。
fasmがたしかセルフビルドだったような
172759:03/10/14 12:05
>>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 バイトしかないから気をつけろよ。
179175:03/10/15 21:22
>>176
>>176さんの言ってる言葉が全く理解できないレベルです。
まだ大学一年生で今年から講習を受けています。
最初のほうの授業では「変数x、yを置いて四則演算を行え」と言った簡単な
問題が出てたんですが、最近は「12個の整数を入力して2x3と3x2の2個の
2次元配列a,bにセットし、axbを計算してその結果を2x2の2次元配列rに
セットし,ディスプレイに出力せよ.ただし,冗長計算を避けるため,
Cプログラムにコメントで示すインデックス計算を該当ループ内ですること」
といった問題になってきています。今までパソコンなんてホームページを
見るといったことぐらいしかしてないので、ヒントでC言語で書かれた
プログラムが載っているんですがそれさえ意味不明な状態です。
大学の授業だけでは厳しいので初心者用の参考書を買って勉強したいのですが
売っていますでしょうか。愚痴っぽくなっちゃってスイマセン。
>>177
どういうことかよくわかりませんが、LINUX立ち上げてemacs起動して書けー
って言われていますヽ(`Д´)ノウワァン



>>179
なんで今更、6502やねん? 20年以上前のCPUだぞ。

http://www.apple2world.jp/apple2/COL/MapItems/6502/6502.html
>>179
>大学の授業だけでは厳しいので初心者用の参考書を買って勉強したいのですが

10年前に既に6502の本は入手不能になっていたので今買うのは無理。
>>179
配列×配列の計算ね。それは簡単だが、6502にはかけ算命令が
ないのでシフト命令(ASL)を使ってエミュレートしませう。
183181:03/10/15 21:38
>>179
ああそれから、6502の資料なら
ttp://www.6502.org
に豊富にあるし、65816も6502エミュレーションモードを持っているから
65816で文書を検索してもよい。

それと、これが一番気になっているんだが、そのLinuxには6502シミュ
レータはもちろんあるんだろうな?
z80を実習で触らされたなあ。矢印が走るプログラム書いて喜んだもんだ。
186デフォルトの名無しさん:03/10/15 21:53
アセンブラってループとか分岐処理でラベルを多用しますが、
ラベルの命名方法って皆さんどうしてますか?
187175:03/10/15 21:54
かなり古いものみたいですね。・゚・(ノД`)
講師の人も結構歳がいってるみたいで・・・。
>>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は今でも現役だったりするなぁ
196186:03/10/16 14:34
>>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の汎用レジスタって汎用ってかんじが微妙だけど
このかんじはどこまでも踏襲されていくのだろうか
>>203
ARM7
フリーとなった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はそうでもないか。
いまどきのアセンブラプログラミング
ttp://book.mycom.co.jp/user/preview/4-8399-1202-5/index.shtml

これ見た人います?
ココの会社は前にも萌えCPU作成本を書いてたような、、
分岐条件はARMでなくともフラグを見に行くからなぁ。
フラグ判断、操作はテンコ盛りになるだろうな。
なんせ、ifのあるところはこれがあることになるから。
219デフォルトの名無しさん:03/10/17 13:40
>>217
以下、他スレから転載。

目次を見る限り、ネット上で入手できる情報ばかりだね…
OllyDbg、PeRdr、スペシャルねこまんま57号、Stirling、Resource Hacker等を
使った解析手法やアセンブリ言語での初歩のプログラミング手法なら、
検索すればすぐに見つかるから、個人的にはこの本の購入は勧められないよ。

知らない人もいると思うので、その手の情報が入手できるサイトをひとつ。
http://gamereverserz.cjb.net/


今からアセンブラやろうと思うのですが、
どれをやれば良いでしょうか。
222:03/10/17 19:33
ブラクラ
223デフォルトの名無しさん:03/10/17 19:37
△△_?#6Vカ・ス゚堊△△ーP△z△サ△>△「ケカ△△9ユセオヨ>>>△_?卆=>
224 :03/10/17 19:38
>>221
>どれをやれば良いでしょうか

?????
>>221
masmかnasm。
nasmの方がいいのかもしれない
>>222
ブラクラちゃうやん…
つーか、>>217の本は>>220のサイトの資料が元ネタみたいだね。
>>>217
このページで立ち読み(PDF)で見たが、笑ってしまった。
虫食いじゃねぇかよ
マシン語でないと書けないようなテクニックってどんなのがありますか?
オブジェクトファイルの話を除外したら。
自己書き換え。
書き換え自体は他の言語でも出来るが
書かれる内容はマシン語
>>217の本、BorlandのURLが http://www.inprise.co.jp/ なってる・・・
ホントに新刊なのか?

>>230
自己書き換えプログラムとか
自己書換えプログラムのTipsみたいなのは、
Webや書籍になってないですかね?
あれば見てみたいのですが(^^;
>>230
排他制御
>>217
http://book.mycom.co.jp/user/preview/4-8399-1202-5/index.shtml
>その構造は高級言語に比べて遥かに単純化、合理化されているからだ。
>単純に命令を追っていく作業も、高級言語に比べて分かりやすいのも
>その理由の1つだ。

これは釣りなのか?
>>230
CPUの特殊命令
>>230
タスク切替え
例外・割り込み処理エントリ
拡張機能付きのコンパイラなら書けない事もないか。
>>230
大事なテクをわすれていた。

ローテート
ファミコンのプログラムはROM容量の節約のために、
自己書換えが当たり前のように使われていたとかいないとか。
といっても多くは命令列のテンプレートを置換するような
使い方が多かったらしい。
>>238
ローテートはうれしいけれど、mipsとかなかったような・・・
ローテートもっててもキャリー付ローテートがない事もありますね。
たしかに使用頻度は少ないんだろうけれど。
>>230
ADD with carry
>>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
とかって一対一に対応している関係を表したものですが、あるのでしょうか?
すんません、よろしくお願いします。
>>256
それぞれのCPUのメーカのデータアーカイブに普通PDFファイルとして
保管してある。
8080は古くてインテルのサイト内には見つからなかった。
Z80のインストラクションセットなら見つけたのでリンクを貼っておきます。

ttp://mmm.uec.ac.jp:8081/club/koken/~ubora/inst_set.html

このうちEXXとかIX,IYとかリフレッシュカウント関連の命令を除けばニー
モニックは違いますが8080とバイナリ互換です。(あとブロック転送とか
相対分岐も除く。わかるよね。)
こっちのほうがわかりやすいかも。
http://nemesis.lonestar.org/computers/tandy/software/apps/m4/qd/opcodes.html
intelのpentiumとかだとうれしいです。ッて書き忘れてしまいました。
無駄な労力すみません。
やはり全言語使った方がよさそうですね。
こうなったら地道にdebugで調べるか
>>259
PentiumV以降ならintelのホームページにあるじゃん。
ttp://www.intel.co.jp/jp/developer/index.htm?iid=jpHomepage+Header_Developer&
ここからハードウェア設計→プロセッサ→デスクトップ向けプロセッサでマニュアル
を選ぶ。今はPentium4 EE が出てきて翻訳が間に合わないせいか英語のpdfしか
ないが、そのうち日本語も出るだろ。
>>4
のリンクみとけ
>>259
よくよく考えたら、ah なんてレジスタ (or レジスタペア) は 8080 にはなかったな...。
263259:03/10/20 11:54
ありがとうございます。
嬉しくて鼻血が出ました。
NASMを今から覚えようと思うのですが、
本とかどれを買えば良いでしょうか?
>>264
本を買う必要はないと思う。
Googleで検索すれば役に立つ資料がタダで手に入るから。

NASMで何をしたいのか、具体的に書いたほうが良いかと。
公式にNASMのドキュメント置いてあるけど、
英語苦手だから大変。
日本語もどこかで見たような気がするなあ。
機械翻訳でやたら詠み難かったが。
callってパイプラインに悪影響が出ますか?
出るならば、jmp系と比べて、影響に差が出ますか?

callってブランチターゲットとかいう予測機構と
相性がいいですか?

NullObjectパターンは、関数ポインタと何もしない関数によって
nullチェックをしないようにします。
素直にifとかswitchとかを使う場合と、NullObjectパターンを
使う場合とでは、パイプラインへの影響に違いが出ますか?
無条件jmpと同じ
わずかに差があるとしたら
リターンアドレスを格納するバッファに限りがあるというだけ

関数ポインタはアセンブラ的には良くない
テーブル(レジスタ)jmp/callは初回は必ず分岐予測ミスになる
2回目以降で履歴が残っていればそこに分岐すると予測する
if等でも前回と分岐先が違うのなら
どこかで予測ミスをする可能性が高い
が、ある程度パターン化されたデータからなら
if系ならほぼ全ての分岐予測が当たる可能性がある
その意味ではifの方が当たりやすいかもしれない
ただ、BTB等を消費することも考えると一概にはいえない

と思う。
スタック操作のコストはかからないの?
AMDの場合はスタックアクセスはレジスタアクセス同等のようだね。
>>270
Pentium4までのCPUはESPはALUが管理していた。だから他の汎用
レジスタとコストは同じ。Pentium Mではスタック操作用に専用のハード
ウェアを用意したのでALUとは独立に動き、重いスタック操作をすると
Pentium4の3倍ほどの速度が出るそうだ。しかし実際の局面ではその
ような極端な場合は非常に少ない。

ttp://pcweb.mycom.co.jp/special/2003/centrino/04.html

ここから進んで見るとよくわかる。
273268:03/10/26 01:15
テーブル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実行前の判定結果待ちの間に他の演算を実行しているのであれば
その差は埋もれる。
275268:03/10/26 14:45
> これが関数ポインタだとすべてはずれる。
すべてはずれるというのは、以下のようなもんでしょうか?

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も数値だけの場合とか条件が揃えばテーブルになる。
293268:03/10/30 18:28
>>274
> これが関数ポインタだとすべてはずれる。

あの〜、すべてはずれるという例は
>>275
でいいのでしょうか?
あるアドレスにおいて前回と違うアドレスに間接ジャンプ/コールすると分岐予測ミスする
というか >>269 を見る
295268:03/11/01 11:55
ありがとうございました
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でビルドしているというだけです。紛らわしくてすみません。
何度もすみません。やりたい事は
http://www.google.co.jp/search?q=cache:IiPH8pU8qEEJ:www.geocities.com/chaoh2000/board/log00004.html+%E3%82%B3%E3%83%BC%E3%83%89%E3%82%BB%E3%82%B0%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AE%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88&hl=ja&ie=UTF-8
の即値ジャンプ、と殆ど同じ事です。
ごめんなさい。一人でしばらくがんばってみます。
>>102
DLLの場合はFLATじゃだめぽ。
GetModuleHandleの値からの差だった様な。
>>300
DLLのことはよく知りませんが、
DS:[1002A44C]のアドレスの中身は"77C23C6E"って事じゃないんでしょうか。
違ってたらごめん。
>>302
>>304の言う通り,メモリにジャンプ先アドレスが入ってる。
APIをフックしたければインポートテーブルを書き換えれば良いんじゃねえの?
>>304-305
どうもありがとうございます。
ジャンプ先へのポインタ変数のアドレスを指定するのだったんですね・・
本当に無知ですいませんでした。

それから、インポートテーブルの書き換えというのも最初はわけわかめだったのですが
色々と調べていくうちに、とても期待できそうな情報を見つけることが出来ました。
http://codeproject.com/useritems/DLL_Injection_tutorial.asp?print=true

まだ中身を読んでいる最中ですが、これで色々と出来ることが広がり、大変嬉しく思います。
今まで御教授下さったみなさん。本当にありがとうございました。
307本7:03/11/02 17:14
うまさ最強

.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)のインストラクションマニュアルってやっぱ英語しかないんですか?
309259:03/11/05 18:33
久しぶりです。
ニーモニックと機械語の対応表、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
おまいらこたえろ。わからんのか? アフォー。

過去ログ(前々スレと前々前スレ)が読めないんですが、これは仕方ないんですか?
317312:03/11/09 23:21
>>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のアセンブラはどうすればいいでしょうか。
どこか良さげなサイトないでしょうか?
>>322
>>257-258 当たりがいいかも。
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
> 何故略したらアセンブラなのかは自分でもよくわからんけど

「アセンブラでアセンブルする言語」の略だと思われ。
うるせーボケ
>>333
なるほどと思ったり
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を使っております。
一応、アセンブラやってたけど今仕事になる?
「アセンブラで仕事する」っていうスタンスの人には
仕事はなさそうだな。
340るな:03/11/18 15:26
どうしてだか、MASM32でアセンブルしたオブジェクトファイルをLinkでリンクできません。
なぜなんでしょう?

あと、MASM32でそのままアセンブルできるコードに逆アセンブルしてくれるソフトって在りますか?
>>337
お前は向いてない。俺もな。さっさとCOBOLでも勉強しれ。
だって、完成してるじゃんw
342337:03/11/18 18:52
>>341
DC命令とかいれるんだけど・・、粘ったあげく完成しました。
アセンブラ使えるって胸張っていえるのはどの程度のレベルですか?
x86限定)

1)インラインアセンブラが書ける
2)アセンブラだけで単体com作れる
3)アセンブラだけで単体exe作れる
4)動的にインストラクションコードを並べて実行できる
5)自己増殖ウィルスを作れる

他にありましたらどうぞ
>>343
アセンブラの使われる業務からみて、1〜5 なんかよりもむしろ、

 1) 各種OSのデバイスドライバが書ける
 2) インラインアセンブラや SSE 等を利用して高速なコードが書ける
 3) 小規模な組み込み用CPU向けにコンパクトなコードが書ける

ではないか、と。

よく考えるとこんなのもアリか。。

 4) shellcode が書ける
 5) エミュレータ等が書ける
ハードウェアの知識もないのにアセンブラも糞もないよな
>>340
16bit用リンカを使う必要が有るのかも。
http://download.microsoft.com/download/vc15/Update/1/WIN98/EN-US/Lnk563.exe
↑これでリンクできるか試してみそ。

>あと、MASM32でそのままアセンブルできるコードに逆アセンブルしてくれるソフトって在りますか?
IDS Proってのが出来るって聞いた事があるようなないような。。。
試してないからわかんない。
348347:03/11/19 23:13
まちがいた。
IDS Pro じゃなくて IDA Pro だった。
http://www.datarescue.com/idabase/
俺はアセンブラを読めるが書けない。

VCの混合モードを読んで、Cのコードを直す事で
速度を改善する。

アセンブラの利用ってこういうのもありでしょ?
あり
>>349
そういう人は結構多いと思うぞ
フローチャートとPADのどちらが良いんだ?
>>349
読めれば書けると思うのだが????
アセンブラソフトの使い方を知らないから書けないという意味かな
書けるが、読みたくはないって人のが多い希ガス
>>354
おれはそれだ
読めると書けるじゃ全然違いますが
漢字を読めると書けるじゃ(略
>>356
字が読める書けるよりはもう一つ上の階層の話だからね、うんうん
英語の技術文章は読めても書けないのと一緒
>>353
パーツは分かっていてもそれを組み上げることができない、ってことかと。
漏れも大体そんな感じ。
でもそれで十分じゃない。
Cでプログラム→アセンブラで高速化
ってな感じで。。。
うちはVBでサクサク作って高速化が必要なトコだけアセンブラ登場ってかんじ

あのー、自分で作ったソフトをアセンブラで高速化してみたいんですけど、
高速化のやり方が良くわからないんです。
高速化のやり方をまとめた様なページってありませんか?
>>362
何で作った、どういうソフトだよ!
ベンチマークしてボトルネック見つけてそこを潰す
サーチアンドデストロイ
人間オプチマイザーなんぞじゃ最近のコンパイラには勝てんが・・・
コンパイラが吐かないような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
インストラクション表とは何ですか???
>>384
命令表
ソースから改造するんじゃなかったら
バイナリーエディターと逆アセンブラ
根性あるならハンド逆アセンブルでもいいけど
やる気なくすことうけあい
>>382
インストラクション表って言われて自分で調べない奴じゃあ到底無理。
このスレの上のほうにもインストラクションマニュアルとかのキーワードあるのに。
リバースエンジニアリング、イクナイ(ものによっては)
逆汗かけずにやるリバエンもだめなん?
グレーゾーン?
391382:03/12/05 13:29
調べました。でも初心者だからよくわからない;。
ジャンプ命令とか簡単なのはわかるけど。
とりあえずツールは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
ツールがどうとかではないだろ。
命令が判るのは、「文字が読める」レベルだよ。

別に命令をすべて暗記する必要は無いが、
命令表見てでも理解できるようでなければスタートにも立ててねぇ。
394382:03/12/05 15:06
ゲームは普通の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が動かしているインラインアセンブラな訳だ罠。
402382:03/12/05 17:00
だめだ・・・よくわからないTT
ollydbgの使い方も完璧にしなきゃな。。
>>394
通報しますよ。
>>392
>>396
>>401
いい人だな。(  ゚Д゚)⊃旦 < 茶飲め

>>382
藻前の知識の量がサッパリわからん

「いまどきのアセンブラプログラミング」
http://www.amazon.co.jp/exec/obidos/ASIN/4839912025
この偽アセンブラ本で十分なんじゃない?
題名に惑わされずレビューを読んでごらん。
多分ぴったり
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の次)
408402:03/12/05 19:08
長くて読む気にならん。
お前の糞文書最低
しかしWindowsXPにもDebugコマンドが未だに残っている事に改めて
驚いた。
W2kにexe2binがあると知った時程でもないがな
411382:03/12/05 19:48
ふむ。やってみます。質問に親切に答えていただきありがとうございました。
どうもです^^
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まで。
419418:03/12/06 01:27
間違えた24bitじゃなくて20bit。
>417
たぶん>415は、debugではmovzxとか使えないんじゃないか?
ってことが言いたいんだと思う。
>>414
勝手な妄想するよりちゃんと勉強したら?
第一条:登下校時や校外学習などは原則として制服を着用する。
    また全裸で登校する場合は時前に連絡をする。
第二条:頭髪は生徒らしく清潔(もしくは不潔)にする。
第三条:屋上の利用は基本的に認めないが「どうしても」と言うなら認める。
第四条:刃物やウォークマン、学校に関係のないバター等は持参しない。
第五条:授業中はマウスピースをはずす。
第六条:えりあしはなるべくオシャレにする。
第七条:遅刻3回は遅刻2回とみなす。
第八条:校内暴力も遅刻2回とみなす。
第九条:基本的に、ガッツポーズは禁止する。
第十条:ハムは学校指定のハムのみとする。
第十一条:もち肌は停学とする。
第十二条:おちょぼ口は退学とする。
第十三条:校長先生に石を投げない。
第十四条:消しゴムを食べない。
第十五条:草を食べない。
第十六条:セミを食べない。
第十七条:許可なく豆を煮ない。
第十八条:線から出ない。
第十九条:なるべく奇声を発しない。
第二十条:体育教師に難しい事(漢字の読み書き等)を聞かない。
第二十一条:ハゲは控え目に行動する。
第二十二条:家庭の事情以外の理由でのダムの建設は認めない。
第二十三条:やむを得ず脱皮する場合は、授業の妨げにならないようにする。
第二十四条:平熱は36度とする。
第二十五条:いい匂いはミントのみとする。
第二十六条:必要以上のゼリーを持って来ない。
第ニ十七条:隋に派遣されない。
第ニ十八条:教頭は原則として人類以外は認めない。
第ニ十九条:変な汁を出さない。
第三十条:先生が指定した相手以外の奉仕活動は控える
>>409
同意。

enter/leaveさえも通らない(涙。
8086互換?
424382:03/12/06 02:29
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
をを、ありがとうございます。
まさに欲しかった情報です。これから読んで、勉強させてもらいます。
429382:03/12/06 14:36
>>425
それがそのゲームアタッチすると(たぶん)メモリ監視があって途中で終了しちゃうんですよTT
トレースするとなぜかフリーズしちゃうし。。
>>429
合法ならターゲットをあげろ。非合法なら首釣って市ね。
>>423
昔の奴そのままのっけてるとかじゃないかな。
ヘルプ (? コマンド) みると、EMS がどうたらとか書いてあるし...。

まあ、debug はまだ許せるけど、edlin なんて使ってる奴いるのか ?
>>431
スレ違いネタだけど、この間「Xpのboot.iniを書き換えたら起動しなくなった」
という依頼で、コマンドプロンプトしか起動しないから思わずedlinと入力した。
当然、そんなコマンドはなかった (w
MS-DOS 3.3cのころedlin使ってcom作ったこともあったんだけどね。
>>432
Xpにもedlinついてるよ。
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に入ってみな。頭のセグメントの数値が変わってるから。
>>438
変わらんなあ。
環境がおかしいのか?
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でもない
461 :03/12/13 12:20
MOV EAX,天国
JMP [EAX]


>>461
N-BASICが起動しますた
昔はアッセンブラて呼ぶひともいましたね。
アッセンブリという言葉なら普通に使われているからね。
http://www.google.com/search?num=50&hl=ja&inlang=ja&ie=Shift_JIS&c2coff=1&q=%83A%83b%83Z%83%93%83u%83%8A&lr=lang_ja
465デフォルトの名無しさん:03/12/14 17:54
漢ならwindbg
何もかもが、炎の中に沈んだ。
微笑みかけた友情も、芽生え欠けた愛も、秘密も。
そして、あらゆる悪徳も同じだ。
全てが振り出しにもどった。
兵士は死んだ魂を疲れた身体に包んで、泥濘と、硝煙の地に向かった。

次回「アッセンブルEX−10」。
傭兵は誰も愛を見ない。
ボトムズの次回予告が良いとおもうぜ
468 :03/12/15 22:25
最近、「いまどきのアセンブラプログラミング」を本屋で
見かけておもしろそうだったから衝動買いしそうだったん
だけど…。

パラパラとめくってみたら、なーんか変だし。でも俺アセンブラ
詳しくないから皆こんなふうに勉強してんのかなと思っ
たんだよ。念のため買うのはネットで調べてみてからに
しようと思ったら…。
アマゾンでもボロクソに言われてるし、こことかの2chの
スレでもボロクソだし、いやぁ買わなくて良かったねぇ…。

まぁ、知識のない俺でも、前半がツールの使用例(説明ではない…)
、後半がアセンブラ語のリストになってりゃおかしいってことに
気がつくもんだ。タイトル的に詐欺じゃねーのかなこれって。

しかも、この著者ってむかーーーしっからゲームラボで記事書いてた
方ではないか…。性懲りもなくレベルの低いPerlの記事を書き続けて
いた記憶が…。(2年くらいゲーラボ見てないので今も書いてる
かは不明)
「方」は余計
俺には、バイナリエディタでのセーブデータ改造が、
なんでアセンブラと結びつくのかわからんな。
今どきだからじゃない?w
いまどきのアセンブラってゲームのセーブデータを改造することを指すのか(w
ゲーム改造なんて昔からあるじゃないか。
>ゲーム改造なんて昔からあるじゃないか。
d の文字コードが 100 というのはその時覚えたな。
>474
どこの世界の文字コードですか?
>>475
そういうのはお前の脳内だけで勘弁な
>>475
10進表示だと思われ。
100D=64H

時に、自分は1年未満ですが皆さんのアセンブリ言語歴はどんくらいですか?
10年
15年
専念
http://www5c.biglobe.ne.jp/~ecb/assembler/assembler00.html
ここで勉強したらMapleStoryの競合回避ぐらいはできるようになると思いますか?
>481
> 今、アセンブラのコンパイラって結構手に入らないみたいですね。

アセンブラのコンパイラって何?
>>477
約7年

>>481
>ここで勉強したらMapleStoryの競合回避ぐらいはできるようになると思いますか?
思わない。それと、ネットゲームの改造の話題は板違い。
>>477
約6年半
MapleColorsと勘違いしていた漏れは逝った方がいいでつか?
>>485
逝ってよし!
新スレ建てました。閲覧してみてください。
☆組み込み用ボード・組み込みOSの話題スレッド☆
http://science2.2ch.net/test/read.cgi/kikai/1071664087/l50
最近VCのインラインアセンブラを使い始めたんですが、
構造体のメンバにアクセスするときは、先頭アドレスから
計算していくしかないのですかね?
今は定数定義して使っているのですが…。
490488:03/12/18 14:10
>>489
ありがとうございます。試したら出来ました。

探せばしっかりヘルプに載ってますね…。
今度はもっと注意深く探してみます。
>>489
// mov ebx, OFFSET hal
コメントアウトしてあるのは何でだろ?
8ビットアセンブラのサイト(6502・初心者向け)を作ったので、
興味がある人は見てみてください
http://sufami.hp.infoseek.co.jp/
>>492
おもしろそうなサイトですね
ありがとー
494デフォルトの名無しさん:03/12/21 23:18
昔のパソコンしか使ったこと無いので質問させてください。
(1)WindowsXPで、メモリの特定の領域をユーザーマシン語領域として確保する方法。
(2)その領域の任意のアドレスからマシン語を実行する方法。
以上2点、ご教示願えませんか?
>>494
何でそんなことがしたいんだ?

デバイスドライバ書けばできそうな気がするけど。
496494:03/12/21 23:33
>>495
ええ?
マシン語を学習するときってまずこれじゃない?
今のパソコンのマシン語学習はちがうの?
ポケコンやファミリーベーシックはこれやんないと暴走したんだぞ。
氏ね、ハゲ。
マシン〜が 叫ぶ〜
狂った朝の光にも似た〜
本当に叫んだら怖い
>>496
netadesuka
>>496
バカめが!
釣れた
494は予定通りのレスを見てPCの前でほくそ笑んだ

しかしその時…!
マジレス
DOSエミュレーターを入れて
昔どおりにスル
505494:03/12/22 08:09
なんか激しくハズしたみたいなので逝ってきます。たぶん20年くらい遅れてるなたぶん。
そのへんのEXEファイルでも逆アセンブルして勉強してみるよ。
最近のマシン語ってひょっとしてリロケータブルが主流なのかな。OSが勝手にメモリの適当なとこに展開するのか?
絶対ジャンプとかは使えないのかなあ。
>>505
MMUについて学んでこい。
>>506
な、なんだってー
>>505
8080→6809に乗り遅れた人
生きた化石がいるスレはここですか?
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で最小じゃないか
どこに戻るの?
>>521

そういう細工がされてる。

何ぃ〜〜〜そうだったのか!
なら 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
アセン… (゚д゚)ブラー
>>529
なるほど。
ret で戻れるのは CP/M との互換性を保つためだぁね。
CCP (DOS で言う COMMAND.COM) から

  CALL 0100H

でユーザプログラム呼んでたから。
ヌー(_人_)ブラ
互換も何も最初のバージョンはCP/Mクローンだし
536デフォルトの名無しさん:03/12/26 00:59
ああああっっっΣ(・∀・`;)
顧客のデータが馬鹿、俺の馬鹿ぁぁっっっ
会社から書き込みしてます、当分このアセンブラスレにはこられそうにありません
皆元気で・・いっその事首なら思いのほか早く書き込みできるかもしれません
では
アブソリュートディスクアクセスで華麗にデータを復帰。

昔アブソリュートディスクライトで
AX じゃなく AL にドライブ番号入れちゃって
フロッピーじゃなくハードディスクの FAT を
壊してしまったことがあったな...。
しかも学校の部室にあったやつを。
苦い思い出だ。
DOSでリセットするだけCOMは実はテキストエディターのみで作れるというのは案外しられていない
0.5へぇ
>>516
0以外ではなく0をoutだが
540デフォルトの名無しさん:03/12/26 15:27
>>535
CP/M86よりも、よりCP/Mだったね。
>>539
そうだっけ。そのあたりも忘れてるなぁ。
DFはセットしたらクリアしなきゃいけませんか?
うん。
他のところではクリアされてることを前提に
組まれてることもあるからね。
MSのライブラリがそうだったな…
あれには悩まされた。某島のライブラリは自前で設定してくれたからなあ。
>>536
ガンガレ…
>>536
がんがって。
547デフォルトの名無しさん:03/12/29 15:37
新スレ建てました。ヨロシクです。
電気電子板
アセンブラ☆with C
http://science2.2ch.net/test/read.cgi/denki/1072675685/l50
548sage:03/12/29 15:58
64bitCPUになったらどうするんすかね〜?すかね〜?
549547:03/12/29 16:13
>>548
どーもです。
03f8は自分のPCのシリアルポートです。
P4でもF〜命令の後はwait入れないとだめ?
>>590
結構前からいらなくなっているはずですが。
287か387のころだと思ったけど。
287で要らなくなってる。
アセンブラ(゚д゚)ウママッママー
アセンブラの誤用が多いのはなぜだろうか・・
>>554
マイナーだから
>>551>>552
どうも
電気電子板新スレです。
制御プログラム\
http://science2.2ch.net/test/read.cgi/denki/1073050278/l50
質問します。

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じゃないし...
576569:04/01/10 22:29
私には無理ですか…
そもそも、どのくらい難しいのでしょうか?
アセンブラに慣れている人でも、限られた人くらいしか
できないくらい?

何か参考になるものとかないのでしょうか
お前には無理だの一言でかたづけられると悲しいです

>>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
そう。
585583:04/01/11 18:14
>>584
ども。
>>584
VC7だと/O2オプションとかである条件の関数呼び出しがcall/retじゃなく
jmpになったりするけど、そういうことかと。
>>586
その程度のことで

>>582
> Cなどで作ると、Cコンパイラは最適化してくれちゃったりするのもあったりして目的のコード吐かなかったり、

こんなこと言ってるんなら、普段書いてるコードのたかが知れますな
588569:04/01/11 19:42
BCB5のディレクトリを探したらsource/startupに
startup.c
c0nt.asm
等々がありました
もっと調べておけばよかったのに…と反省しました
インストールした当時に俺には関係ないやと
完全に無視をしていたのでノーマークでした
すっかり忘れてた

makefileの中に
$(LIBDIR)\c0w32.obj : c0ntw.asm c0nt.asm
  $(ASM) $(ASMFLAGS) c0ntw.asm,$<;
という部分があったのでやった!と思いました
たぶん私が欲しがっているものだろう…
これから中をみて勉強します

解析したら?とのアドバイスをいただいたので
それっぽいものをグーグルで探したら、
逆アセンブラとかのツールがあるようでした

これはexeファイルからアセンブラソースを
出力するようですが、objファイルから
アセンブラソースを出力するようなツールは
あるのでしょうか?
>>588
なんでまた、ソースが見つかったと言うのに逆汗なんか調べてるんだろう ?
>>589
解析ツールとか使ったことがないので、使ってみたいなと思ったのです

しかもソースがあるから比べて見ることもできていいな、とも…
>>588
OpenWatcomのwdis。Borlandのに使えるかどうかは知らんが。
ttp://www.openwatcom.org/
ttp://cmeerw.org/prog/owtools/
>>590
ああなるほど、別の目的ね。
>>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でも
操作できる。
596569:04/01/12 19:40
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
8086,80386 のセグメント方式(ページング方式)
http://www.ieice.org/jpn/books/kaishikiji/199910/h111007.html
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命令だろうか?
>>615
あら本当だね。
ttp://www.microsoft.com/japan/whdc/hwdev/platform/64bit/64bitsystems.mspx
つー事はx86-64はLinux上だけでしか生き残れないわけか。
インテルも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って事だから。
>>622
そこで386命令の出番ですよ
>>621
ああ、自分で書いててわけわかめだ。逝ってくる。
>>621
>スタックされたレジスタのうち現在のフレームの範囲外のものを読み込むと、
>未定義の結果が返される。これらのレジスタに書き込むと Illegal Operation
>( 無効操作) フォルトが発生する。

とPDFにはあるから、Cのローカル変数の操作に起因するバグはかなり
食い止められそう。
>>623
という事はまたWindows95系のように、32ビット命令と64ビット命令
を混在されたOSを作るわけか。Microsoftならやりそうなことだ。
ia64、amd64用の二つのWindowsはいまβ版を誰でも
落とせるようになってるみたいね。
しかしpsdkにはia64用のコンパイラしかないんだよな。
>>626
そこでCLIの出番ですよ。
>>626
64bitWindowsはカーネルには64bitコードしかないみたい。
>>627
Opteronが出てきたからM$としては取り敢えず「準備はありますよ」
という姿勢だけは見せておかないといけないからかな。

>>628
JITコンパイラ?.Net戦略もあまり芳しくないようですが。
>>629
それならよかった。初めからNT系のように安心して使えるのか。
cli
jmp $
>>632
Clear Interrupt Flag??
そこでNMIの出番ですよ。
>>634
わけわかめ。
しかしIA-64のEPICは面白い。疑似ベクトル・コンピュータみたいな
事ができるんだね。
>>636
あんた変人だな。折れあんな機械語吐きたくねぇ・・・
>>637
そうか?しかし見れば見るほどItanium2は凄いな。Athlon64
なんてただのx86の強化版+64ビット化にしか見えない。
機能は満点だからなあ。まあ最終的にはコストに見合った
性能が出せるかどうかかねえ。
>>639
普及すればすぐ下がるっすよ。Pentium Proも発売当時は
10万以上したでしょ。
>>626
そこでVirtualPCですよ!
ttp://www.intel.co.jp/jp/intel/pr/press2003/030909a.htm
Itanium 2 "Deepfield" 約88,000円か。もうXeon並。
つー事はハード/ソフトの環境が整い次第Xeonは淘汰され、
じわじわとItanium 2に置き換わり、ついに一般ユーザが普通
に使う日が来る。イヒヒヒ
>>641
ソフトウェアエミュレータは遅いからねえ・・・・
ライブラリなんかがネイティブ物呼べれば
多少はましにならん?
>>612
lock は?
"アドレス指定方式"というのを調べていて
インデックスレジスタとかベースレジスタとか

ごちゃごちゃしててわからないので
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
「intとポインタは同じサイズが前提」派が集うスレ
http://pc.2ch.net/test/read.cgi/prog/1071334774/
>>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はあんなに遅いのか・・・
>>660-661
オマイラどっちもいっぺん染んどけ
663デフォルトの名無しさん:04/01/14 23:45
     インデックスレジスタをもちいて以下のプログラムを作ってください。
    なお、言語はM32のアセンブリ言語を用いてください。


100個のデータ:D00、D01、D02、・・・、D98、D99が700番地から順に入っている。
その各データの二乗の総和:D00^+D01^+D02^+・・・+D98^+D99^を計算して
レジスタr1に入れるためのプログラムを作成して下さい。なお、M32には乗算命令
MULR(RR形式)があるものとします。
>>663
冬休みの宿題か?
>>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抽出が必要なのかと思ってた)
最新流行はシステムコールごとに割り込み番号を割り振る。
これ最強。
ハァ?何言ってんの?
最近の流行はカーネルをスタティックリンク
これ最強
保護機構が無くなってしまわないか
折れ様のコードは絶対だから保護など不要!
>>681は仮想マシンに隔離されています。
まあでもPc_Unixってのは、自由にカーネルにモジュールを
追加できるのがメリットの一つではあるな。
684681:04/01/15 22:42
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のタイムスタンプ
が変わるの。究極のミニエディタだった。
>>674
> そんな命令のあるCPUがどこにあるのかと…

6809 → ttp://www.micro.uqam.ca/Ressource/introl/Reference/Chips/6809/pshs.html

そんなことで驚いていてはまだまだだな。
こいつは、ユーザースタックにユーザースタックをプッシュすることもできる。

どういう局面で使うかは知らんが...。
どうも記憶が曖昧だがV30にPUSH-IPがあったかも
>>710
うぉう!6809!なんという懐かしい響きだ!
でも逆に言うと単にマイクロプログラムですべてのレジスタ
に対するアクションを組み入れたって事だよね。歴史的な
事情も糞もない。

68000ではPSH命令、PUL命令はMOVEM命令に統合された
が、残念ながらPCは外されている。まあプログラムカウンタ
相対の結果ををLEA命令でロードすればそれに近いことは
できるけどね。
713674:04/01/16 23:37
>>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 の実効アドレス得るのに使う.
719718:04/01/17 04:34
…ってもう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];
>>722
アルゴリズムの問題
二分探索すれば?
>>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$
に多額のロイヤリティを渡すしかなかろう。
731723:04/01/17 19:43
>>728
俺に聞くなよ・・
>>729
逆の意見もみた覚えがあるな。

Intel 専用 OS になってしまうのを嫌って他アーキテクチャもサポートしていたのだが、
RISC 陣営がワークステーション商売あがったりになって手を引き始めてしまったので、
結局 x86 以外残らなかった。

真偽のほどは知らないけど、Microsoft と Intel の間に隙間風が吹いてるのは確か。
今 Microsoft が狙っているのはハイエンドサーバだが、Intel はそこには IA64 を突っ込む
つもりで IA32 を展開する気はさらさらない。IA32 市場で築いた資産を活かしてハイエンド
サーバ市場に攻め込むつもりの Microsoft としては、x86-64 の方が嬉しい選択肢では
ある。

もちろん、Microsoft が心底望んでるのは Intel 版の IA32 互換 64ビットプロセッサだろう
けど。
>>732
となるとM$が逆にイソテルを脅してx86-64をすぐに出すように
密談済みという事もあるだろうな。
734728:04/01/17 21:18
>>731
ワリィ。
はじめは、age がバリバリ重なるからハッシュなんてダメよ〜〜〜ん、って書いてたんだけど、よくよく考えたら >>722 がよくないことに気づいて内容書き換えたけど、レス番書き換え忘れちまったよ、すまん。
>>722
とりあえず、SQLにまる投げしちまうとか?w
>>720
ちょと、farcallだけど・・・
>Linuxで/proc/iomemに見える32bitのアドレス値と
>16bitのIOポートアドレスというのはどう違うのでしょうか?

まんま、倍食ってるてことじゃないの。
32bitモードではCPU側にパイプラインバスが要ると同時に、メモリ側にもソレに対応したインターリーブする椰子が必要なんじゃなかったけ。(32ビットモードはハードによる?)
しかも、最低32bit分はアドレス連続してないといけなかったような・・・(気がする)
フェッチかエグゼキュートもしくは両方のサイクルでアクセス中に次のアドレスを指定して、受ける方(メモリ側)も受け付けてるんだよね?(細かい動作忘れた)
>しかも、最低32bit分はアドレス連続してないといけなかったような・・・(気がする)

しかも、アクセスするときは最低32bit分は
     ~~~~~~~~~~~~~~~~~  
アドレス連続してないといけなかったような・・・(気がする)
738736 もう1個訂正:04/01/17 21:52
I/Oだから
>メモリ側にもソレに対応したインターリーブする椰子
 ~~~~~~~~
メモリじゃないね。
でも、I/O空間でパイプラインバス、インターリーブは覚えがないなぁ。
てことで、>>736-738はアボーンで。
ごめん。ナニ言ってるかさっぱり
740736-738:04/01/17 22:00
>>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板で聞いたほうが早いと思われ
743720:04/01/18 00:24
みなさんどうもありがとうございます。自分なりに調べたら
/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の欄を見たけど単なる誤記ですね。
745744:04/01/18 02:01
ちなみにDレジスタ(16bit)はAレジスタとBレジスタ(ともに8bit)をつなげて1つのレジスタ扱いする場合の名前です。
アセンブラには PSHS A,B のかわりに PSHS D とも書けますが結果は同じです。
>>744>>745
よく知ってるネエ。もしかして未だにOS-9のメンテでも
してるのかな?
747744:04/01/18 02:25
いや、まともにやったのが6809だけというアマチュアです。
>>747
どうしてx86やんないの?6809の頃はサブルーチンで書くしか
なかった実数演算がそのままアセンブラで書けるよ。64MBの
束縛もないし、MSVCRT.DLLをリンクすればよく使う関数はだい
たい揃ってるし。まあ人それぞれだが。

俺はC++中に_asmで埋め込むのが好きでよくやってる。SSE2
とかね。
Pentium4 マシン持ってないから SSE2 使えない...。
750744 :04/01/18 02:37
x86の載ってるマシンは所有した事がないもんで。68000系かPPC。(つまりマカ)
68000とPPCはちょっとかじった程度。いや眺めた程度か。
>>749
了解。
>>750
すげえ。初心貫徹ですか。俺はヘタレだからすぐにPC-98XX
買ったけど。PPCはRISCだからかなり違うけどそれにしても
マイナー路線で頑張る孤独なランナーといった感じ。
>>722
>なんせ、dbは5000超えてるんで凄く時間がかかる。

ほとんどディスクアクセスの時間だったりして。
753744 :04/01/18 07:20
逃げます(笑)
>>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ビットとなる
>>780
日本語版のPentium4アーキテクチャマニュアルなら、
下のサイトのReferencesからリンクされてる。
intel.co.jpは間違えてリンクを消してしまったらしい。

http://gamereverserz.cjb.net/
>>779
「はじめて読む486」だっけ? あれ読めば? 分かりやすかった。
80386/486プログラミングガイド(富士ソフトウェア)が
教科書だった
>>779
入門書として。

アセンブラがわかればハードがわかる
http://www.cqpub.co.jp/try/bk2003a.htm
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
くだらんもの晒すなよ
>>789
言いにくい事言ってくれて有難う
デバッガ動かしていて、レジスタの値が変わっただけでハァハァしていたものだが
レジスタが変わるなんて日常ちゃはんじ(←なぜか変換できない)だろ
>>792
日常茶飯事

× ちゃはんじ
○ さはんじ

(なぜか変換できない)のガイドライン
http://that.2ch.net/test/read.cgi/gline/1074839941/
えー。本日も
コピペ物を公然と陳列しようと思ったのですが、
そろそろスリッパが飛んできそうなので、

打ち止めにします。

あえてつけ加えると
晒したモノに使ってるものが、
ハードウェア以外、ぜんぶオープンソースもの
である、という点が味噌でした。

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
こういうこと書くからウザイって言われんだよ、オプソ厨
わかんねーかなプゲラ
オプソ云々とは別に、
どういうふうにすれば、
この系統のOSでアセンブラをほげほげできるか?
の情報が乏しい。

Linux では たくさんあるシステムコールの引数に
それぞれ何を与えたらいいのか?の情報も乏しい。

玄人から見ると噴飯だろうけど
ボランティアで踏台をやったつもり。

お騒がせしました。もう書きません。
さいなら。

FreeBSD の場合
システムコールの引数を[右から]順番に
dwordでスタックにpushして
最後にeaxにシステムコールの番号を入れて(mov)
それもスタックにpushする。
それから、int 0x80 をかける。
後処理として
dword == 4バイト * スタックに積んだだけ
add esp して、スタックポインタを元に戻す。
ttp://www.freebsd.org/cgi/cvsweb.cgi/src/sys/kern/syscalls.master?rev=1.165

Linuxの場合
eaxにシステムコールの番号、
ebxからediに必要な引数を順番に入れて
int 0x80 をかける。
ttp://world.std.com/~slanning/asm/syscall_list.htm
>>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は逝ってヨシかもなー
完全にスレ違い。お前が逝ってヨシ。

だれか俺に答えてくれよう。。。>>772
NASM使いのガイジンに聞いたほうが早い
自身持ってNASM使えるぜ!ってやつはここにいなさそうだし
>>
多分無理。NASMのTODOのfeatureとしてあがってた気がする
すまん切れた
>>826宛てな
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
832831:04/01/28 00:05
しまつた、先頭部分が抜けていた。

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
思いっきり誤爆!!!
movに戻ってきてるジャン。>>835アボ〜ンでヨロ。
>>835が何を言いたかったのか理解できない(´・ω・`)
83835=36:04/01/28 14:42
気を取り直して・・・!
pushaw
push ds
push ss
はスタック退避させてて、その状態で、movでアクセスできるの。
INT掛かる前にスタック入れてるから、底にあって、先には取り出せないし・・・(LIFOだから)
別に領域にワークメモリ確保した方が良いんじゃないかな。
839835=836=838:04/01/28 14:47
>>838
んン?ゥギャ===!
事故レス自爆レス。
aw,ds,ssは値だけスタック退避してるから、
後のmovで弄ってるのは、新たな値なだけだ、退避値とは関係ない。
ただし、movで煽った値は退避してないから、INT21の割り込みルーチンで変えられる可能性あるよ。
アボ、ぼぼぼぼぼ、グモ・・・。
>>839
……ゆっくり寝ろよ。
アセンブラの前に日本語を勉強しよう
    _, ._
  ( ゚ Д゚)   ガシャ
  ( つ O. __
  と_)_) (__()、;.o:。
          ゚*・:.。
tcだからax, dxは壊してもいいんだよ
>>835はネタだと信じたい。(´・ω・`)
>>835
君、リエントラントって言葉知ってる?
>>845
そこ。知ったばかりの言葉を得意げに使わない
離縁と乱と(´・ω・`)
848835=836=838=839:04/01/28 15:56
>>844
>>835,>>838は完璧に忘れてください、何の筋道もなく、デタラメです、スーパー誤爆です。
悩ましてスイマセソ・・・。
>>839に関しては自分では誤爆でないつもりでしたが、
>>843そうですか、21のベクタテーブルでCALLされるとび先の割り込みルーチン内で壊してもよいのですか。なるほど。
キミint 21hが何する割り込みか知ってる?(´・ω・`)
>>849
MS-DOS時代の割り込みポ。
851848:04/01/28 16:11
追加ですいません。
確かに、mov ah,〜はINT21ファンクションコールでのルーチン上で読まれるAHレジスタ→この値で更にCALLして場合分けでした。
調べてみたところ
AH
08h 直接コンソール入力
09h 文字列の出力
04h 補助出力装置から1文字出力
でした。
852848:04/01/28 16:43
>>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の割り込みには上位下位という概念はないので下位割り込みがマスクされる事はない。
リアルモードの場合は無条件で割り込み禁止になったかも(←なぜか自信ない)

こんな感じかな(´・ω・`)
855848:04/01/28 17:06
>>854
あぁぁぁぁ、なるほど、たいへんに有難うございます。
割り込み番号に対してIDT(割り込みベクタテーブル)は物理アドレスの0番から2ワード単位で割り当てられているので
INT21の場合に、CPUがプログラムカウンタに流し込むアドレス、すなはち、割り込み処理ルーチンアドレスが書かれてるIDT上の読み込みアドレスは、
21×2FFFFF=####:####(CPUが計算)となる。
という理解で良いですよね。
    _, ._
  ( ゚ Д゚)   ガシャ
  ( つ O. __
  と_)_) (__()、;.o:。
          ゚*・:.。
正直に言え。出身国はどこだ。年齢は。
日本にきた目的は。
858855:04/01/28 17:17
>>855へ事故レス
あぁ、とんでもないこと書いてしまった・・・。
CPUが計算するアドレスは
21×4=####:####です。
いかがなモンでしょうか、ご評価のほどを・・・(汗焦;;
859名無し@沢村:04/01/28 17:30
おまいらよ、アセンブラをやるなら、おれのマシン語解説サイトは必須だぞ!
おれのマシン語解説サイトを見て勉強しちみろ?

http://hp.vector.co.jp/authors/VA015412/machinego.htm
860855:04/01/28 17:33
ちなみに、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(物理アドレス???)でいいのかなぁ。
バイトオーダーについて個一時間勉強汁(´・ω・`)
862855:04/01/28 17:47
ヴァ〜〜〜、ごめんなさい、違います違ってます。
DOSファンクションコールINT21がメインメモリ領域A004:970Fにあるわけないですゥ〜。
DOSのシステム領域は0000:0500〜0009:ffffの640Kにあるはずですからして・・・(ry
いったいどこにあるんだろゥうううう・・・、ドテッ。
ヴァヴァヴぁヴぁぼぼぼぼ〜〜ん・・・・。ガクッ。
>>857に答えたら教えてやる。が、その前に
>>862にも激しく勘違いが含まれてるので、それも
直せ
>>854
> リアルモードの場合は無条件で割り込み禁止になったかも(←なぜか自信ない)
SWの割り込みでは禁止にならない
>>864
(´・ω・`)
>>864-865
sw-intもif=0だよ
867855:04/01/28 18:33
あっ!とりあえず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領域じゃないし・・・。
どういう発想でそういう計算になるんだ?(´・ω・`)
869855:04/01/28 18:39
あっ、エンディアン違いますね。
アドレスは20D0:5D00ですね!でもDOS領域には変わりない・・・。ショボ。
>>868
ごめんなさい・・・。全然駄目駄目です・・・。
870855:04/01/28 19:17
>>869訂正
>でもDOS領域には変わりない
INT21の割り込み処理ルーチン20D0:5D00は
DOS領域ではないことには変わりない
      ~~~~~~~~~~~~~~~
デス。
>>869
でも、INT21がインストラクションレジスタに入って、CPUが21だけ取り出してアキュームレータに入れて、ALUで計算させて、それをIDTのベクタ参照アドレスとしてプログラムカウンタに突っこんで、IDTのアドレス指して、
そこから割り込み処理ルーチンアドレスの値を抽出だと思うんだけどなぁ。
その計算の仕方が分からない・・・。
スイマセンデス・・・。トホホ・・・。
871855=870:04/01/28 19:19
スイマセンです。
2個目の>869は>>868へ訂正です。
仮想86モードで動いている時は、素直にINT 21Hを実行
してくれんよ。Windowsに内蔵しているモニタでエミュレート
する。割り込みベクタのアドレスならIntelのPDFを見たまえ。
>>867
> INT0〜20の21コ×4BITE=54hでINT21は55h〜58h。
もう少し落ち着いて考えろ
874831:04/01/28 21:03
>>833
>>834
ども。合理的なアドバイスありがとございました。

>Cの呼び出し

オリジナルは

void far xxx();

だったのを指摘された形で行ってみました。

>_xxx:
>retf
>で確認

行ってみました。

残念ながら結果に変わりはありませんでした。

で、結果的にはヒンシュク買いそうですが、コンパイルの仕方に問題が
あったようでした。

Cのコンパイルは tc の統合環境で obj のみ作成して、これでコンパイルが通ったら
コマンドで tcc c.obj xxx.obj で exe 作成してました。それを、
tcc c.c xxx.obj でやったら、症状がなくなりました。

お騒がせしました。
(*゚ー゚) じー
876855:04/01/29 13:33
自分も分かりまスタ!がしかし・・・
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モードだと、何か違うかな。欝だ、氏・・・。
877855:04/01/29 15:00
↑違ってますね。
>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進の計算も出来ないようですし
>>876
"21"ハ 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
おまいらよ、マシン語のサイトを更新したから、ちょっとみちみろ?
今回の「マシン語練習問題2"大下絵美"」という講座はすごいぞ!想像を絶するぞ!

http://hp.vector.co.jp/authors/VA015412/machinego.htm
↑ネタ?
>>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
 ∪  ノ
  ∪∪
>>897
もちろんこれからもカコワルイぞ
ヽ(`Д´)ノ
900887:04/01/30 11:24
>>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だよね?
902900:04/01/30 11:35
>ターゲットは当然生DOSだよね?
WIN CEなんですが・・・。生DOSじゃないと、な、な、何か・・・;(汗焦;;
ターゲットがCEならおまいのやってる事はほとんど無駄になるような・・・
あ、もしかしてシリアルのターゲットがCEでモニタがDOS?
905900:04/01/30 11:45
>>904
はい(^^、そうです!
いかがでしょうか!
普通にターミナルソフト使うんじゃダメなん?
WinAPIでもシリアルを十分細かく制御できると思うが
908デフォルトの名無しさん:04/01/30 14:20
>>907
あっ、はい。それも考えてます。
Winの底で同期シリアルのスタートビット、ストップビット、SYNコード、HUNTコードの送出をどうしてるのか分からないもので・・・、
PC側Target側ともVC++インラインアセンブラか、.txt→.asmに拡張子書き換え→アセンブラコンパイラのハンドアセンブルでTargetのドライバ作りHYPERTERMINALでやろうかと・・・。ターゲットが生生なシリアルドライバ入ってない物でして・・・。(^^;
>>908
> 同期シリアルのスタートビット、ストップビット、

ネタなのかアフォなのかはっきりしてくれ。
>同期シリアルのスタートビット、ストップビット
すっ、すいません。
この2つは、シリアルドライバ間で使用して、CPUには関係ない部分だからソフトにも関係ないですね。(^^;
16550は非同期だけだろ
>>910
指摘したのは、そんな意味じゃない。
>16550は非同期だけだろ

あ、そ、そういうわけですか。;;
失礼しました。
てことは、SYNコード、HUNTコードも関係ないですね。(^^;;
ドライバがTxRDY-RxRDY確立すればどんどん垂れ流しでデータ来ますね。

ひょっとして仕事?
915-399410:04/02/03 02:26
人の前だから、あせっちゃうんでしょうね。
勝つところ見せたいだろうし
ごめん!
sysenterって本当に速いの?

int萌え〜
従来のセグメンテーション保護を無視した素敵な仕様だから
それなりに早いはず
919デフォルトの名無しさん:04/02/03 12:25
アセンブラとはちょっと違いますがお願いします。
cmovbでSIGILLを受け取っているっぽいのですが、
この命令はPentiumのどのバージョンからサポートされて
いるんでしょうか?
IntelのデータシートかNASMのマニュアルでも見れば?
ttp://www.intel.com ttp://nasm.sourceforge.net
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
別にアセンブラ=最適化でもあるまいに。
ハードの知識が足りないと思うならかじっとくべきだよ。
>>926
そういう趣旨は10年前からずっと言われてる。
本物のアルゴリズムも、神のアセンブラ最適も知らない
無学の輩

コンパイラがする最適なんぞ、人間は息をするかのように
自然にこなすものだ。
>>930
日本語で説明して下さい。
>>931
ユーアーフール
>>931
韓国からいらっしゃいましたか?
934923:04/02/05 01:12
>>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
940過ぎたので次スレ立てました

アセンブラ… (;´Д`) ハァハァ
http://pc2.2ch.net/test/read.cgi/tech/1065535118/
>>940
泣かすぞ
おいおい。
943名無し@沢村:04/02/05 23:21
きんたまのぉ〜おっちゃんがぁ〜くそ屁をこいた〜糞こいたぁ〜

http://hp.vector.co.jp/authors/VA015412/
ここも沢村がきてからすっかり糞スレになったな
と言うわけで、>>950は早々に次スレを立ててくれ。
946テンプレ:04/02/07 20:51
アセンブラ… (*´д`*)アハァ…

前スレ
アセンブラ… (゚д゚)ウマー
http://pc2.2ch.net/test/read.cgi/tech/1060928704/
前々スレ
アセンブラヽ(`Д´)ノモルァ
http://pc2.2ch.net/test/read.cgi/tech/1040297337/
前々々スレ
アセンブラヽ(`Д´)ノモルァ
http://pc2.2ch.net/test/read.cgi/tech/1016991911/
前々々々スレ
アセンブラ… (・∀・)イイ!
http://pc2.2ch.net/test/read.cgi/tech/1002267809/
947テンプレ(修正):04/02/07 20:57
アセンブラ… (*´д`*)アハァ…

前スレ
アセンブラ… (゚д゚)ウマー
http://pc2.2ch.net/test/read.cgi/tech/1060928704/
前々スレ
アセンブラヽ(`Д´)ノモルァ
http://pc2.2ch.net/tech/kako/1040/10402/1040297337.html
前々々スレ
アセンブラヽ(`Д´)ノモルァ
http://pc3.2ch.net/tech/kako/1016/10169/1016991911.html
前々々々スレ
アセンブラ… (・∀・)イイ!
http://pc.2ch.net/tech/kako/1002/10022/1002267809.html
948テンプレ(修正2):04/02/07 20:59
アセンブラ… (*´д`*)アハァ…


【過去ログ】
アセンブラ… (゚д゚)ウマー
http://pc2.2ch.net/test/read.cgi/tech/1060928704/
アセンブラヽ(`Д´)ノモルァ
http://pc2.2ch.net/tech/kako/1040/10402/1040297337.html
アセンブラヽ(`Д´)ノモルァ
http://pc3.2ch.net/tech/kako/1016/10169/1016991911.html
アセンブラ… (・∀・)イイ!
http://pc.2ch.net/tech/kako/1002/10022/1002267809.html


これでいいか。
> (*´д`*)アハァ…
これは確定なのか・・・?
950名無し@沢村:04/02/07 21:14
おい、おまーら聞け、おれのマシン語のサイトにPEフォーマットの仕様をUPしたからな。
恐ろしすぎるぞ!!おまーら↓

http://hp.vector.co.jp/authors/VA015412/
>>949
確定です。
よりによって沢村が950かよ・・・
特令により>>952にスレ立てを命ずる。
沢村は帰っていいよ
954952:04/02/07 21:37
Σ(゚Д゚||)
がんがってみます・・・
955952:04/02/07 21:41
たてますた

アセンブラ… (*´д`*)アハァ…http://pc2.2ch.net/test/read.cgi/tech/1076157613/l50
乙(*´д`*)アハァ…
957952:04/02/07 21:43
早くも沢村が・・・_| ̄|○
>>950
<BODY onresize=ResizeWindow(); leftMargin=0 rightMargin=0 topMargin=0 MARGINWIDTH="0"
MARGINHEIGHT="0" bgcolor="CCFFCC">

なんでマージンが全部ゼロなんだ。ハァ?
>>952
なにはともあれ乙
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進数で表記されることが多い)の羅列ですよ。
ソースをアセンブル/リンクした結果がマシン語になるんです。
ソースをコンパイル/リンクした結果がマシン語になるんです。