アセンブラ… (*´д`*)アハァ…

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

【過去ログ】
アセンブラ… (゚д゚)ウマー
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
2名無し@沢村:04/02/07 21:42
おい、おまーら聞け、おれのマシン語のサイトにPEフォーマットの仕様をUPしたからな。
恐ろしすぎるぞ!!おまーら↓

http://hp.vector.co.jp/authors/VA015412/
軽やかに3ゲット
【過去ログ】
アセンブラ… (゚д゚)ウマー
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
【書籍】
Computer Organization and Design Second Edition : The Hardware/Software Interface
http://www.amazon.com/exec/obidos/tg/detail/-/1558604286/

Computer Architecture: A Quantitative Approach
http://www.amazon.com/exec/obidos/tg/detail/-/1558605967/
とてもエッチなスレですね
さすがはソフトウェア産業の進んだ国だ。
VAX Assembly Language なんて本が廃刊にならずに未だにあるのかよ。
ちょっとびびったぜ(藁
http://www.amazon.com/exec/obidos/tg/browse/-/3954/
Windowsで out とか in とか使って直接ハードウェア読む方法にについて
書いてある本かウェブサイトを知っている方居ましたら、教えていただけないでしょうか。
>>8
昔のスレに情報があったように思う。
たしか
http://www.ddj.com/
の過去の記事で、サンプルコードが今でもダウンロード可能なはず。
・参考
http://www.gijyutu.com/g-soft/automa/nt/automa_nt.html
爽やかに10ゲト
12デフォルトの名無しさん:04/02/09 10:38
前スレより下がってるのでage
(*´д`*)アハァ…
mov large fs:0 ,ecx
↑のlarge fs:0がわからないのでどなたか教えてください。
自分で調べて解決しました。
調べてから聞け
つーかなんだったのか説明しろ
16:32アドレスのことでは?
16:16と区別するための
次スレのタイトルは

「 アセンブラ… (;´Д`) ハァハァ 」

でお願いします
↑馬鹿?
頑張って950をとってくれたまえ。
アセンブラ… (゚∀゚)ノ キュンキュン!
昔のスレ読んでたんだけど、スレが続くほど中身がなくなってる
気がする。
まだまだAMD64があるさ!
マニュアルほとんど整備されてないし('A`)
はぁ、ツマンネ
26デフォルトの名無しさん:04/02/12 21:47
>>25
ツマルさ!
アセンブラ… ('A`)マンドクセ
28名無し@沢村:04/02/12 23:38
マシン語… (*´д`*)アハァ…

http://hp.vector.co.jp/authors/VA015412/
>>28のサイトでもう何というか…アレだ
いやもう何も言うことはないよ
いまだにuパイプvパイプを意識してしまう
31デフォルトの名無しさん:04/02/15 09:56
>>30
え!?もう、意識しなくていいの?
>>30
いいなぁ!PentiumXIIユーザーだね?
まともなアセマーはみんな電子板にいったのかな。
アセモーってなんだよ。
アッセンブララーだろ。
組立工みたいだな
μop
37デフォルトの名無しさん:04/02/16 10:27
アセンブラ初心者です

8086マクロアセンブラ入門という本を
使ってるんですが

NOWSMART ASSEMBLER
LASM Ver2.32体験版でやっても
.code;
mov ax,bx;
mov al,bh;
mov ah,bl;
mov cl,x;
mov ax,w;
mov ax,3;
mov x,5;
.date;
xdb?;
wdw?;
がコンパイルできないのですが
どうしてでしょうか!?
間違っているから。とりあえず s/.date/.data/な。
あとコンパイルじゃなくてアセンブルと普通はいう。
質問するときはエラーメッセージもきちんと書こう。
セミコロンはどういう意味で入れてるんだ?
改行をコメントアウト
>>40
ナイス
さて
Intelの64bit拡張がAMD64完全互換で
レジスタ名やページテーブルの構成まで一緒となり、
将来もほぼ安泰。
masm系64bitアセンブラの登場が待たれるわけだが。

http://developer.intel.com/technology/64bitextensions/
http://developer.intel.com/technology/64bitextensions/faq.htm
nasm系アセンブラは嫌いですか?
GSレジスタって使われたことがあるのでしょうか?
少なくとも、NT系では使ってないですよね。
TOWNSではGSつかいまくり
フラットモデルなら当然いらないよな
Win32は変態だからFSは使うけど
NTのFSレジスタの使い方も、ほとんど意味がないような気がする
47名無し@沢村:04/02/18 22:11
おれのマシン語のサイトに掲示板ができたぞ!
ほんにおまいら〜♪

http://hp.vector.co.jp/authors/VA015412/
WINではFSって例外処理に使ってるんだっけ?
使ってるね。
具体的にはどうやってつかってますか?
おしえてください
fsにはセレクターとか入ってないんですか?
fsがTEBのセレクタとなってまっする
TEBじゃなくて、PEB(GDT6番)じゃない?
あと、PCR(GDT7番)のセレクタにもなっています。

でもFSに値を入れて16:32アドレスを使う理由が分からん。
セグメントはちゃんと使えばメリットはある
文句言ってる香具師はただのヘタレ
NT系は、CPUの機能になるべく依存しないように作られている。

仕組み上x86はディスクリプタとセレクタに値を埋めなければ
CPUは動かないので、仕方がなく使っている(と思う)
g++が例外フレームをどうやって扱ってるか教えてくれろ
>>54
あんた周りからとんがり過ぎてるよ・・・角度とか
gccのインラインアセンブラを使用しているのですが、
ラベルと外部変数の関係がわからず悩んでいます。
例えば、
extern short data[];

void func(void)
{
register int t1, t2;
asm("data:;add %0, %1, %1":"=&r"(t1):"r"(t2));
}

のようなソースであったとして、参照指定された外部変数dataは
asm文中のdataラベルと関係があるようなのですが、文法的な相互関係が
よくわかりません。data変数はexternを外して実際にそこに定義すると
エラーとなります(変数の再定義エラー)。つまりasm文中のdataラベルが
変数(?)のように扱われているようなのです。gccのマニュアル等色々
調べたのですが結局わかりませんでした。
どなたかお分かりでしたら、ご教授ください。
gccのインラインアセンブラを使用しているのですが、
ラベルと外部変数の関係がわからず悩んでいます。
例えば、
extern short data[];

void func(void)
{
register int t1, t2;
asm("data:;add %0, %1, %1":"=&r"(t1):"r"(t2));
}

のようなソースであったとして、参照指定された外部変数dataは
asm文中のdataラベルと関係があるようなのですが、文法的な相互関係が
よくわかりません。data変数はexternを外して実際にそこに定義すると
エラーとなります(変数の再定義エラー)。つまりasm文中のdataラベルが
変数(?)のように扱われているようなのです。gccのマニュアル等色々
調べたのですが結局わかりませんでした。
どなたかお分かりでしたら、ご教授ください。
gccのインラインアセンブラを使用しているのですが、
ラベルと外部変数の関係がわからず悩んでいます。
例えば、
extern short data[];

void func(void)
{
register int t1, t2;
asm("data:;add %0, %1, %1":"=&r"(t1):"r"(t2));
}

のようなソースであったとして、参照指定された外部変数dataは
asm文中のdataラベルと関係があるようなのですが、文法的な相互関係が
よくわかりません。data変数はexternを外して実際にそこに定義すると
エラーとなります(変数の再定義エラー)。つまりasm文中のdataラベルが
変数(?)のように扱われているようなのです。gccのマニュアル等色々
調べたのですが結局わかりませんでした。
どなたかお分かりでしたら、ご教授ください。
連投する奴には教えない
変数ってイメージとしては特定の番地に名前を付けたものだからね。
リンカが云々とかは別として。

番地に名前を付けるという意味ではラベルも同じで、メモリー上の
コード列の内の特定の場所に名前を付けることだから。

インラインアセンブラを用いて定義されたdata:に続く機械語列
をshortの配列と見なしてそこを参照してるわけでしょう。

externを外したらそりゃあエラーが出るでしょう。
dataという名前のシンボルが2つあるんだから。
gccのインラインアセンブラを使用しているのですが、
ラベルと外部変数の関係がわからず悩んでいます。
例えば、
extern short data[];

void func(void)
{
register int t1, t2;
asm("data:;add %0, %1, %1":"=&r"(t1):"r"(t2));
}

のようなソースであったとして、参照指定された外部変数dataは
asm文中のdataラベルと関係があるようなのですが、文法的な相互関係が
よくわかりません。data変数はexternを外して実際にそこに定義すると
エラーとなります(変数の再定義エラー)。つまりasm文中のdataラベルが
変数(?)のように扱われているようなのです。gccのマニュアル等色々
調べたのですが結局わかりませんでした。
どなたかお分かりでしたら、ご教授ください。
gccのインラインアセンブラを使用しているのですが、
ラベルと外部変数の関係がわからず悩んでいます。
例えば、
extern short data[];

void func(void)
{
register int t1, t2;
asm("data:;add %0, %1, %1":"=&r"(t1):"r"(t2));
}

のようなソースであったとして、参照指定された外部変数dataは
asm文中のdataラベルと関係があるようなのですが、文法的な相互関係が
よくわかりません。data変数はexternを外して実際にそこに定義すると
エラーとなります(変数の再定義エラー)。つまりasm文中のdataラベルが
変数(?)のように扱われているようなのです。gccのマニュアル等色々
調べたのですが結局わかりませんでした。
どなたかお分かりでしたら、ご教授ください。
gccのインラインアセンブラを使用しているのですが、
ラベルと外部変数の関係がわからず悩んでいます。
例えば、
extern short data[];

void func(void)
{
register int t1, t2;
asm("data:;add %0, %1, %1":"=&r"(t1):"r"(t2));
}

のようなソースであったとして、参照指定された外部変数dataは
asm文中のdataラベルと関係があるようなのですが、文法的な相互関係が
よくわかりません。data変数はexternを外して実際にそこに定義すると
エラーとなります(変数の再定義エラー)。つまりasm文中のdataラベルが
変数(?)のように扱われているようなのです。gccのマニュアル等色々
調べたのですが結局わかりませんでした。
どなたかお分かりでしたら、ご教授ください。
through siru
akukin sinnsei suru?
dekirunoha resusakujoirai made.
akusitunanoha unneiga handan suru.
sizukani natta
Mac OS X で PowerPC のアセンブラをこの週末を使って勉強しようと考えています。
全くの素人ですが、とりあえず、gcc -S で勉強しようかと思います。PowerPC
アセンブラの資料は少ないので、一般的なアセンブラのテキストがあると嬉しいのですが、
良い資料はないでしょうか。
>>69
アセンブラはCPU固有の命令の集合体。なので一般的なテキストってのは
多分ないと思う。
せめて RISC 系の CPU なら似ているかなぁと思ったのですが、正直上手い勉強方法が
分かりません。x86 なマシンは持っていません。SPARC ならあるのですが。
メモリからデータを読み込んで加工して書き出す一連の流れは
どのCPUも大体同じだと思うんだけど
PowerPCって遅延スロットとかあるんだっけ?
>>69
アセンブラ自体初めてならCASL IIは?
単純化されてる分だけ簡単だし、エミュレータも出回ってるし、
テキストも多い。

ただ、CASL自体は全く実用にはならないので少し慣れてきたあたりで
なんとかPowerPCの資料を探して頑張るしかない。
>>74
実は CASL II は少し取り組んだ事があります。実際の CPU で動かないので長続き
しませんでした。満足に取り組んだ訳ではないので、もう一度最初から勉強して
みようと思います。PowerPC の資料はある事はあるのですが、私にはまだ難しい
感じでした。読めるようになるまで CASL II で頑張ってみます。
資料があるなら、
レジスタ、アドレッシング、ビット演算、フラグ、分岐なんかの知識があれば
基本的な命令は難しくないと思うよ。大抵のCPUなら。
あ、gas(モトローラ系)の記法に慣れる必要はあるね。
資料(というか仕様書)はこれです。
「PowerPCアセンブラに関するスレ」にありました。

ttp://www.mot.co.jp/SPS/html/lit/pdf/MPCFPE32BJ_R0.pdf

同じスレのこれは読みました。
ttp://www-6.ibm.com/jp/developerworks/linux/021004/j_l-ppc.html

>>77
難関はそこかなと思っています。それとどのレジスタを何に使えば良いのか、
アドレッシングも怪しいです(全然ダメですね)。
gccの出力を見るなら
・スタックフレーム(ローカル変数)へのアクセスに使用しているレジスタ
・レジスタ変数として使用するために予約しているレジスタ
は把握しておいてからの方が読みやすいかも。
あと、最適化の度合いによっては
全然別物に見えるコードになっちゃったりするから。
コンピュータの構成と設計って本でMIPSを勉強するのがいいよ。
RISCに関する基本的なことは全部載ってる。
アセンブラで簡単なソース作ってアセンブルリスト見てるとおもしろいです。
初心者にもいい勉強になるんでないでしょうか。
適当に C のプログラムを書いて、逆汗。
なんで逆アセンブル?
コンパイラにアセンブラソースを吐かせりゃいいじゃん。
>>83
82はきっと機械語と照らし合わせてるんだよ。
アセンブラを吐けないコンパイラもありますから
皆さんどうもありがとうございます。Mac OS X のレジスタの割当が書いてある
ドキュメントを見つけました。スタックフレームやバイナリファイルフォーマット
も書いてあるので、これを参考にします。

http://developer.apple.com/documentation/DeveloperTools/Conceptual/MachORuntime/index.html

>>80
spim をダウンロードしてドキュメントを色々読んでみました。PowerPC は
mips にかなり似てる感じですね。SPARC も似ているのかなぁ。
lddqu 命令の使用感レポートキボンヌ
88デフォルトの名無しさん:04/02/23 20:41
アセンブラはお腹を一杯にしてくれまつか?
食ってみろよ
(゚д゚)ウマー
(+д+)マズー
bcc5.5.1を使ってます。

以下のように
const char hello[] = { 'h','e','l','l','o' };
文字列を確保したとき、const配列なので、
読み取り専用セクションに配置されそうだ
と思いました。

読み取り専用セクションの名前は
.rdata でしょうか?

それから、このセクションは、
同じプログラムを複数起動したときに、
共有される(メモリ使用量が減る)のでしょうか?
.code
じゃないの?

>共有される(メモリ使用量が減る)のでしょうか?
されないかと
.text
AMD64向けに何かコード書いてる香具師はいないのか?
96鳥取恥丘 ◆Dream/3P/. :04/02/24 16:47
  _
  /〜ヽ
 (。・-・) オレオレ
 ゚し-J゚
>>95
さっきゅんだけどなんか質問ある?
http://pc.2ch.net/test/read.cgi/os/1074144781/

なんかrubyとかの青木さんところでチョト紹介されてたぞ。
>>92
dumpbin.exeで確認できる
>>87
たとえば、256個づつのDWORD値を加算する場合、16バイトアライメントされていないとすると、
mov esi, srcadr
mov edi, destadr
mov ecx, 16
lp:
movdqu xmm0, [esi]
movdqu xmm4, [edi]
movdqu xmm1, [esi+16]
movdqu xmm5, [edi+16]
movdqu xmm2, [esi+32]
movdqu xmm6, [edi+32]
movdqu xmm3, [esi+48]
movdqu xmm7, [edi+48]
paddd xmm0, xmm4
paddd xmm1, xmm5
paddd xmm2, xmm6
paddd xmm3, xmm7
movdqu [edi], xmm0
movdqu [edi+16], xmm1
movdqu [edi+32], xmm2
movdqu [edi+48], xmm3
sub ecx, 1
jnz lp
とすると、FP_MOVポートと、MMX_ALUが別ポートなので、ループによってアウトオブオーダーで
処理が折り込まれて、レイテンシがある程度隠蔽されるので、高速化が出来るのですが、
movdqu のペナルティ遅延がひどくて、アライメントの合っている処理(MOVDQA)と比べて、
30%くらい遅くなってしまう場合があります。
(更に言うと、128ビットオペランドでアライメントが合っていれば、レジスタに入れなくても直接演算できる)
そこに、lddquをそのままmovdquと置換(ただし、ロード側のみ、ストアは代えられない)すると、15%位、スループットが改善するようです。
まあ、アライメントをうまく合わせられればそっちのほうが良いと思います。お手軽高速化用ですね。
10099:04/02/25 09:07
>>99
sub ecx,1
の前に、
add esi, 64
add edi, 64
を入れるの忘れてました。スマソ。
101デフォルトの名無しさん:04/02/25 12:04
BCDってなんのためにあるんですか?
102鳥取恥丘 ◆Dream/3P/. :04/02/25 12:06
  _
  /〜ヽ
 (。・-・) 10進数の計算とか
 ゚し-J゚
>>102
それはそうなんですが、1バイトで10進数の一桁を
表現することの意味が分りません。具体的な使用例
見たいなのがあれば教えて下さい。
4bitで一桁ですね。
>>103
電卓
COBOLの数値表現形式の一つですので、
アセンブリ言語でBCDをサポートすると実行を高速化できます。

COBOLは、銀行などの事務計算によく使われますが、
そういうアプリケーションでは小数を扱ったときの桁落ちが許されません。
そんなとき10進数で演算できると便利なのです。
1%の金利(=0.01)というのを2進数で表してみるとわかります。
>>106
分り易い解説ありがとうございます。
昔のアーケードゲームのスコアとかではよく使われたもんだが>BCD
Intel「Pentium® 4 プロセッサおよびインテル Xeon プロセッサ
最適化命令」のレイテンシ一覧で

 ADDPD レイテンシ7、スループット2、実行ユニット MMX_SHFT,FP_MISC
 DIVPD レイテンシ4、スループット2、実行ユニット MMX_SHFT

ってありますが、これ間違いですよね?
Intel「Pentium® 4 プロセッサおよびインテル Xeon プロセッサ
最適化命令」のレイテンシ一覧で

 ADDPD レイテンシ7、スループット2、実行ユニット MMX_SHFT,FP_MISC
 DIVPD レイテンシ4、スループット2、実行ユニット MMX_SHFT

ってありますが、これ間違いですよね?
111109:04/02/26 00:51
連カキコ、すいません。
電卓のCPUはBCD計算に特化されているものだよー。

なにしろ、4ビットマイコンのくせに16桁のBCDの加減算を1命令で
できたりする(w
某社の16ビットポケコンは86じゃ遅いから、専用のBCD演算コプロを
積んでいたりする。さすが電卓屋。
少なくとも、
"Intel Pentium 4 and Intel Xeon Processor Optimization"
http://www.math.grin.edu/~walker/courses/211.fa01/pentium-4-optimization.pdf
のTable C-2によると、

ADDPD xmm, xmm 4 2 FP_ADD
...
DIVPD xmm, xmm 62 62 FP_DIV

になっている。
>>110
日本語と英語のマニュアルでは、CVTxxx命令、割り算命令が違ってるね。
間違っているのは日本語のマニュアルの方みたいだけど。
>>110
日本語マニュアルは、急いで作ってるのかタイプミス多いし、
コピペして作ってあるところが多くて、
ひとつ間違ったら連続で間違っている場合が結構ある。
(だから逆に間違いが分かりやすいという話も有る・・・)
それと、Xeon込みで無い時の
「Intel Pentium4プロセッサ最適化リファレンスマニュアル」
だと、ADDPS,DIVPSのレイテンシ、スループットには、
正しい値が記述してあるので、版を更新する際にエンバグしたと思われ。

それでも、AMDと違ってちゃんと日本語マニュアル作ってるだけ全然良い。
ただ、
http://www.intel.com/technology/itj/q12001/pdf/art_2.pdf
みたいな周辺資料の日本語版が無いのはなんでだろう…。
突っ込んだ最適化をするときは結構重要なのだけど。
116鳥取恥丘 ◆Dream/3P/. :04/02/26 10:27
  _
  /〜ヽ
 (。・-・) 日本語のPDFにHTの使い方書いてないよね・・・
 ゚し-J゚
>>115
それ(art_2)の日本語Web版は以前あったよね。
今はなくなってしまったみたいだけど。(こんな事もあろうかと、俺はHDDに保存しておいた)
日本スタッフはもっとしっかりしろ!ですな。
Cの?演算子(三項演算子だっけ?)はcmov系と
相性がいいだろうと思ってたんだけど、
bcc5.5.1では-6オプションを付けても
comvを使ったコードを吐きません
他のコンパイラではどうなのでしょうか?
そもそも相性が悪い?
>>118
そもそも bcc5.5.1 は cmov 系を使ったコードを吐くの?
BCCの最適化に多くを望んではいけない。
int foo(int a){
 return a ? 100 : 300;
}

をgcc -O2にかけたら、

foo:
  pushl %ebp
  movl  %esp, %ebp
  xorl  %eax, %eax
  cmpl  $0, 8(%ebp)
  sete  %al
  decl  %eax
  andl  $-200, %eax
  addl  $300, %eax
  leave
  ret

こんなの吐きました。
>>121
うちのgccではこうなるけど。

foo:
pushl %ebp
movl $100, %eax
movl %esp, %ebp
movl 8(%ebp), %edx
popl %ebp
testl %edx, %edx
movl $300, %edx
cmove %edx, %eax
ret

多分 -march を指定する必要があるんじゃない。
-O2 でもスタックフレーム確保してるの? gcc って。
-O3 でもするぞ。明示的に殺さなきゃだめぽ。
>>123
禁止しなきゃ問答無用で確保したような気がする。
だから糞なんだな
てこたぁ、別フラグなのかな。
分かりやすいっちゃぁ分かりやすいけど、
面倒いっちゃぁ面倒いな。
-fomit-frame-pointer を指定するナリ。
-O also turns on -fomit-frame-pointer on machines where doing so
does not interfere with debugging.

って書いてあるのはどうなの?
mov ecx, DWORD PTR [esp+4]
mov edx, 100
mov eax, 300
cmp ecx, 0
cmovne eax, edx
ret

IntelC++7.1
こんなのでた。
@VC++7.1

mov eax, DWORD PTR _a$[esp-4]
neg eax
sbb eax, eax
and eax, -200 ; ffffff38H
add eax, 300 ; 0000012cH
ret   0

P4最適化すると4行目が
and al, 56
になる。
パーシャルレジスタストールがないからか。
P4では、130の方が倍速いな。
133NASM初心者:04/02/27 10:45
NASMを使い始めた初心者です。
NASMはすばらしいですね。
使っている皆さんよろしくご指導下さい
OpenWatcom1.2

   test eax,eax
   je L$1
   mov eax,100
   ret
L$1:
   mov eax,300
ret

かつての最適化伝説も今やダメポ   
135鳥取恥丘 ◆Dream/3P/. :04/02/27 14:08
>>134
マジ?
>>134
レジスタ呼び出しなので a = eax ね。
やっぱvc、intel-cがいい感じ屋根
$gcc -O99 -march=pentium4 -S -fomit-frame-pointer test2.c
foo:
cmpl $1, 4(%esp)
sbbl %eax, %eax
andl $200, %eax
addl $100, %eax
ret
.size foo, .-foo
.ident "GCC: (GNU) 3.4.0 20040112 (experimental)"
3.4だとこんなんなりました。
ところでPC-UNIX界の人(例えばlinus)ってGCCの最適化に文句垂れるの
多いけど、だったら自分らで少しは開発に貢献すればいいのにな。
カーネルのつまらないチューニングなんかより、これの方がよっぽど
価値がありそうなもんなのに。
注文つけた奴が貢献しなくちゃいけないってことはない
そんなこと行ったらLinuxの一般ユーザーは、全員
羊のように大人しくしなくてはならなくなる
ライナス新じゃったらもうだれもよりつかないね>Linux
かわいそうに
>>139
餅は餅屋。って事で、
コンパイラの事はコンパイラ屋さんに任せておくのが
一番確実なのですよ。
>>139
そういう「嫌なら使うな」式の思考停止すんなって
Borland CとDigital Mars Cの結果うpキボンヌ
foo:
cmpl $0, 4(%esp)
movl $300, %edx
movl $100, %eax
cmove %edx, %eax
ret
gcc-3.3.3 -Os -fomit-frame-pointer -march=pentium4
オプションやバージョンで結構変わるみたい。
gccもいい感じやね。
gccが16ビットコードはいてくれればマイ日曜PG的には最高
なんだよなー
>>146
つーかOpenWatcomが期待外れだったつーか。
じつはデバッグモードだったとかいう展開きぼん。
fsレジスターつかうコートはくのは
どのこんぱいらー?
検索しろ
同じレジスタを連続して使うのはあまり賢くないような。
151デフォルトの名無しさん:04/02/27 23:14
・Digital Mars 32bit (dmc -mn -6 -o+all -c foo.c)
_foo:
  cmp     dword ptr 4[esp],1
  sbb     eax,eax
  and     eax,0c8H
  add     eax,64H
  ret

・Digital Mars 16bit (dmc -ms -2 -o+all -c foo.c)
_foo:
  push    bp
  mov     bp,sp
  cmp     word ptr 4[bp],1
  sbb     ax,ax
  and     ax,0c8H
  add     ax,64H
  pop     bp
  ret

・Open Watcom 32bit (wcc386 -6r -ox foo.c)
>>134

・Open Watcom 16bit (wcc -2 -ox foo.c)
foo_:
  test    ax,ax
  je     L$1
  mov     ax,64H
  ret
L$1:
  mov     ax,12cH
  ret
152鳥取砂丘 ◆Dream/3P/. :04/02/27 23:25
Digital Mars 32bitのコードに寒気を覚えた。
折れの脳内トランスレータじゃとてもそんなコード吐けない orz
なんか後付けっぽく嫌なんだが、おれが考えなし
に書いたらdmcのコードにする。

ここの常駐人もだいたいそうだと思うんだが
こうして見るとOpenWatcomの遅れぶりがめだつな
関数呼び出しを定義できるくらいしか、面白みないな

コードジェネレータのソース読んでみたけど全然
わからんし・・・
155鳥取砂丘 ◆Dream/3P/. :04/02/27 23:42
最適化ほとんどできないヘタレプルグラマなんでorz
コテは放置が基本だorz
つか鳥取砂丘って共有コテって聞いたけど?
orzてなに?
あ、わかりました。一秒長く考えるべきでした。
orzてなに?>>159
>>153
150のとおり、依存関係バリバリのコードは
賢くないよ。レジスタに使用に制限があるなら別だが。
↑「に」が1個多いね
主張はコードでよろしく。cmovはだめだかんね
なんでcmovccはだめなの?
はっきり言ってこちらが聞きたい。
なぜ使ってよいのかと。
167鳥取砂丘 ◆Dream/3P/. :04/02/28 00:32
AMD64ならcmovバンバンOKですYO?
あーでももともとはcmovの話だったのかー御免
じゃ使ってもいいよな。>>166も俺が悪かった

でも俺はcmovが使いたくないし、たぶんdmcのコードを
使うと思う
こんなやり方が正しいがわかりませんが、それぞれ10万回ループさせて
クロックを計測してみました。(引数ロードとret部分は削除)

lp1:
mov edx, 100
mov eax, 300
cmp ebx, 0
cmovne eax, edx
sub cx, 1
jne lp1

lp2:
neg eax
sbb eax, eax
and eax, -200 ; ffffff38H
add eax, 300 ; 0000012cH
sub cx, 1
jne lp2

Pentium4でlp1は真でも偽でも大体20万クロック、lp2が27万クロックでした。
お手数じゃなかったらこれ計ってみて
L1が.codeにくる感じで

.code
mov eax, [esp+4]
cmp eax, 1
sbb eax, eax
mov eax, [L1 + 4 + eax*4]
ret

align 4
L1 dd 300, 100

>>121 をbcc32でコンパイル
_foo proc near
; int foo(int a){
@1:
push ebp
mov ebp,esp
; return a ? 100 : 300;
cmp dword ptr [ebp+8],0
je short @2
mov eax,100
jmp short @4
@2:
mov eax,300
; }
@5:
@4:
pop ebp
ret
_foo endp

OpenWatcomもBCCには何とか勝った模様。
bcc...
>>169
lp1は入力ebxと出力eaxが別々で、入力ebxはずっと固定で出力eaxに依存していないのに、
なぜlp2は入力と出力が同じeaxで、入力が出力に依存しているのか。
なぜループカウンタcxで10万回回せるのか疑問におもた。
lp2の方は、cmovやjccを使わない方法だから使われるレジスタは
eaxだけになっちゃうよ。
cxはおかしいな。
175デフォルトの名無しさん:04/02/28 08:25
やってみた
アスロン 1GHz(サンダーバード)で lp1が30万、lp2が40万だった

;MASM32を使用
;ml /c /coff test.asm
;link /subsystem:console test.obj

.686
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib

.data
format db "%010u",0dh,0ah,0
.code
176デフォルトの名無しさん:04/02/28 08:26
;続き
start proc uses ebx edi
LOCAL buf[16]:BYTE,readsize,stdout

invoke GetStdHandle,STD_OUTPUT_HANDLE
mov stdout,eax

rdtsc
mov edi,eax
mov ecx,100000
lp1:
mov edx, 100
mov eax, 300
cmp ebx, 0
cmovne eax, edx
sub ecx, 1
jne lp1
rdtsc
sub eax,edi
invoke wsprintf,ADDR buf,ADDR format,eax
invoke WriteConsole,stdout,ADDR buf,12,addr readsize,NULL

177デフォルトの名無しさん:04/02/28 08:26
;続き
rdtsc
mov edi,eax
mov ecx,100000
lp2:
neg eax
sbb eax, eax
and eax, -200 ; ffffff38H
add eax, 300 ; 0000012cH
sub ecx, 1
jne lp2
rdtsc
sub eax,edi
invoke wsprintf,ADDR buf,ADDR format,eax
invoke WriteConsole,stdout,ADDR buf,12,addr readsize,NULL

invoke ExitProcess,0
start endp
end start
178169:04/02/28 08:33
>>173
cxは間違いです。
ecxに書き直してもう一度やってみました。
結果はlp1が30万、lp2が70万でした(値が安定しなかったのでHTをOff)
ということで、cmovを吐くコンパイラの勝ちということで
終了
cmovて何?
Pentiumにあた?
↑シーラカンス
プログラム言語知識まったく無しなんだけど逆アセンブラ勉強したいのだけど
初心者でもわかる本教えて下さい
本なんてありません
いまやP6以降のプロセッサが主流なのに、
頑なに元祖386由来の命令に拘る理由って
なんなんでしょ>コンパイラ作ってる人
>>182
わざわざ本を買う必要はありません。
初心者が勉強する程度なら、ネット上の解説や資料で十分。
>>184
ここにいる素人には永遠にわからんよプゲ
初心者の勉強に最適なネット上の解説や資料ってどこにありますか?
ハカーキタ━━━━━━(゚∀゚)━━━━━━ !!!!!
>>187
>>187=>>182だよね?
逆アセンブラということは、恐らくゲームの解析とかだろうから、
とりあえず、下のサイトへ。
色々な資料やツールへのリンクもあるし。

http://gamereverserz.cjb.net/
190118:04/02/28 14:45
ところどころわからないのがある
(cmovを使う使わないとか依存がどうこうとか)
のですが、cmov系の勝ちで終了ということだそうで
みなさんありがとうございます

>>119
bcc5.5.1 が cmov 系を使ったコードを吐くのは
私はみたことないです
cmovに限らずmmxやxmmレジスタを使うコードも
みたことがないです
他のコンパイラはきちんと使うんでしょうか…

>>171
bcc32のコードの例示わざわざありがとうございます
わたしがするべき苦労でした

ところで、ゼロがどうかをチェックするところで
test系 gcc, OpenWatcom
cmp系 gcc, IntelC++, DigitalMars32
とわかれているようですが、ここって何か
意味がありますか?たんなるコンパイラのクセ?
文章の真意がそのカッコの中に書かれたことにあると思い込むのは
間違いですね。本当のことは行間にかかれているのに。
192デフォルトの名無しさん:04/02/28 15:00
>>186
教えてください。Pen3,4と指定してコンパイルする分には
cmovを使うことになんの問題もないように思いますが。

cmpもtestもそれぞれ意味があって使いわけてる
ように見えるけど
そろそろスレ違いな話題はやめましょう。
195190:04/02/28 15:21
>>130で IntelC++7.1 は
cmp ecx, 0
とあるけど
test ecx,ecx
ではないのは何故なんでしょうか?
どんな使い分けの意味があるのかなと思いました

>>176
sub ecx, 1
とあって
dec ecx
にしないのはレジスタの影響が少ないので
subの方が推奨されるそうですが、
cmpとtestもそんな意味があるのでしょうか?
inc/decはフラグのストールがある
スレ違いじゃないと思うから続けるべ

>>195
ん。見落としてた。正直理由はわかりません

>>cmpl $0, 4(%esp)
  
こういうのはtestにできないって事ぐらいの意味
>>192
わざわざ上げんな。晒してるつもりか?
>>198
ba-ka
200デフォルトの名無しさん:04/02/28 15:41
メール欄に書き込むのが面倒なだけじゃねーの。
249 マロン名無しさん sage 04/02/28 14:25 ID:???
●やさしい煽り学

文字で何と書いてあるかではなく書いた人間が一体何を狙って
そこにその文章を書いたのかを考える。
文字自体はほとんど読む必要がない。
なぜなら彼の本当の狙いは文字としては書かれていない。
狙いが分かったら後はそれを失敗させる。

? 「狙い」の典型的なパターン
場の雰囲気を悪化させたい。
誰かのやる気を無くさせたい。
誰かと誰かの関係を悪化させたい。
煽りに反応させることで相手の人望を失わせたい。
それらを為すことで自己顕示したい。

煽る人間はその行為によって何かが変わって欲しいと考えている。
従って先方からしてみれば反論だろうと罵倒だろうと
とにかく誰かから何らかの反応を引き出せたら成功であるということに注意しなくてはならない。
最も多くのケースを効果的に解決できる手段は、安易ではあるが、「全員一致での無視」である。
もし不幸にも煽りに対して真面目に反応してしまう人間が身内にいるなら
何とかしてその人間を黙らせなくてはならない。
そういった中途半端な味方は煽り本人より厄介である。
また、煽りという手法をよく知る人間にとっては、
煽りに対して真面目に反応している人間というのは極めて無様に写ることにも注意すべきである。
もしあなたが既に人望を持つような立場の人間であるなら、
全ての煽りに対して常に冷酷に対処しなくてはならない。

>>201
ヘタレ
最近このスレ荒れやすくなったと思わないか?
春が近いからこんなもんだろう。
他のスレも変なの増殖してるっぽいし。
205173:04/02/28 19:08
俺が言いたかったのは、lp1とlp2では計測している時間の意味が全く異なるって事。
lp1が計測しているのは三項演算子のスループット。
lp2ガ計測しているのは三項演算子のレイテンシ。
lp2と同じ意味(レイテンシ)でlp1を計測するのであれば、
次のように三項演算子の出力が次の三項演算子の入力になるようにしなければならない。

lp1:
cmp eax, 0
mov edx, 100
mov eax, 300
cmovne eax, edx
sub ecx, 1
jne lp1
206153:04/02/28 19:32
俺のせいで荒れちゃったのかな。
マジで誤ったつもりなんで、まったり進攻にもどって下さいよ

まぁそれは別として、コンパイラの吐くコードの品評は
なかなか面白いな
207153:04/02/28 19:36
s/進攻/進行/g
>>205
上にあったICCの出力を参考にしてるんじゃない?

mov ecx, DWORD PTR [esp+4]
mov edx, 100
mov eax, 300
cmp ecx, 0
cmovne eax, edx

入力がecx(あれ?)で出力がeaxになってるよね。
>>195
Pentium4の場合、cmpはポート0とポート1どちらでも発行できるが、
testはポート0でしか発行できないから。
210195:04/02/28 21:28
>>209
む、むずかしい…
ポート0とポート1のどちらでも、とか
ポート0のみ、とかって、つまり、
計算する部品はいくつかあるけど
それらの部品には対称性がないので
どの部品でも計算できるcmpの方が
特定の部品でしか計算できないtestよりも
都合がいいということでしょうか?

それから、もしよろしければ、ポートとかについて
参考サイトとか参考pdfとか教えてください
a:
rdtsc
mov dword ptr t1, eax
mov dword ptr t1 + 4, edx

cmp eax, 0
mov edx, 100
mov eax, 300
cmovne eax, edx

rdtsc
mov dword ptr t2, eax
mov dword ptr t2 + 4, edx

b:
rdtsc
mov dword ptr t3, eax
mov dword ptr t4 + 4, edx

neg eax
sbb eax, eax
and eax, -200
add eax, 300

rdtsc
mov dword ptr t3, eax
mov dword ptr t4 + 4, edx

===================

a=88clock、b=92clock。a,bの順番を逆にしても同じ。
Xeon HT-OFF
212211:04/02/28 21:40
○t4 + 4
×t3 + 4
クロックはかるまでも無く、cmov使った方が当たり前に
速いと思うんだけど

ついでに言うとwinなりlinuxなりではかっても、参考値
ぐらいにしか思えない
↑バカ?
↑バカ
>>210
http://developer.intel.com/design/pentium4/manuals/248966.htm
これの1-18ページにPentium4のポートの説明図が書いてある。
cmpはADD/SUBに属する命令。testはLogicに属する命令。

このマニュアルを見ててマニュアルの間違いに気が付いた。
1-17ページにはポート1のALUでもlogic or branchが実行できるみたいに書いてあるけど、
これは間違い。
JPEG/MPEGでおなじみのDCT演算をSSEで組んでみました。小数点演算はナシで、
wordの整数演算のみで組んでみたのです。バタフライ演算とかいうやつですね。
100万回ループさせてタイムを計ると、mmxで真正直にDCTを計算させたものより
4割近く遅いし、コードもデカイ。いいことなしです。

さて問題です。どうすればPen4でDCTが速くなるでしょうか?

1. コードが増える整数演算は止め、固定小数点あるいは浮動小数点演算を行う。
2. 同様にコードが増えるバタフライ演算をやめ、真面目にDCTを実行する。
3. バタフライ演算かつ整数演算でも早くなる。精進しろ。

3案のうちどれが適切でしょうか。ただし、根拠のない3はお断りです。ソースコードがあれば参考にしたいですね。
まずお前がコード提示しろ
>>216
4.ここにある「ストリーミング SIMD 拡張命令2 (SSE2) を使用した逆離散コサイン変換」を
 参考にしてみる。
http://www.intel.com/jp/developer/download/index.htm
宿題スレのノリだな
221デフォルトの名無しさん:04/02/28 23:10
>>213
分岐予測が当たる場合は、cmovよりは速いから全ての代入のための分岐を
cmovで置き換えるのはいただけない
突然一般論を持ち出すな

いまの話題になにも分岐予測に関する前提条件がないわ
・・・春が近いな
              ry、
             / / }
           _/ノ.. /、
           /  <   }
      ry、     {k_ _/`;,  ノノ パンパン
    / / }      ;'     `i、 
   _/ノ../、   _/ 入/ /   `ヽ, ノノ
  / r;ァ  }''i" ̄.   ̄r'_ノ"'ヽ.i   ) ―☆
 {k_ _/,,.'  ;.  :.      l、  ノ  
    \ `  、  ,i.    .:, :, ' / / \
     ,;ゝr;,;_二∠r;,_ェ=-ー'" r,_,/   ☆


【ラッキーレス】
このレスを見た人はコピペでもいいので
10分以内に3つのスレへ貼り付けてください。
そうすれば14日後好きな人から告白されるわ宝くじは当たるわ
出世しまくるわ体の悪い所全部治るわでえらい事です


225210:04/02/29 15:17
>>216
Figure 1-4
Execution Units and Ports int the Out-Of-Order Core
の図をみました
おっしゃっていたのはここのことだったんですね

ところでこの図では、Por1のFP_Executeのところに
MMXの記述がありますが、ここには
SSE/SSE2/SSE3も含まれているのでしょうか?
1-17に
port 1 can dispatch either one floating-point
execution (all floating-point operations except
moves, all SIMD operations) μop
とあります
>>217
SSEで、単に組んでも、MMXよりスループット、レイテンシ共に遅いので、高速化は出来ない。
>>216さんが書いている資料などを見て、アウトオブオーダーで効率よく
命令ユニットが平行動作するようなコードを書いて初めて、SSEなりの利点が出る。
また、DCT演算は、整数より、実数のほうが早く実行できる可能性が高い。
(有効制度が結構必要だからね)ので、実数演算がお勧め。
ちなみに、アウトオブオーダーを使った高速化を突き詰めてしまうと、
AMD64ではポートの構造が違うので、殆どの場合相当に遅くなるので注意。
386以降で4バイトのnop相当ってないですか?
nop4つでもかまわないんですが。
8D 44 20 00 : lea eax,[eax+0]
Opteronのマニュアルを見たら、コードパッディングの方法にこんなのがあったけど、
 66 66 66 90 (NOPの前に66hプリフィックスを3つ重ねる)
これってどんなx86プロセッサでも問題なく動くの?
nop
nop
nop
nop

より

lea eax,[eax+0]

とかが使われてるのは何でだろう?逆アセがすっきり
するので、見やすいけど。

>>229
8086、80286不可
プロテクトモードならOKなのか?
>>230
そりゃ、デコーダの消費も実行ユニットの消費も少なくて済むからでしょう
http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/25112.PDF
こっちのP.85にはNOPの前に複数の66hプリフィックスを重ねろとか書いてあるのに、

http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/24592.pdf
こっちのP.86には同一グループのプリフィックスを複数指定した場合は、不定であると書いてある。
Pentiumのマニュアルにも同じ事が書いてあった。
ありがとうざいます。
プリフィックスについてはよくわからないので、
lea使ってみます。
235鳥取砂丘 ◆Dream/3P/. :04/03/03 01:46
pause命令って2バイトnopなんだよね。アレプレフィックス一杯つけたらどうなるんだろう
236デフォルトの名無しさん:04/03/03 01:58
winXP sp2ではPAEモード(64Gのメモリが使えるやつ)がデフォルトになるの?
もしそうなら、パフォーマンスが落ちたりしないのかな
237鳥取砂丘 ◆Dream/3P/. :04/03/03 02:41
PAEがデフォルトになるのは64bit版だけじゃないの?
238名無し@沢村:04/03/03 06:38
>>217
DCT演算ならCASLUで業務用アプリを組んだときに、使ったことがあるよ。
239236:04/03/03 07:03
ttp://www.microsoft.com/japan/msdn/windows/windowsxp/securityinxpsp2.asp
ここの「SP2でのメモリ保護」をみるとSP2で搭載される"実行保護"とやらはNXビットを使ったもののようです。
それでAMDのAthlon64の資料を見るとレガシーモードでは、NXビットはPAEモードのPage Table Entry(PTE)にしか無いんですよね。
(非PAEの4kページPTEには空きビットがないため?)
なのでPAEモードがデフォルトになるのかなと思ったのですが。
240鳥取恥丘 ◆Dream/3P/. :04/03/03 09:45
AMD64のPAEでしか使えないから32bitプロセッサ積んでるなら関係ないんじゃない?
>>239
レガシーモードのページング方式はK8からいくつか追加されたけど、
従来型の4kニ階層のやり方ではNXビットなど置くスペースはPTEにはないかと。
XPSP2での拡張は新しいページング方式と一緒に使わなくてはならない。
物理メモリ搭載量が例え4Gよりはるかに少なかったとしても。
っていうか、NXビットってCPUが見るフラグでしょ。
置く置かないの問題ではないよね。
>>242
いやだからCPUのプログラムインタフェイスの設計の問題として
244AMD命:04/03/03 16:37
これはインテルの陰謀に違いない。
K8でのみPAEをイネーブルにしてK8のパフォーマンスを落とすつもりだ。
ページディレクトリが2→3階層になることで
どれぐらいパフォーマンス落ちるのかな。
自作板だと元麻布って人がPAEでパフォーマンスが落ちる
なんて書いてるから、そう思ってるひとも多いだろうけど。
メモリ空間が広大になったからといって、それらをランダムに
アクセスするわけじゃなくて、ある局所的な領域をなんども
参照するだけだろうからそんなに負担にもならないような。
まあ、こればっかりはカーネル弄ってるひとしか分らないか。
>>243
IA-32eの資料では、ページエントリの63bit目をReservedにしてあるよ。
多分将来NXビットが入ると思われ。
ということは、AMD64かIA-32eなCPUではPAEをイネーブルにして、それ以前のCPU
ではディセーブルになるのかな。
ということでは。
WinXP sp2でいうAMD64のPAEは新しい64bit長のエントリを持つもの。
これまでのPAEとは違う。
これまでもPAEのときはエントリは64bitだったよね。
上位ビットは大部分が使われていないけど
>>245
自作板では元麻布の記事は信用されていませんが。

【淫厨】妄想ライター元麻布春男を語るスレ【信者】
http://pc3.2ch.net/test/read.cgi/jisaku/1077161594/
>>248
あまり変わってないと思うが。
NXビットとの追加と物理アドレスが36bitから51bitになっただけだよね。
あとPAEじゃないけどPSE-36がPSE-40(?)になってる。

>>245
IA-32インテルデベロッパーズ・マニュアル下巻の3-29ページによるとPAEの
ページ・ディレクトリ・ポインタ・テーブル・エントリ(PDPE)はキャッシュされないみたい。
ひょっとしたらPDPE用のTLBも無いのかもしれない。
だとすると、かなり遅くなるような気がする。
252デフォルトの名無しさん:04/03/04 09:49
>>251
もともとTLBって、最下層のエントリしか保持してないよね。
253デフォルトの名無しさん:04/03/04 09:53
>>252
>プロセッサは、直前に使用されたページ・ディレクトリ・エントリとページ・テーブル・エン
>トリをトランスレーション・ルックアサイド・バッファ(TLB) というオンチップのキャッシュ
>に記憶する

って>>245の資料に書いてあるけどー
そうなの?
さっきのやつの3-33ペ−ジに
「プロセッサは、直前に使用されたページ・ディレクトリ・エントリとページ・テーブル・エン
トリをトランスレーション・ルックアサイド・バッファ(TLB) というオンチップのキャッシュ
に記憶する」
って書いてあるんだけど。
255デフォルトの名無しさん:04/03/04 09:54
ごめん、>>251の資料の間違い
256デフォルトの名無しさん:04/03/04 09:55
かぶったw
257251&254:04/03/04 09:58
思いっきりかぶっちゃったね(´ー`)
258デフォルトの名無しさん:04/03/06 14:11
xor eax, eax
mov al, byte ptr[ecx]

と、

movsx eax, byte ptr[ecx]

ってどっちが速いんでしょうか
サイズは前者が4、後者が3ですけど
>>258
xor+movの方が速かったはず。
検証してくれる人よろしく。
っていうか xor するなら movzx じゃね?
261デフォルトの名無しさん:04/03/06 16:19
そうです
movzxの間違いです…

え、
あーいや、なんか認識間違いっぽいです
符号拡張して欲しいし。
つーことはxorに変換するっての間違ってるわ、これ(w
movsxしかないじゃん

すんません終了〜
>>261
しかし禿げしく気になるので試してしまった。
Pen4 2.8G、XP ProSP1、BCC5.6.4

ループのアンロールは16回

movzx = 9619
xor = 9564

movzx = 9297
xor = 9615

movzx = 9680
xor = 9333

Pen4ではあまり差がない。Partial Register Stallがないせいか。
Pen3だと結構差が出る予感なんだが。
classic-pentiumあたりならxor+mov推奨
pentiumiiiあたりならmovzx推奨
>262
xorやsubでクリアした後は、パーシャルレジスタストールは起こらないよ
>>264
そうでしたかスマソ。そしたらP3環境でも似たような結果?
P3とP4の速度差は、ペナルティではなくて、デコーダと
マイクロアーキティクチャの違いによるものでしょう。
(P3のデコーダの性質上の物でもあるかな?)
MOVZX非対応のCPUの場合XORを使う手法が必須ですが、
それ以外では、原則MOVZXやMOVSXで良いでしょう。
いまどきmovzx非対応CPUって・・・
movzxは386で搭載されたから、32ビットOS上でなら無条件で使えるでしょ。
ペンティアムはmovzxが遅いので、ターゲットのCPUがペンティアム2以降かどうかで、
どっちにするか決めればいいんじゃない。
仮に、movsxがなかった場合はどうすんの?
>265
念のためPen3で測定してみたよ
@Win2K VC++7.1インラインアセンブラ RDTSC使用でクロックを計測 loop命令で1000万回ループ

movzxの方が1処理あたり0.3クロックくらい速い。いや、xorが遅いと言うべきか。
アンロール数を増やすとそれに反比例して差が減っていく。
20回で0.15クロックくらいになるよ。

P4でも試したけどほぼ同じだった。
>>245
Windows 2000 Advanced ServerでPAE on/offで比較してみました。
PAE on/offの確認の為、とあるツールで読み出したCR4の値も書いておきます。

SuperPI 104万桁, Pentium II
7分56秒 : PAE on (CR4=000000F1)
7分54秒 : PAE off (CR4=000000D1)

SuperPI 419万桁, Pentium 4
10分38秒 : PAE on (CR4=000006F1)
10分37秒 : PAE off (CR4=000006D1)
>>269
or eax,-1
mov al, byte ptr[ecx]
かな?
あ、これだとパーシャルレジスタストールが起きるか。

>>271
ほとんど変わらないってこと?
でもSuperパイってメモリ読み込み以外の部分が大きいから、あまり参考にならないかも。
>>272
>or eax,-1
>mov al, byte ptr[ecx]

alが0x00〜0x7fだと正しく符号が拡張されないヨカーン。
mov al, byte ptr [ecx]
cbw
だと、パーシャルレジスタストール起きちゃうのかな?
275271:04/03/09 10:06
>>272
SuperPIは多倍長乗算にFFTを使っており
ビット逆順アクセス処理にランダムメモリアクセスを伴います。
このため、メモリアクセスには敏感なソフトだと思います。
試しにEDO DRAMのメモリセッティングを変更した場合の結果を書いておきます。

SuperPI 104万桁, Pentium II, PAE off
7分54秒 : EDO DRAM 60nsセッティング
8分50秒 : EDO DRAM 70nsセッティング
276271:04/03/09 10:09
自分でちょこっとテストコードを書いて試してみた感じでは、
TLBヒット時のメモリアクセスはPAE on/offで全く差はなし。
PAE onでもTLBはきちんと機能するようです。
TLBミス時のメモリアクセスは、PAE onの場合はPAE offより数クロック増えるようです。

>>251のPDPがキャッシュされないという件を確かめてみようといろいろと試してみましたが(
アドレス40000000hより前と後のアドレスを交互にアクセスして遅くなるかどうか等)、
結局、それらしい現象は確認できませんでした。
というかTLBがないと一回のメモリ参照で何回メモリアクセスが起きると思ってるんだ?
TLBエントリを余計に消費する可能性は?
K8のレガシーモードにはページサイズ2MBの変換方法もあるよ。
Windowsはこれは使わないのかな。これならディレクトリは2階層だけど。
だけどページサイズはいろんなところに影響及ぼしそうだ。
あと386からの伝統的なページエントリと違って
エントリのサイズが8byteになってることの影響って
あんまり関係なし?TLBのサイズが沢山必要に思えるのは
素人だからだろうか。
>>279
使っているうちに、メモリのいたるところで大きな穴が開く。
今の時代でも2MBは大きいんじゃないかな。
  _
  /〜ヽ
 (。・-・) 。oO( >>278 TLBが足りないならTLBを増やせばいいじゃない
 ゚し-J゚
283デフォルトの名無しさん:04/03/10 01:53
隊長!Athlon64のインストラクションマニュアルが見つかりません!
URL教えてください!
  _
  /〜ヽ
 (。・-・) 。oO( >>283 検索もできねーやつは書き込むなorz
 ゚し-J゚
  _
  /〜ヽ
 (。・-・) 。oO( >>283 日本語のマニュアルなんてどこにもないから英語読めない香具師は諦めるしかない
 ゚し-J゚
286デフォルトの名無しさん:04/03/10 02:04
  _
  /〜ヽ
 (。・-・) 。oO( 誰が日本語でと言ったんだろうorz
 ゚し-J゚
  _
  /〜ヽ
 (。・-・) 。oO( 日本語マニュアルほしいから聞いてるんじゃないの?
 ゚し-J゚
288デフォルトの名無しさん:04/03/10 02:30
  _
  /〜ヽ
 (。・-・) 。oO( 誰も日本語とか言ってねぇよ、えいご読めないのはお前なの!w >>287
 ゚し-J゚
  _
  /〜ヽ
 (。・-・) 。oO( 喪前の事を少々見くびっていたようだ。スマンカッタ
 ゚し-J゚
AMD64
http://www.amd.com/us-en/Processors/TechnicalResources/0,,30_182_739_7044,00.html

IA32-e
http://www.intel.com/technology/64bitextensions/

IA32-eで追加された命令
CMPXCHG16B m128
MOVZX r64, r/m32

MOVZX r64, r/m32 についての疑問
32bit演算すると上位32bitはゼロ拡張されるはず。
MOV r32, r/m32 ではいけないのか。
MOVZX r64, r/m32 を使うメリットはあるのか。
>>290
素晴らしい!
サンクス
292290:04/03/10 07:05
>>290
間違えたIA32-eじゃないIA-32eだ
293デフォルトの名無しさん:04/03/10 08:00
>>290
32bit演算なら上位は保存されるんじゃないの?
386移行のときは割りこみで上位16bit破壊されて難儀したな
まぬある見ずに言う

lea r64. [r32]
>>290
いままでも、1つ目のオペランドは2つ目オペランドの
倍のサイズだったと思うが。
は?
>>290
マニュアルを見る限り、どうもIA-32eとAMD64で命令の食い違いがあるみたいだね。

REX.W + 0F B7 /r は
 IA-32eでは MOVZX r64,r/m32
 AMD64では MOVZX r64,r/m16

REX.W + 0F BF /r は
 IA-32e,AMD64共に MOVSX r64,r/m16

おそらく、IA-32eのMOVZXの記述が間違い(マニュアルのミス)だと思う。
MOVZX r64,r/m32 という命令は存在しないと思う。
298290:04/03/10 09:55
>>297
サンクス
結構マニュアルのミスあるみたいですね。

MOV r/m64, imm32 (32bit即値の符号拡張)も
IA-32eのマニュアルでは、32bit即値のゼロ拡張になってるし。
全然関係ないけど、movdの一つ目のオペランドの上位ビットが
0クリアされるのがムカツク。余計なことを
>>299
多分
movd レジスタ, メモリ
の場合を言っているんだろうけど、
ゼロクリアされないと、レジスタの余計な依存関係が発生して、
スケジューラにかなりの負担が掛かるので却下。
(例えば、レジスタを部分的に残してしまう movhpd とかは、
使うタイミング間違うとかなり面倒な依存関係が起きて
パフォーマンスの低下を招く)
同じ理由で、中途半端にフラグの変化する
inc,dec も、P4以降では使わないほうがいい。
gccのインラインアセンブラの文法がよく分からないのですが、詳しく書かれているサイトや本などありませんか?
>>299
同感。
Aviutlのデータ、ダブルワードにして欲しい。
>>301
asm文のことならMinGWスレにも
http://pc2.2ch.net/test/read.cgi/tech/1042611308/501-600

movlとかがわからないのなら、

gcc -masm=intel -S -fverbose-asm -o test2.S test2.c

とすると、intel形式が使えます。%%eaxとかしなくてもいいです。
少し前のgccだと、

-mcpu=i386:intel

で使える場合もあるし、ダメな場合もある。
305デフォルトの名無しさん:04/03/13 09:38
な、なんだってー(AA略
306304:04/03/13 10:39
i386:intelはobjdumpとかで使うターゲットの名前でした。スマソ
307デフォルトの名無しさん:04/03/13 23:39
アセンブラにできて、Cにできないことって何でしょう。
ちょっと列挙してくれるとありがたいです。
プロセッサの特権命令の利用とか。
in/out, int
ハード叩くときに、ローテート出来ないのをなんとかしてほしいと思うことがある。
ビットシフトでがんばればいいんだけどね。
ほとんどのまともなCPUがローテート命令持ってるのに未だにCにローテートが無いのは何故なんだろう
ビット数に依存してるから.・・・とか?

もしCにローテートいれるとしたら演算子はどんなが
いいかな
右ローテート ><
左ローテート <>
他言語の否定と紛らわしいかな。
その演算子だと右だか左だかわかりにくw
右 >><
左 <<>
これでどうだ!
316デフォルトの名無しさん:04/03/14 10:11
<|
|>

シフトしてORをするという意味で
317デフォルトの名無しさん:04/03/14 10:17
記号にこだわらなくてもいいよね。
とはいえ識別子を使うとCだと予約語になってしまうわけで、
予約語が増えるよりは記号の方がいいんじゃないかと。
319デフォルトの名無しさん:04/03/14 10:37
@<と@>
@_@>と<@_@
:> <: とか。

そういやC以外でも、ローテート演算子持ってる高級言語ってないね。
・・・いや、あるかもしれないけど俺は知らない。
ローテートて、使い道ないだろ?
なんかある?
現代暗号とか組んでみようとしたときに必要だった気が・・・
キャリーを巻き込んでのローテートとかもあるよな。
ローテート命令でで掛け算をする。
ってかもう使わんか。
>>312
→⊃
⊂←
Fortran90でも標準でビット・ローテート関数があるけど
演算子はないね。
ttp://www1.jpn.hp.com/products/software/development/dvf/docs/vf-html/az/az06_47.htm

それほど使用頻度は高くなさそうなんで、Cなんかなら
必要なとこだけインライン・アセンブラで済ませれば
いいような気もするが。
>>322
シフトの桁数が多い時に、逆方向にローテートして余りをマスクする。
安物CPUには任意の桁数をシフトする命令がないのですよ。

>>327
最適化の邪魔になるのであんまし使いたくない。
PC-98のグラフィック描画で、ローテート命令はよくつかったけど。
330デフォルトの名無しさん:04/03/14 16:33
すみません。OSとアセンブラはどのような関係にあるのでしょうか。
吉野家と牛丼の関係ぐらい?
何か違うような気がする
>>330
体と心の関係
特にこれといった関係は無いと思うが。
OS の一部分はアセンブラ使って書かれると思うけど。
system call とかは?
某OSのコードだとアセンブラの部分は極一分しかなかった。
最近のコンパイラの最適化は結構賢い
昔、Cなんてのはトロい代名詞だった…
(最近はCPUパワーにおんぶされてるというのもあるが)
昔はコンパクトでかわいげがあったけど
今は顔もみたくない

関係でいえば嫁みたいなものかなぁ
見たくないけど一番の理解者
MS-DOSでは、コンパクトに.COMで作るのが好きだった
最近は全部.EXE。。。
洩れは殆んど .HEX。。。
>>329
つ|EGC|
EPSONのPC-CLUB使っていたけど、EGC付いてなかった・・・
EPSONのPC-486P使ってたけど、EGC互換で8プレーン同時書き込み出来た。
VMじゃ動かないし、EPSONで問題あるから、普通はGRCG止まりじゃない?
EGCは98でもVX21以降でサポートだと思ったけど。。。

でも、なにげにVGAはEGCほどじゃないけど、結構いろんなことが
できるんだよなー。
EGCはまだ統一されてる方だと思うけど最近はアクセラレータでしょ?
Linuxとか最初からドライバがいくつかついてると思うけど
仕様をどこで調べたんだろう。
そりゃあんた
リバーsくぁwせdrftgyふじこlp;@:
情報ってのは必ずもれるもんだぜ
PSのエミュなんてどうやって作るんだよ
VGAはVGAであって最近のビデオチップの追加機能とは別の話だろう
ARMでアセンブラは楽しい。
VGAっていうかVESAでしょ
http://black.sakura.ne.jp/~third/programming/asm/assembly.html

プログラミング等の知識0でも分かりやすかった。
このくらいの初歩から教えてくれる本ないかなぁ・・・。
初めて読む8086
初めて読むMASM
おれはこの2冊から始めたんだが、今となっては内容が古すぎるかも。
いまさらセグメントなんか覚えても役に立たないだろうしなあ。
初めて読む−>はじめて読む だった。
買うのはもったいないので図書課で借りるのがいいです。
度々すまん。
図書課−>図書館です。
念のため。
>>352
今でもあまり変わらないんじゃないかな。
他に今だと「はじめて読む486」も要るか。
まあ猛者にはIntelのマニュアルだけで十分らしいけど。
アセンブラ
アセンブリ
アセンブル
アセンブレ
アセンブロー
movaps xmm1,xmm2
addps xmm1,xmm3
より
pshufd xmm1,xmm2,11100100b
addps xmm1,xmm3
の方が速い?
>>357
シフト演算、MMX演算のユニットが空いていれば早い。
スループットが問題になる場合は微妙。
Pen4でアセンブラ高速化する際は、ポートの構造やパイプラインなど
CPUの全体を把握しないと駄目。

更に言うと、
pshufd xmm1, xmm2, 11100100b
addps xmm2, xmm3
とか、
pxor xmm1, xmm1
por xmm1, xmm2
addps xmm2, xmm3
の方が早い場合が多い。(依存性解決の必要が無いからね)
昔ここhttp://www.intel.co.jp/jp/developer/design/litcentr/index.htm
にあった日本語のマニュアル郡はいずこ?
hosyu
VC++.Netで/arch:SSE2 を有効にしたら実数演算でSSE/SSE2命令
をこれでもかこれでもかという程使いまくったコードを吐くようになっ
たが、あまり早くなった気がしねー。

実数演算がメモリを経由せず夢のレジスターレジスタ間演算になる
のでかなり早くなると期待したんだがな。
それよりも実数演算の速度は鱈セレ→北森P4にした時の方が
劇的に速くなった。物にもよるが逆行列を求める場合1000×1000
の行列だと3〜5倍の速度が出るな。マジで。
>>363
それはメモリアクセス・キャッシュの影響じゃなかろうか
鱈セレ=PC100
北森P4=DDR400(Dual?)

実数演算自体は、確かクロック比程度のアップしかしないんじゃなかったかな。
P6自体がK6やP5と比較してかなり速かったし。
実際にはK7がもっと速くて、さらにメモリ速度の分K8が速いと思う。
366デフォルトの名無しさん:04/03/29 06:48
#34de2080 67 38 43 09 00 00 00 80-00 00 00 00 00 00 00 00 g8C.............
#34de2090 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

WinXP sp2のページエントリテーブル。
NXビット確認
>>366
で、速度は?
PAEで特に速度は落ちてないよ。

↓でDEPに引っかかりまつ

char *p;
p= malloc(1);
*p = 0xc3;
_asm call p
これで引っかからなくなるの?

char *p;
DWORD old;
p=(char*)malloc(1);
*p=0xc3;
VirtualProtect(p,1,PAGE_EXECUTE_READWRITE,&old);
_asm call p;
大丈夫じゃないの?

モリアガラン
初歩的な質問で申し訳ないですがnasmについて質問させてください。
nasmでとりあえずhello, worldを表示させようと下記のHPにあるソースを
アセンブルしてみた所「hello.asm:1: fatal: unable to open include file `system.inc'」
というエラーが出ました。
http://www.freebsd.org/doc/en_US.ISO8859-1/books/developers-handbook/x86-first-program.html

findコマンドでsystem.incを調べても見つからないのですがこのファイルは何なのでしょうか?

---
OS:FreeBSD 4.8 RE
NASM version 0.98.38 compiled on Apr 3 2004
http://www.freebsd.org/doc/en_US.ISO8859-1/books/developers-handbook/x86-portable-code.html

16.5.5 Using an Include File
If you are releasing your software as (or with) source code, you can use macros and place them in a separate file, which you include in your code.

Porters of your software will simply write a new include file. No library or external object file is necessary, yet your code is portable without any need to edit the code.

Note: This is the approach we will use throughout this chapter. We will name our include file system.inc, and add to it whenever we deal with a new system call.

We can start our system.inc by declaring the standard file descriptors:

%define stdin 0
%define stdout 1
%define stderr 2

>>372
上手く行きました。
ありがとうございました。m(_ _)m
374名無し@沢村:04/04/07 03:18
おまいらよ、超便利マシン語エディタ「Visual E++」ができたから見ちみれ!!
プログラム言語の歴史が変わった歴史的瞬間だ。

http://hp.vector.co.jp/authors/VA015412/
>>374
もちろんそのプログラムはマシン語で開発したんだろうな?
恐ろしくでかいEXEができるのはなぜ?
>>374
なんだか面白そうだね。
でも、”Visal E++のダウンロード”ってなっているよ。
>>374
だから、E 言語は既に他にあるんだって。
http://erights.org/
沢村を弄るスレはここですか?
あ、さっきゅんだ。俺だよ俺
俺俺詐欺キタ━━━━(゚∀゚)━━━━!!!!!!
不覚にも藁田
383名無し@沢村:04/04/08 20:40
>>378
馬鹿、それはまがいものだ。
おれのがホントのE言語だ!
なんでEにしたの?
マシン語ならMじゃないの?
385デフォルトの名無しさん:04/04/09 01:19
+-----------------------------------------------------------------+
名前:名無し@沢村 日付:4月8日(木) 22時24分
そのE言語はまがいものです(笑)
+-----------------------------------------------------------------+
383 :名無し@沢村 :04/04/08 20:40
>>378
馬鹿、それはまがいものだ。
おれのがホントのE言語だ!
+-----------------------------------------------------------------+


どっちが本人よ
どっちもまがいもの
沢村のE言語はSSE2使えんのか?
388デフォルトの名無しさん:04/04/09 14:09
BIOSのルーチンはリアルモードでないと叩けないんでしょうか?
>>388
この世にBIOSがいくつあると思ってるんだ?
アセンブラ… (*´ェ`*)ポヨ
>>388
エミュレーションしてしまうという手がある。

x86以外のハードで、ROMにx86のコードが載ってる
PCIデバイスとかを使うときはそうすることもあるし。
↓沢村をエミュレーション
アセンブラ… (*´ェ`*)ポヨ
394デフォルトの名無しさん:04/04/09 18:56
おまいらは
PowerPCとARM。どっちのアセンブラ(というかニモニックというかインストラクションセットというか)が
好きでつか?
gas以外なら何でもいいやw
>>394
ARMが好きな奴っているのか?
ARM32 Thumb混在は勘弁
HP-UXのPA-RISCとか判る人いる?
つーか需要あると思う?
41 :Socket774 :04/04/10 02:43 ID:yFYAz/Ak
>>38
ロングパイプライン・キャッシュリロード・投機実行
これらのワーストで250000クロック分の処理が無駄に破棄されます。
Windowsでは、この破棄が秒間に100回以上起こる可能性があるそうです。
つまり、この回避しがたい100回以上の破棄をいかに軽微にこなすかが
CPUに求められているというわけです。
つまりもっさりの改善は、パイプラインストールの回避・分岐予測の精度向上・メモリ帯域の向上・キャッシュミスの回避と、
すべて理にかなった当然の結果として落ち着くわけであります。

秒間数十億個というのはあくまでもクロックから推定できる理論値。
今のPen4は、キャッシュ1ライン埋める程度の作業に10000クロックかかるんですよ?
どっかからのコピペか?
キャッシュにロードされるのに10000クロックはかからないだろうに。
>>399
コピペか・・・・
WindowsXPのデフォルトのコンテクストスイッチ時間は50ms
間隔、Server2003は300msだ。前者はどう考えても20回/秒
しか切り替えが起きないように思えるが・・・・
300msだと目に見える速度で切り替わってるん?
>>402
らしいよ。ちなみにXPでもバックグラウンドサービスを優先にする
にすると300msに切り替わるからやってみるといい。但しその時
同時にバックグラウンドプロセスに割り当てられる時間も長くな
るので、表で重い処理をしていると不都合が生じる事があるらしい。

ttp://homepage2.nifty.com/winfaq/c/ntperf.html#1292
[スタートボタン] → [ファイル名を指定して実行]
で "perfmon" と入力して[OK]を押と、パフォーマンスモニタが立ち上がる。

╋ボタンを押して[カウンタの追加]ダイアログボックスを出す。
[パフォーマンスオブジェクト]に"System"を選択し、
[一覧からカウンタを選ぶ]から"Context Switches/sec"を選択して
[追加]ボタンを押す。

これで1秒間に何回コンテキストスイッチが起こっているか
リアルタイムで確認できます。
>>401
割り込みも含んでいるのでは?

でも・・・「キャッシュ1ライン埋める程度の作業に10000クロック」で
なんか説得力失くしてるような
>>404
だいたい百回くらいになったよ
タイムアウト以外でもコンテクストスイッチは発生するし
intelのキャッシュはライン全てが埋まる前に順次アクセス可能になったような気がする
P4のキャッシュラインって、確か64byteでしょ。
せいぜい数百クロックで埋まると思うんだが。
メモリアクセスのコストはでかいよ。
今日「いまどきのアセンブラプログラミング」なる本を買ってきました。早速勉強してみます。
>>410
南無
>>411
もしやさほどいい本でもないと・・・・?
早速7Pで誤字を発見、こういうことなのであろうか・・・・。
立ち読みした事あるけど地雷だね
パラパラとめくって見たけど・・・・なんだこりゃ誤字だとか誤記だとかが多すぎます。
なんとか頑張ってみます。
その本の紹介文の一部です
>ゲームやソフトを実際に解析する具体例を以て行う実践解析ガイド
>ゲームで「キャラクターを無敵にしたい」とか、特定のソフトで機能制限を解除したい」などが

導入としてこの手の話題は悪くないと思いますが
肝心のアセンブラの解説にいくまでに息切れした感があります
ゲームラボの延長のような位置付けなんでしょうね
たしかに・・・ツールの説明でページ使いすぎです。
>>410
その本はゲーム解析者の間では「買う価値の無い本」として有名です。
ゲームの改造ネタは色々なゲーム解析サイトの解説を参考にしていますが、
ライターに知識がないのでこの本の解説では間違いだらけになっています。
それに、インテルのアーキテクチャマニュアル丸写しのページは、
索引がないのでとても使いにくく評判が悪いです。

ゲームの解析がやりたいのなら、下のサイトで勉強した方が良いでしょう。
「いまどきのアセンブラプログラミング」よりもはるかに役に立ちます。
アセンブリ言語のソースコードもありますし。
http://gamereverserz.cjb.net/
>>418
そうですか・・・・衝動買いはいけませんね、ありがとう。
>>410
アセンブリを真面目にやりたいならはじめて読む8086でも嫁。
ゲーム解析は知らん
「プログラミングの力を生み出す本」って読んだことある人いる?
評判いいみたいなんだが、実際どうなんでしょう?
アセンブラのシンプルな美しさがたまらん。
コードを一行書くたびにうっとりしてる。
高級言語のゴテゴテした記述には吐き気がする。
>>422
そんなあなたにはWhitespaceがおすすめ
ttp://compsoc.dur.ac.uk/whitespace/
>>422
瀕死のコボラーみたいなこと言ってないで働けよ
すまぬ。おしえてくれ・・・
CPU8086の組み込み機器用プログラムがあって、
組み込みLinux(!)に移植せねばならぬのだ・・・。
ソースコードは一部C言語+大部分アセンブラ。

アセンブラをC言語に逆アセンブル出来る?
出来たとしても、Linuxへの移植に役に立つCのソースが得られる????

すまん、アプリ屋なもので、判断できんのだ・・・。
できないならできないで、しょうがないので、流用はあきらめて作り直しなのだけど・・・・。



age
>アセンブラをC言語に逆アセンブル
???
>>425
一度解析して、仕様書を起こしたほうがいいと思う
Cで書けないプログラムはない
CでVM作ってその上で元のプログラムを動かせばOK
8086程度ならエミュってしまえ。エンジンもフリーでたくさんあるよ。
対象も組み込みのようだからそれは厳しいんでは
>>421
アセンブリ使える香具師には必要なし
Cをもっと理解したい香具師にはちょうどいい
レスありがと・・・。
>>427 さま
あまりのタコ質問で、反応するのがあほらしい感じですか?
自分はアプリ屋なので、恥ずかしながら、
私のアイディアが、どの観点でどのくらいトンチンカンなのかすら
わからないのですよ・・・。
できたら、私のアイディアのタコさ加減を教えてもらえるとありがたいです。
見極めついたら、とっととあきらめて、つくりなおします・・・
しょうがないので。

>>428 さま
やっぱりそうですかねぇ。仕様書はメモリマップぐらいしかないので、
結構気合がひつようだなぁ。(鬱)

アセンブリ言語からC言語は逆「コンパイル」な。
逆コンパイラは皆無ではないが、技術的に困難で、
どんな場面でも実用的に使えるようなものはないと思う。
コンパイラのことをよくわかった人間が書いたアセンブリプログラムなら、
十分構造化されてて、手作業でも逆コンパイルができるかもしれないが、
スパゲティ状態だったら、あきらめるのが得策。
C言語風にディスアセンブルするツールがあったような・・・・
>> 434さま
>>逆「コンパイル」
なるほど、用語が誤っていたということですね。
>>十分構造化されて
なるほど、たしかに、構造化を意識して、かつ、C言語のような構造化言語
をコンパイルしたようなアセンブラでないと、
構造化言語への変換は、意味的に不可能ですね。
親切なコメントありがとうございます。

>>435さま
IDA Pro http://www.datarescue.com/idabase/
なるツールを見つけましたが、これでしょうか?
上記と絡みますが、これはC言語をコンパイルしてできた機械語を逆コンパイルする
という位置付けなのでしょうかね・・・Webだけではちょっとわかりませんね・・・

Boomerang
http://boomerang.sourceforge.net/
も、IDA Proを意識した逆コンパイルツールだな。
どちらも、自動的にってことはたぶんあきらめてて、
「十分知識をもった」ユーザーが介入することを前提にしているはず。
8086に対応してるかは知らん。

機械語とこういったツールに習熟し、さらに手間をかけて使うコストと、
仕様から単純にソースを設計しなおすコストと、
どっちが安いかは規模によるだろうな。
438デフォルトの名無しさん:04/04/17 20:52
アセンブラはおなかがいっぱいになりまつか?
debugでGUIできる?
>>439
は??
いったいどういうものを想定してるの?
441デフォルトの名無しさん:04/04/18 00:01
>>440
win32のやつ
意味のわからないレスが続いております。
GUIなデバッガがあるかと言うことだろうか?
もしそうならOllyDbgなどがあるけど
意味のわからないレスが続いております。
母国語(日本語)をおろそかにしていると、外国語の習得
もおぼつかないぞぉ
debugでGUIできる?、という意味自体いまだにわからん俺はバカですか
debug.comでGUIのpろぐらむが
>>446
debugとGUIに関する知識をつけてから来るように。
はい、次の人。
>>448
貴方は超能力者様ですか
439=441=448
ヽ||´ ∀`||.。oO(知ってるがお前の態度が気に入らない にははーっ)
知ってるがお前の態度がピッチャーデニー
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
RET?
>>453
C3
>>439
>debugでGUIできる?
debugとGUIの単語を入れ換えれば意味が分かる俺は天才ですか?
意味が変わる罠
中学生お断り
ぶでむし
>>443
OllyDbgは使えそうだが、Winか。
Linux環境のやつを探しているのだが。
>>459
>>439ではないよね?
kdbgとかgdbのGUIフロントエンドの類はいくつかあるみたいだが
461デフォルトの名無しさん:04/04/19 21:46
おなかはいっぱいでつか?
http://www.csl.sony.co.jp/person/fnami/asm.htm
こんな感じで高速サーキットをガンガン組むスレかと思ってました・・・・。











( ゚ρ゚ )b逝ってくれ
463439:04/04/19 23:09
できますか?
できちゃった。。。
>>425 です。
結局、基本方針は作り直しに限りなく近い移植
となりました。 アセンブラを参考にしつつ、作業をすすめるつもりですが・・・。

アドバイスありがとうございました・・・。
>>452
声に出して読みたいマシン語
>>466
1D?(6809)
>>467
14(6809)
そう言えば $00 $00 は6809では NEG $00 だっけか・・・
Z80で初めてマシン語に触れた俺は
00はNOPなのが当然だと思っていて
8086で呆然としたよ。
nopが00ってのは最近は少数派?
6502では未定義コードが多くて、それらはすべてBRKという
ニーモニックに割り当てられていた。ソフトウェアインタラプト
の事かな?NOPは0xEAだっけか。

なにせ命令数が少ないのにいろんなコンシュマー機に乗って
それはそれは偉大なソフトウェア資産を残しましたよねえ、この石。
BRK (break)
・この命令を実行したチップは物理的に破壊されシステムは二度と復旧できません。
・自己爆破プログラムなどの作成によく使用します。
そう言えば6502はリセットor電源投入でPCの値が不定という恐ろ
しい仕様になっていたな。だから電源投入後ほんのしばらくだけ
暴走状態になり、未定義命令(すべてBRK命令になる)に遭遇して
インタラプトベクタ(ROM)の指すアドレスにジャンプしていた。

6502は電源投入かリセットによるものかをハード的に検出する機構
を持たず、どうやら電源投入時にはRAMの内容が不定なのを利用
して判別していたらしいが、その詳細は寡聞にして知らない。ある
特定のRAMを未使用にし、内容を$00にするなどして判別していた
のだろうか。

6502はDMA割り込みにも対応していず、強制的にCPUをHLT状態
にしてバス占有権をデバイスに譲り渡していたような記憶がある。
ソフトウェア的には面白いCPU(MPUというらしい)だが、ハードウェア
的にはまだまだ不備が多かった。
リセットベクタはどうした?
>>474
電源投入時のみPCが不定なんじゃなかった?
Reset線あるし、初期化に6クロック必要というだけかと。

未定義命令は全てBRKになるのは大嘘。

電源投入かリセットかの判別をRAMが特定の値になって
いるかどうかで判別するのは普通に使われてると思うけど。

DMA割り込みがなくても特殊用途以外困らないな。
478あっせんぶら:04/04/24 00:51
ちょっと質問なんですが、インラインアセンブラでレジスタの値を配列に入れるには
どうすればいいでしょうか?

char str[10]
__asm__("movl %ebx, ????");

????はなにを入れるんでしょうか?linux上のgccでコンパイルしたいのです。
479あっせんぶら:04/04/24 00:59
str[0]に入れたいんです。
480デフォルトの名無しさん:04/04/24 01:00
>>478
それができると何がうれしいの?
>>478
__asm ("movl %%ebx,%0" : "=m" (str[0]) );

かな。これ読んどけ
http://www.sra.co.jp/wingnut/gcc/gcc-j.html#Extended%20Asm
str[0]はcharだからebx全部収めるには小さいと思うけど大丈夫?
>>478 ではありませんが、参考になりました。
char c;
asm ("movb $0x41, %%al;\n\
movb %%al, %0;" :"=r" (c) );
putchar(c);
おまいらアセンブリのコーディングにはどんなエディタ使ってる?

俺はedit.exeだが・・・
>>484
edlin.com
>>484
cat
>>486
ネ申
488デフォルトの名無しさん:04/04/25 15:12
http://compiler.e-city.tv/
即デリだろ
ビデテープかよ
プロテクトモード移行関連のいい資料ないかな・・・
インテルのマユアルぐらいしかしかないか
まゆある
まゆタン(*´Д`)ハァハァ
>>488
即デリだよ。直前に落としたけど。
>>492
こういう時だけは2chに張り付いてるキモい奴が裏山しくなるんだよな…。
お前も張り付いてんじゃんw
>>492
また復活した。多分最小限のWin32APIとかが入ってるのかな。
即デリされて即同じ垢取ったんだろうからまた即デリか?
またビデテープだし
ナニコレ?
498493:04/04/25 20:13
>>494
あのレス速度と書き込み内容見てもそう思ったのか?相当頭腐ってるようだが
499部外者:04/04/25 20:21
>498
まだ493から2時間もたっとらん
ニヤニヤしていいですか?いいですよね。(・∀・)ニヤニヤ
>>compiler.e-city.tv
ホンマに一発で豆32できるね。Warningだらけだが。
ホンマにIntel C++使えるね。Warningだらけだが。
一応
タダで使えるVisual C++
http://pc5.2ch.net/test/read.cgi/tech/1082177340/l50
503488:04/04/25 22:04
そこが少なくともここより糞スレだからこっちに書いた
mov dx,NIYA
mov ah,09h
int 21h

segment data
NIYA: db 'NIYA NIYA',0dh,0ah,'$'
505493:04/04/25 23:10
>>499
ああ部外者さんすいません。時感覚が全然違うようなので話になりませんね。
gccで以下のCのソースをアセンブラ出力すると、
int main(){ int i=123,j=456; printf("%d %d\n",i,j); }

以下のように出力されるが
何でAの箇所で"-16"を"andl"してるのか理解できない。
main:
 pushl  %ebp
 movl  %esp,%ebp
 subl  $24,%esp
 andl  $-16,%esp  ← A
 movl  $456,8(%esp)
 movl  $123,4(%esp)
 movl  $.LC0,(%esp)
 call  printf
 leave
 ret

何故ですか?教えてエロイ人
16バイトアライン
・・・するとデータの並びが綺麗になって処理が少し早くなる
509506:04/04/26 00:10
ってことはAの箇所は無くても動作上は問題ないってことですね。
これがアラインなのか。ナルホド
どうもアリガトン >>507,508
510デフォルトの名無しさん:04/04/26 01:55
引数をどういう順序で積むかとか、関数内で変更しちゃいけないレジスタの一覧とか、
そういう規則(calling conventionっていうんでしょうか?)はどこ見れば書いてありますか?

x86のLinuxでインラインアセンブラで遊んでいます。
512510:04/04/26 10:28
>>511
サンクスコ
しかしなんつーかもっと公式っぽいのはないもんですかね・・
>>511
見てみたけどあんまぱっとしないね
VCの呼び出し規約だったらMSDNにあったはず
>>510
gcc/config/i386/i386.h
マクロの説明はinfoにある。

インラインアセンブラなら引き数ちゃんと指定すりゃ、
そんなん気にしなくてもいいはずだが。
515510:04/04/26 11:32
>>514
さんくす。見てみます。
気にしなくていいはずってのは確かにその通りですね。
正確には、gcc -Sした出力を読むときの参考にしたいってとこでした。

516デフォルトの名無しさん:04/04/26 12:51
gdbで、$eflagsの内容を数値じゃなくてフラグ名で表示する方法ないですか?
Linuxでgdb-5.3です。xemacs -e gdb で使ってます。
>>516
漏れは泥臭いけどこうしてる。

.gdbinitに

define printflag
printf "flag = %s%s%s%s%s\n",\
$eflags & 1 ? "C":"-",\
$eflags & 4 ? "P":"-",\
$eflags & 16 ? "A":"-",\
$eflags & 64 ? "Z":"-",\
$eflags & 128 ? "S":"-"
end

もっとスマートな書き方あったら教えてくれ。
自分は516でないけど
>>517
(゚д゚)ウマー
>>517
さんすこ!いい感じです。
520519:04/04/26 22:39
もいっこ、、gdbは、Cソースとasmリストを両方表示するような、いわゆる混合モード?のようなのはないのでしょうか?
disas結果とにらめっこはつらいっす。
>>520
emacsはどうよ?
522519:04/04/26 22:57
>>521
いや〜、emacsでM-x gdbしてるんすが、混合モードにできるんすか??!!
523521:04/04/26 23:00
>>522
スマソ
間違った。
524デフォルトの名無しさん:04/04/27 00:15
http://www.ascii-store.com/catalog.cgi?id=00061989
はじめて読むPentiumキタ━━━━━━(゚∀゚)━━━━━━ !!!!
いまさらpentium・・・
目次紹介ぐらいつければいいのに
解説がこれだけだと地雷かどうか判断つけかねるね
528デフォルトの名無しさん:04/04/27 00:40
>>524
はじめて読む486の続編?
はじめて読むAMD64キボン
それはちょっと欲しいなぁ
はじ486よりははじ8086を今風に書き直したようなイメージの予感。
今更pentium出されても486と大して変わってないし。。。
「はじめて読むPentiumPro」なら欲しい気がする。
はじめての…(*´д`*)アハァ…
アッセンブラの想い出♪… (*´д`*)アハァ…
ハァハァ
どうやって486と差別化するんだ?
まぁあの人なら「いまどきの〜」みたいなのは絶対書かないから良いとして・・
差別化する必要あるの?
いいかげん486じゃ売れないだろ、とか思って
改訂ついでに486→Pentiumに変更したものかとオモタ。
s/486/Pentium/ + 若干のお茶濁し程度のPentium固有説明と予想。

486は本体2427円か。
486DXに無くてPentiumにあるものってなんだったかな
FPUのバグか?
Pentiumって言っても、さすがに素のPentiumってことはないだろうよ。
MMXとかSSEとかネーノ?
PSEとかPAEとかHyperThreadingとかも含まれればいいなと妄想。
541デフォルトの名無しさん:04/04/28 01:14
P4最適化コンパイラ(C/C++)の優劣はこれでOK?

Intel > Microsoft > Borland > gcc
P4に限れば

Intel > Microsoft > Borland >>>>>>>>>>>> gcc

じゃないの?知らんけどどーせP4最適化の不具合残ってるんでしょ?gcc3.4
543デフォルトの名無しさん:04/04/28 01:53
MS の最適化 (inlineの処理)のバグがつらいですね。。。
信用できないので inline を使えないです。。。

Intel & Borland の 配列処理のコードは賢いです。

Intel Compiler + VTune ってのが最強ですか!?
漏れのハンドアセンブルが最強だよ
>>544
ハンドアセンブルは間違わなければ誰がやっても同じ結果になるのでは。
というかハンドアセンブルで間違えたら、余程運がよくないと
大抵そのまま暴走する罠。
>>545=アセンブリ言語とマシン語が常に一対一で対応すると思ってる香具師
( ´_ゝ`)
>>488
勝手にミラー作った。
http://compiler.web-zz.com/
>>549
ATLは割れ物?
551デフォルトの名無しさん:04/04/28 14:54
多分PPC何とかのSDKから抜いたんじゃないか?
552デフォルトの名無しさん:04/04/28 15:06
通報していいの?
>>539
CPU動作クロックカウントする奴とかありませんでしたっけ?
CPUID実行すると随分結果違いそう。

あっ、CPUIDがDX4以降だった(大和田爆)!
RDTSC
移植性に限れば
gcc >>>>>>>>>>>> Borland > Intel >|越えられない壁|> Microsoft

gccの最適化もそんなに悪くはないはず
アセンブリのスレですよ。
>>555
なにをどう移植する気だ
オブジェクトに互換性は無いの?
開発環境がWindowsに限定されるからやる人がいないだけで
リンカさえ用意すればx86環境はMicrosoftでも統一できないか?
>>558
できん
>>552
割れというよりフリーソフトの無断転載だがいけないと思うので通報した。
ちゃんと落とした後に確認してから。
なぁ、最近高級言語でアセンブリとかいっちゃってんの、なんとかならんの?
ならん
563デフォルトの名無しさん:04/05/01 00:06
だれか、MSのアセンブラが吐く.LIBをディスアセンブルできる
ディスアセンブラ知らないですか?
今昔のソースのないライブラリ使いたくて困ってるんだけど
なかなか見つからなくて。
ないのかなぁ、そんなの。
できん
>>563
LIBからOBJ引っ張り出してすべてのシンボルを参照する
プログラムとリンクすれば?
>>565
objにすればリンカに食わせるだけでいい。
obj用の逆アセンブラってのもあったような気がするけど。
>obj用の逆アセンブラ
obj2asmで検索すればいくつか見つかるな。
32bitやCOFF対応のとなると少ないが。(Digital Marsのヤツが対応してたかな。)
>>567
DC++ じゃなくてその前身のSC++だけど、軽く試した感じだとCOFFにも対応してる気がす。
まぁ、対応して無くても coff2omf が付いてるのでなんとかなる。
ret word 00008h
ってどういう意味ですか?
>>569
ret後にespに8加算
これくらいインテルのマニュアル見たほうが速かろうに
修行不足でした。ありがとうございます
$ilhlbaialabeldword
dd0
dd1
;(省略)
dd9

?live1@0:;main関数の呼び出し
push ebp
mov ebp,esp
add esp,-40
push esi
push edi

@1:mov esi,offset $ilhlbaia
lea edi,dword ptr [ebp-40]
mov ecx,10
rep movsd

xor eax,eax;i=0
?live1@48: ; EAX = i
@2:
inc dword ptr [ebp+4*eax-40]
inc eax;i++
cmp eax,4;i<4となっているか?
jl short @2

;(省略)
573572:04/05/02 15:57
配列の使い方が分からないです。
Cで

int main(){
int s[]={0,1,2,3,4,5,6,7,8,9};int i;

for(i=0;i<4;i++){
s[i]++;
}
return 0;
}

ってなるのを、bcc32 -Sでアセンブリ化したのですが、よく分かりません。
@1:の最初の方でesiがs[0]を参照しているみたいですけど、
何故[ebp+4*eax-40]がs[i]を表わす事になるかが良く分からないんです。
参照したのはesiなのに・・・
ebp-40が配列のベースアドレス
siozef(int)は4
@1でやってるのは、ローカル配列の初期化な。
dd 0〜dd 9 に対応するのは{0,1,2,3,4,5,6,7,8,9}の定数部分
@1では、この定数を変数にコピーしてる(s[]={0,1,2,3,4,5,6,7,8,9})

sに対応するのがebp-40で、iに対応するのがeax
つまりs[i]に対応するのが[ebp-40 + eax*4]

こんな説明で分かるかな?
577572:04/05/02 21:32
>574-576
なんとなく分かりました
ありがとうございます
578デフォルトの名無しさん:04/05/03 18:03
xemacs上でgdbを使っているんですが、実行中および前後の命令を表示しつつ
ステップ実行することはできないでしょうか? gcc -S結果のファイルをあらかじめ
用意しておくなどの方法でもかまいません。

よろしくおねがいします。
...と。
>>578
define hogehoge
x/1i $pc
si
x/2i $pc
end

くらいでどうよ。
>>579
なるほど、ありがとうございました
おまいら何つかってコーディングしてるよ?
紙とエンピツ
エディター
>>581
脳味噌
585美留上位:04/05/09 22:22
cat > file
努力と根性
カロリー
588デフォルトの名無しさん:04/05/09 23:32
おいアセンブラはやる価値あるか?
>>588
そんな事よりきいとくれ。
俺が学生の時に60過ぎの教授、「アセンブラと言ってもこれでは有りません」
とか言って、プログラミング言語の講義中に麻宮騎亜の「アセンブラ0X」を出して来た
んだけどどう思う?
それがどうしたよ、おっさん。
反応する人間=仲間を探したかったんだよ。うん。
アセンブラ勉強しようと思うんですが
お勧めなサイトとか本とかあったら教えてください
ぐぐれ
>>592
国内で有名どころと言えばここかな。
ttp://www.e-net.or.jp/user/missing-link/assembler/menu.html
過去ログ必読!!膨大な量のログがあります。
>>592
勉強する目的を書いた方が良いかと。

例えば、目的がアセンブリ言語でのプログラミングの場合と、
目的がゲームの解析の場合では、回答も違ってくるから。

いずれにせよ、「いまどきのアセンブラプログラミング」という書籍は買わないように。
絶対に後悔するから。
ここにはモトローラの石使いはおらんのかい?
LDAA #8AH
CMPA FG
BCC SWCAL

などの命令が見られないのが寂しい。。
STAB
ぐさりと刺す。

SEX
オニーチャンノエッチー(AA略。
598592:04/05/10 22:03
>>593-595
ありがとうございます
ゲームの解析をやりたいと思ってます
>>598
ゲームの解析なら、下のサイトとそのリンク先で勉強するのがお勧め。
わざわざ本を買う必要はありません。
http://gamereverserz.cjb.net/
601592:04/05/11 01:23
>>599
ありがとうございます。
某オンラインゲームのチートスレでそこは初心者には難しすぎるから
もっと優しいところから始めろと言われたのですが大丈夫でしょうか?
>>601

>>599のサイトは、プロセスメモリエディタすら使いこなせない初心者には難しいが、
これからアセンブリ言語のゲーム解析への応用を学ぶ人には丁度いい難易度だと思う。
「Questions/Suggestions」のコーナーで、初心者はどう勉強すればいいか解説してあるし。
603デフォルトの名無しさん:04/05/11 03:54
emacsやvimはアセンブリ言語では作られていないのですか?
いません。
605603:04/05/11 06:09
どおりで重いわけだ
(・∀・)はアセンブリ言語では作られていないのですか?
いません。
608606:04/05/11 09:17
どおりで重いわけだ
>>591
え〜?「60過ぎの教授」なんだろ?
きっと一世一代のネタだったんだよ。
最近の女の子はアセンブラで作られていますか?
いません。
>>610
フロントホックブラなら付けています。
>>611
どおりで重いわけだ。

>>612
むしろTシャツブラのような気が。
mov 半島, 在日;
xor 在日, 在日
mov ah,半島
int 三国人

不正な割り込みが発生しました。
喪前等ひどいなw
新しいPentiumMが出たそうだけど
SSEは1,2,3のどこまでじっこうできるんでしょうか?
>>614
モトローラだと半島→在日になっちまうんだが(w
move 在日,半島
add 半島, 産廃
mov ブラックホール, 半島
rol 在日, 8
ズタズタグチャグチャ
石原都知事 macro
    cmp 人,在日
    je  刑務所
endm
624デフォルトの名無しさん:04/05/13 04:07
マウスでスクロール!(PS/2マウス専用) ※アセンブラソース付き
http://rd.vector.co.jp/soft/dl/dos/util/se046783.html

このソフトはマウスの動きを方向キーに割り当てるものですが上下のみ。
左右も対応して欲しいのと、マウスのボタンを好きなキーに割り当てるように改造して欲しいです。

ノートパソコンではマウスの代用として
ジョイステックに似たステックやリブポイントがIBMや東芝などで使われてます。
これを方向キーのエミュレーションとして使いたいのです。
(逆のキーでマウスを動かすソフトは沢山あるんですけどね)
ステックでゲームができると大変操作性があがります。

作者に頼むにしても1997年で開発が止まってるようで、今更w
なんとか改造出来ないでしょうか?
僕はアセンブラもDOSもダメです。
>>624
アセンブラやDOSを知らなくてもバイナリエディタでキーコード書きかえるだけで済むじゃないか
ソースより
MKY_UP_SBCS EQU 48E0H ;上方向入力時SBCSコード(↑)
MKY_DN_SBCS EQU 50E0H ;下方向入力時SBCSコード(↓)
MKY_LB_SBCS EQU 1C0DH ;左ボタン入力時SBCSコード(Return)
MKY_RB_SBCS EQU 011BH ;右ボタン入力時SBCSコード(ESC)


moukey.comファイル
$0030: 05B8 0D1C EB07 A802 7423 B81B 011E 53BB

$0032 にある $0D1C がマウス左ボタン用、リターンキーのコード
$003B にある $1B01 が右ボタン用のEscキーのコード

みたいです。
この部分を変更したいキーのコードに書き換えれば
マウスボタンのキーの割り当てが変更できると思います。

が、キーに対応するコードが分かりませんね。
$0D, $1B はリターンキーとEscキーのコードですが$1Cとか$01がくっついてるんで
何か資料がないと…
6278086使った事ない:04/05/13 08:03
左右スクロールはこんな感じか?
(1) キーコードを調べて左右キーのコードを定義する。

MKY_UP_SBCSEQU48E0H;上方向入力時SBCSコード(↑)
MKY_DN_SBCSEQU50E0H;下方向入力時SBCSコード(↓)
MKY_LF_SBCSEQU****H;左方向入力時SBCSコード(←)
MKY_RG_SBCSEQU****H;右方向入力時SBCSコード(→)

(2) 元のコードの91〜94行目の
MKY_ME_LCHK:
CMPByte Ptr[BP+MOUSEINF.X],0;無意味なキー入力を避ける為
JNZMKY_ME_LAST
TESTAL,01H;左ボタン

を下のように書き換える。つーか資料がないので全然分かりませんが。

MKY_ME_LCHK:
CMPByte Ptr[BP+MOUSEINF.X],0;X方向動作チェック
JZMKY_ME_LCHK_0
TESTAL,**H;X方向の符号 ← これも資料をあたって調べないと。
JNZMKY_ME_MINUS_Right
DB0B8H;MOVAX,MKY_LF_SBCS
DWMKY_LF_SBCS
JMPMKY_ME_KWRT
MKY_ME_MINUS_Right:
DB0B8H;MOVAX,MKY_RG_SBCS
DWMKY_RG_SBCS
JMPMKY_ME_KWRT
MKY_ME_LCHK_0:
TESTAL,01H;左ボタン
628627:04/05/13 08:22
タブが完全に飛んでしまった。
つか、上下チェックでやってるコードを参考に
左右チェックのコードを書き加えれば動くんじゃないかなと。

ソースの75-90行あたりに上下チェックのコードが書かれてます。
ここあたりのscancode参照
http://www.asahi-net.or.jp/~bg3k-ysd/pocketlinux/src/keycode.txt
実際はDOSの内部バッファの2バイト形式なのでESCとRETがちょっと違うけど
左右はscancodeのままでよいので問題無し
>>624
>僕はアセンブラもDOSもダメです。
じゃあ諦めろよ。
それとも何か?「誰か改造して!」っていう依頼なのか?
ちゃんと答えてやったところで、アセンブル&リンクできるかどうか
非常に疑問だな。そもそもアセンブラとリンカはあるのかな?
>>623
ワロタ
>>626さん

ありがとうございます。
これからアセンブラを始めてみます。

フリーのコンパイラとかあるんですかね?
ヤフオクで中古のコンパイラ捜すのもいいかな。
ターボーアセンブラのDOS/V版とかがいいのかなー
おお、がんがれ。
主要部分は50行程度だ。
ここで超亀レス
>>578
display/i $pc
を試してみよう
CODE領域への格納についてよくわかりません。
例えば、
addw $1234,%ax  ならCODE領域に格納する際に
6605 3412  です。6605がaddw、3412が1234を表す。
しかし、%axは、CODE領域に格納されていないように見えるのですが。
いったい、どういうふうに格納されているのでしょうか?
%axも数字にしないとどこに格納するかっていう情報がわからないと思うんですが。
>>636
8086?
8086は知らないけど6605に含まれてるんじゃないの?
addwを指定してるのは上位xビットで、
どこかの3ビットでレジスタを指定しているとか
そんな感じでオペコードは作られてるから。

 addw $1234,%bx

とかしたら6605の方が変化するんでない?
>>636
66 はサイズオーバーライド プリフィックス。
05 が add eax,〜
まぁ、結果的には変わらないが、念のため。

で、問題のaxの情報は、05 (axに特化した命令コード)の中に含まれる。
他の16Bitレジスタだと、05のところが 81 ?? になるんで、試して見るよろし。
ちなみに、例示されてるコードはこの81 ?? を使って 66 81 c0 34 12 とも表せるが、
長いのでメリット無し
>>637さん
>>638さん
どうも、レスありがとうございます。05にaxの情報が入るんですね。
最近、アセンブラを勉強し始めて最初につまったところです。
ほかの16ビットレジスタでも確認をしてみようと思います。
ax レジスタはアキュムレータ(積算器、加算器)レジスタって言って、
いくつかの計算命令で専用のコードが用意されてることがあるのです。
>>635
>display/i $pc
>を試してみよう
なんてCooooooooooooooooooLなんだ!!
私は今感動している!!

ありがとう!>>635

PS.ちなみに私は>>578ではないのであしからず。
>>641
めでたいな
女子高生に人気の
斡旋ブラ
好評発売中!
アセンブルポ
645デフォルトの名無しさん:04/05/17 20:09
アセンブルマ
汗ブルマ
どんなブラやねん(w
アセンブラってCPUが理解するプログラムでしょ?
それなのにどうしてウインドウズのAPI呼び出したり
ウインドウやアイコンを表示したりできるのさ?

CPUの世界にはAPIもGUIも無いはずなのに
たまーにagaってるかと思えばこんなんか。
>>647の高度な縦読み/斜め読みを誰か解読してくれ。
BDOS EQU 0005H
CR EQU 0DH
LF EQU 0AH
EOS EQU 00
ORG 100H
LD HL,MESG
LOOP:
LD A,(HL)
OR A
RET Z
PUSH HL
CALL CHROUT
POP HL
INC HL
JP LOOP
CHROUT:
LD C,2
LD E,A
CALL BDOS
RET

MESG:
DB CR,LF,'あぼーん',CR,LF,EOS
END
        CPUが
          ウ
         コン
仮想マシンだヴォヶ
なつかしい命令がいっぱい。
>>643はCが何を吐いてるのか知らない馬鹿
>>655
>>643のPCはwindowsとCPUがバラバラに動いてるから
たとえCコンパイラがマシン語を吐いているとしても
それはマシン語からOSのAPIを呼び出せる理由の説明にはならない
>>643 じゃなくて >>647 じゃないの?
>>658
>>643は馬鹿などでは無いと言いたげだな
馬鹿ではない。ネタだ。
いや、ネタじゃなくてマジなんですけど
世間でもアセンブラでWin32は無理とか言われてるし
>>643 って、斡旋ブラなんだけど...。
>>662
655 名前:デフォルトの名無しさん[sage] 投稿日:04/05/17(月) 21:07
>>643はCが何を吐いてるのか知らない馬鹿

656 名前:デフォルトの名無しさん[sage] 投稿日:04/05/17(月) 21:08
>>655
>>643のPCはwindowsとCPUがバラバラに動いてるから
の自作自演がバレてるよねw
664デフォルトの名無しさん:04/05/17 21:32
だってさ、アセンブラの機械語ってCPUが理解する0と1の数値の連続でしょ?
でもってAPIはDLLファイルに入っている関数でアルファベットの名前も付いてる

どうして01010101みたいな数列でファイルの中のプログラムを呼び出せるのさ?




                  O     S
void dumpClientRect(HWND hWnd) {
 RECT rect;
 __asm {
  push hWnd
  lea  eax, rect
  push eax
  call  dword ptr GetClientRect
 }
 _RPT4(_CRT_WARN, "(%d,%d)-(%d,%d)\n", rect.left, rect.top, rect.right, rect.bottom);
}

めっちゃ呼べるけどね...。
>>661
>世間でもアセンブラでWin32は無理とか言われてるし

無理ではないと思うよ。無茶かもしれないが。
http://www.vector.co.jp/soft/win95/hardware/se254476.html
つーか、RosasmっていうWin32バイナリを作る為のアセンブラもあるんだけどね。
>>664
>でもってAPIはDLLファイルに入っている関数でアルファベットの名前も付いてる

それもマシン語なんだが
なんだかなあ…
>>664
一度、アセンブリコード付きのコンパイルリストを出してみろ。
ダイナミックリンクの動作、仕組みが知りたいって事でしょ。
俺は知らんけど。
文字列をOSに渡してOSは指定されたものをメモリ上にロードして
よろしく実行してくれるんじゃないの?
bcc21 -S test.c
で、アセンブラコード吐けるんじゃなかった?
APIを使ったプログラムをCで書いてアセンブラではいたら、出て来るんじゃない?
誤 bcc21
正 bcc32
起動時にリンクするのと実行時にロードするのとでは
扱いがちょい違うよね。
>>661
できるけどめちゃくちゃ面倒なんで無理って言われているだけでできないわけじゃない。
http://www7.plala.or.jp/keny01/masm/103-05.html

プログラム(アセンブリ、Cその他何でも)からAPI呼び出せるのは、
リンクした後のEXEファイル内にDLLを呼び出すコードが埋め込まれるから。
そしてプログラムではそのコードを呼び出す形になっている
(ただしGetProcAddressの場合は別)
アセンブラできることが小さなプライドなんだろう。
そっとしとけよ。
せめてポート直叩きしたり、割り込みハンドラ定義したり、
Cのスタートアップを自力で書いたりしてくれないと、
アセンブラできるとは言って欲しくない。
>>677
全部Cでできるな
>>677
お前なんかPICに引き篭ってろ
678 いぢめた方が暇つぶしにはよさそうな…
681デフォルトの名無しさん:04/05/19 23:53
Z80アセンブラのプログラムで、9000h番地から256バイト分のメモリの
値を、0,1,2,3・・・255の値で埋めるというプログラムを教えてください
最初はORG8000Hってかんじです。お願いします。
>>681
そんな難問ここにいる香具師に解かるわけないじゃん。
自分で考えたほうが早いって、絶対。
661必死だな
このスレは自慢房のオナニースレだから
685682 != 661:04/05/20 01:25
>>683-684
たぶん俺にだよな?
681 に対して助言半分、厭味半分のつもりだったんだが。
>>685==1
687682:04/05/20 01:31
>>686
お子ちゃまはもう寝なさい(大笑い
6809版

   ORG $8000
   LDX #$9000
   CLRA
LOOP STA ,X+
   INCA
   BNZ LOOP
   RTS
>>688 周囲の失笑を買うことが多くありませんか?
× BNZ LOOP
○ BNE LOOP
だったか。

>689
久しぶりに書いてみてぇ、とか思ったんで。
>>687
もう少しだけ論理のお勉強をしなさい
692!= 687:04/05/20 03:03
>>691 突っ込むなら具体的におながいしたい。意味不明だぞ。
眠れないので、Z80は知らないけど勘で

 ORG8000H
 LD HL.9000H
LOOP:
 LD (HL),L
 INC L
 JR NZ,LOOP
 RET
朝起きたらこんなのが・・・
ということで、正しいかどうかわからないけど勘で
 LD HL,9000H
 LD B,0
LOOP1:
 LD A,R
 CP 122
 NOP
 JR NZ,LOOP1
LOOP2:
 LD A,R
 OR B
 LD (HL),A
 INC A
 AND 80H
 LD B,A
 INC L
 NOPを126個
 JP NZ,LOOP2
 RET
>>693 のでだいたいイイけど、
 INC L
LD A,L
OR A,A
 JR NZ,LOOP
としないといけない。 INC L ではPSWのZフラグは変化しないから。
>>694はなんか勘違いっぽい。
>>692
682 != 661→true(1) or false(0)、そしてレス番0はありえないから1と。
それと、ストアする場所が9000HからだからLを変化させるこの手法が使えるけど、
ストアする場所がchar[256]であるようなもう少し一般性のある問題にも通用するような
コードの書き方をするなら、>>688みたいにストアする内容はAを使うほうがよい。
 ORG8000H
 LD HL.#変数<----char array[256]だとしたら#array
SUB A,A
LOOP:
 LD (HL),A
 INX HL
 INC A
 OR A,A <----INC A でフラグが変化するかしないか未確認なので入れておく
 JR NZ,LOOP
RET は「8000H番地から始まるサブルーチンを書け」とは言ってないから必須ではない
テーブルを使う暴挙。
 ORG 8000H
 LD HL,TBL
 LD DE,9000H
 LD BC,0100H
 LDIR
 JR *
TBL:
 DEFB 00H,01H,02H,.....FFH
良い子の皆さんは真似しないでね。
ORG 8000H
LD HL,9000H
LD (HL),L
INC L
…(上の2行を合計255回繰り返し)
LD (HL),L
変わった方法で目立ちたいならこれ。同じく真似するべからず。
ORG 8000H
LD SP,9100H
LD HL,FFFEH
LD DE,FDFEH
PUSH HL
ADD HL,DE
…(上の2行を合計127回繰り返し)
PUSH HL
INC LでZは変化するはず
INC r でZは変化するね。おそらく次のいずれかと勘違いしたものと思われ。
・INC r (8bit) ではCは変化しない
・INC ss (16bit) ではどのフラグも変化しない
ORG8000H
ORG9000H
DATA 00H,01H,02H,...

ロードした瞬間にできあがってる。
そういえば、ウチのPC(Win9x系)のDosにdebug(C/C++とかJavaと
かのコンパイラー入れてるけどどうやら関係なさそうなうえに
日本語なんでDosの標準装備だと思われる。9ってコマンドがあって
?を入力するとアセンブリっつうコマンドがあったけどあれで
アセンブリ言語アセンブリできるの?

asm初心者なんで意味不明だったらスマソ。
       `ヽ、\
      、-‐一ァ '' ´  ̄ ``ヽ 、
      <  / /,.ィ ,..    \
       L,r'/,rT,フメ/ { ,ィ   ヽ─-- 、.._
       / 7/,r',r- ヽ   lフTト、 !   l \ー-
       { (/ { {::::::::::} ,r ,ニヽレメ ! }  \
.       Y  ヽニニン { {:::::::::} } | / ,'  r-
      /{       ゝヽ::ソノ !ニYヽiヽ}
    ∠  ヽ   ,. 、..  ``""  /ノ ノ
     └┐/\ ゝ、...)     ,.、../
       ´ /( ー  ..... ィ'´  l
      ,r':::::::::ヽ、_ ,ノ::ヽ Vヽ、ヘ}
      /:::::::::/` ー-‐´}::::l
.     /:::::::::::|     l::::::|
>>704
意味不明なのは、asm初心者だからでは無いような気がする。
試しに、日本語に翻訳してみた。

>うちのWin9x系PCのDosプロンプトにdebugというコマンドがあります。
>日本語でメッセージが表示されるので、C/C++やJavaとは関係ない
>Dos標準のコマンドだと思います。
> debugを起動してから、? を入力するとコマンド一覧が表示されますが
>その中にアセンブルというコマンドがありました。このdebugを使って
>アセンブリ言語をアセンブルすることが出来るのでしょうか?
>>704
大抵のPCには入ってるでしょうね。<debug
16bit 命令しか受け付けない上に
ワンステップアセンブラなのでラベルは使えません。
DOS 時代のデバッガですからねえ。
あ、因みに debug は Win2000 にも XP にも入ってますよ。
中学生にムキになるな。
「9ってコマンド」は?

…あ、9はとじ括弧なのか。
よく解読できたな。
>>710
あんたも、すごいよw
すげえ、感動した。
元は「多少冗長だけど、普通に意図は理解できる文章」なのに、
")"を"9"に変えただけで、これほど
「何いってんだか全然わけわかんねえ文章」になるなんて。
>>706はネ申
手元のキーボードだと Shift+'9' -> '(' なんだが...
うちも刻印はそうだが、>>714は日本語環境もそうなのか。
>>701,702 サンクス。しばらく書いてなかったんで忘れてた。
>>703 ワラタ そのすぐ後に704が来たから目立たなくなったが。
>>714-715
OS がどんなキーボード(101 106 109 等)だと思っているかって話ですよね?
少なくとも『刻印』は関係ないんじゃないかと……(^^;
他のコンパイラはどのようなコードを吐くのか教えて下さい。

void f();

int g(int a, int b)
{
 if ( (a -= b) > 0 ) f();
 return a;
}

これについて、Borland C++ 5.5.1 で bcc32 -S -O2 -6 test.cpp の場合
push ebp
mov ebp,esp
push ebx
mov ebx,dword ptr [ebp+8]
;
;{
; if ( (a -= b) > 0 ) f();
;
sub ebx,dword ptr [ebp+12]
test ebx,ebx
jle short @2
call @@f$qv
; return a;
@2:
mov eax,ebx
;}

sub の時点でのフラグを使えば test をするまでもないと
疑問に思ったのですが、どうなんでしょうか?
>>719
gcc -S -O2 test.c
(gcc 3.3.2 AT&T形式)

 pushl %ebp
 movl %esp, %ebp
 pushl %ebx
 subl $4, %esp
 movl 8(%ebp), %ebx
 subl 12(%ebp), %ebx
 testl %ebx, %ebx
 jle .L2
 call f
.L2:
 movl %ebx, %eax

確かにtestなくてもいいよな。
試しにtestを削除してやっても、まったく問題なく動作する。
う〜む。
>>704は逆アセンブルして読んで下さい。
現在Windows98を使っていて、Z80の勉強しようと思い
vectorで「Z80CPU Assembler & Simulator」ってのを見かけたので
落として使ってみてるんですけど、解像度が低くて美味しくありません。
何か他に便利なフリーソフトはないでしょうか?
723722:04/05/23 16:38
>>解像度が低くて美味しくありません

当方の解像度がSVGAでソフトの方がSXGA推奨なので orz
>>722
真のアセンブラマスターになるのに環境にこだわってはいけない。
未踏のジャングルを突き進む探検家や未知の洞窟を探索する冒険家のように
その場にあわせた環境に適応して生きていかねばならない。
725722:04/05/23 17:05
>>724
ハッ! (゚д゚;)
申し訳御座いません、自分が甘えておりました、
今から 根性叩き直して参ります (゚д゚*)ゞ
726名無し@沢村:04/05/24 21:43
おまいらよ、おれはつい最近つーか、たったいまさっきtcl/tkつーコンパイラの存在を知ったよ。
いまDLしてるところで、まだ開けて見てないんだが、Webでの説明を見た限りじゃなんか良さげだった。
つーか、GUIに関しては、Visual C++よりもちゃんとしたGUIアプリが簡単につくれるとのことだ。
ただ計算的な処理には不向きということだが、そこは何かC言語で書いて追加できるとのことだ。
おれはちょっとこのtcl/tkを調べてみるが、ホントにGUIに関して良さげだったら、いま開発中の「Vicual E++」は、
このtcl/tkで書き直してもいいな。Visual C++じゃエディタの予約語の色づけとかチョー面倒だしな…
そして内部のメインの処理だけをC言語で書くようにすればいいからな…
それができそうかどうかをまず調べてみようと思う。
次に調べたいことは、おれが次につくりたい高級言語に、tcl/tkはオープンソースらしいから、パクレる部分があるかどうかということだ。
ともあれ、おれのコンパイラの開発は飛躍的に前進しそうだな。
おまいらよ、おれはtcl/tkいま知ったぞ。おまいらは、tcl/tk知らなかっただろう?
二人は双子、似てない双子。
>>726
tcl/tkはインタープリタですが
●●●●TCL/TKなら俺に聞け●●●●
http://pc5.2ch.net/test/read.cgi/tech/1033628416/
それは、チックル・チーコ。
>>719
testがある時とない時ではオーバーフローしたときの結果が違うヨ
a = 0x7FFFFFFF, b = -2
なんてのは試してみた?
733732:04/05/25 04:34
ついでにいうと
>0のかわりに>=0を使った場合はtestを削れるような
コンディションコードがある
普通の感覚であれば、testは使う必要がないんだけどね。
Cの場合、intとintの演算結果はintになるからややこしい。
735720:04/05/25 09:41
>>732
あれ、sub命令ってオーバーフローフラグを設定しないんだっけか。
>>732
えっ、以下になるので結果はあってるんでは?
2147483647(0x7FFFFFFF) - 4294967294(-2) = -2147483647(0x80000001)
結果、f()は呼ばれない。
737736:04/05/25 10:34
げっ間違ってたです。ごめんちゃい。
>>736は忘れてください。
>>735
testあるなしで、>>732の場合結果は変わる。
デバッガで確認してみればいい。
guiといえば・・・
winasmなどがありますね・・・(windows apprication を作るIDE)
リソースもマウスでできるし、invoke命令も簡単に(invoke はMasm32
のApiCall命令)利用できるようになっていますし、簡単に自分好みの
IDEに作り変えることができますし・・・

ほかのIDEについてはここを参照するといいでしょう
ttp://board.win32asmcommunity.net/
ここのIDE(ただし全文英語)という欄を見ればたくさん面白いものが
のってますよ。
へー、winasmってフリーなんかね
フリーみたいですねー(制約などはあんまりなかったと思います)
まぁ、説明を読んでください。全部ではないですが、APIの自動検索
もできますしね。
 しかし、浮動小数点を実数で(つまりopenglなどの関数で、
invoke glcolor3f,0.1f,0.1f,0.1f
というように小数点をそのまま使うとエラーになり、.dataセグメント内でほかの代数で
たとえば
 .data
3dvector real4 <1.0,0.0,0.0,0.1,0.1,0.1,1.0>
などとして<>内は<vectx,vecty,vectz,x,y,z,α,>
など、vectx,y,z=は単位ベクトルの方向、x,y,zはベクトルの原点
などとして、 マクロを使って

coinvoke MACRO pInterface:REQ, Interface:REQ, Function:REQ, args:VARARG
LOCAL istatement, arg
FOR arg, <args> ;; run thru args to see if edx is lurking in there
IFIDNI <&arg>, <edx>
.ERR <edx is not allowed as a coinvoke parameter>
ENDIF
ENDM
IFIDNI <&pInterface>, <edx>
.ERR <edx is not allowed as a coinvoke parameter>
ENDIF
istatement CATSTR <invoke (Interface PTR[edx]).&Interface>,<_>,<&Function, pInterface>
IFNB <args> ;; add the list of parameter arguments if any
istatement CATSTR istatement, <, >, <&args>
ENDIF
mov edx, pInterface
mov edx, [edx]
istatement
ENDM
などとしているみたいですね。
>>741
追記(自己レス)
使い方は、たとえば、
coinvoke glvertex3i,addr 3dvector
などとしているようです。意味不明、&スレ汚しすいませんでした

743MS:04/05/26 08:31
MASM32って、はっきり言って違法だから。
そこんとこヨロシク。
しかし、国籍と本名出しているのにつかまっていないところや、
自分でリンカやコンパイラ作ったところを見ると、(商標違反っぽいが)
違法なのかどうかあいまい(MSがあるのは訴訟国家アメリカなのに)
微妙っぽいですね。
Windowsのライブラリって、Windowsを買い、契約したときに使用権限が
与えられないものなんでしょうか?(そこのところ良くわからないです)
デルフィをだしているボーランド社もまた別のライセンス契約しているんでしょうか?
まぁスレッドが荒れるならこれ以上言及しませんが、とても疑問に感じました。
http://www.cecs.csulb.edu/~hill/cecs325/MASM32/HTML/LICENCE.HTM
masmって商標じゃないって事かなー?
先生!質問です。
下の関数をアセンブラにしたいのですが、うまくいきません。
voidblendbmp( LPDWORD bmp )
{
intx, y; LPBYTEwork, work2; BYTEa, b;
work2 = (LPBYTE)bmp; work = (LPBYTE)lpScreen;
for( y=0 ; y<480 ; y++ ){
for( x=0 ; x<640*4 ; x++ ){
a = *work; b = *work2; a = a/2; b = b/2;
*work = a + b;
}}}
アセンブラ化
_asm{
mov ebx,bmp mov edx,lpScreen mov ecx,480 mov ah,2
LY:
push ecx mov ecx,640*4
LX:
mov eax,[edx] div ah mov bl,al mov ah,2 mov eax,[ebx]
div ah
mov cl,al
add bl,cl
mov [edx],bl

LOOP LX pop ecx LOOP LY }
>>747
改行していないところだとおもうんですが、
mov eax,[edx]
mov edx,lpScreen
という風にしないと認識しなかったはずでは?(ほかの箇所も同様)
749破壊神:04/05/26 18:38
>>748
自殺したら?
750719:04/05/26 19:49
OllyDbg を導入してみました。
>a = 0x7FFFFFFF, b = -2
subのラインにブレイクポイントをしかけて、
testのラインをハイライトにしてポップアップメニューから
Binary -> Fill with NOPs
をやったり
(そのNOP置換を)UNDO
をやったりしました。
Jump is taken もしくは Jump is NOT taken となって
挙動が変化するようでした。

変化することは確認できたのですが、なぜこうなるのかわかりません。
どこらへんにブレイクポイントをしかけて、レジスタやスタックのどこを
注目すればいいのでしょうか?
それから、キャリーフラグとオーバーフローフラグは何が違うのでしょうか?
>>747
ようやくきづいた
div命令の使い方をまちがってる,
div命令はaxを対象としているので除算エラーが出る
よってshift命令を使うのが正解。
shr eax =eax/2と同じ(実際にやってみるといい)
>>749さまへ
しまった・・・Lanケーブルで首つってきます…はづかしい
sub ebx,dword ptr [ebp+12]
test ebx,ebx
jle short @2

って

sub ebx,dword ptr [ebp+12]
js short @2

でもいい感じがするけど。
753752:04/05/27 03:43
あ、0のときダメだ。
忘れてくれ
なるほど。単純にSFが0かZFが1の時にジャンプが目的なのね。
今更理解したYo…。
>>754
なるほど。単純にSFが1かZFが1の時にジャンプが目的なのね。
でした。。
>>749はただの煽りだろ
気にせずにどうぞ。
いくらアセンブラ板住人といえど
(a-b)>0 と a>b の違いを知らないのはやばいだろ。
板?
signed or unsigned の話?
アセンブラ板ができたことを、ほんの少し妄想した。

↓アセンブラ板のスレッド一覧よろ。
(´_ゝ`)流石だよな俺らinアセンブラ板(´く_` )
アセンブラでActiveXコントロールって作れる?
7行プログラミングinアセンブラ板
NASM萌えAA化計画
C++は難しすぎ 難易度:2
【無謀】アセンブラでオブジェクト指向するスレ【無茶】
キャリーフラグなら俺に聞け
Z80がこの先生きのこるには
1行ずつ足してプログラムを作る@アセンブラ
NASMってなんで生きてるの?part3
NASM>>>>>>>MASN=糞w 0x02
CASLって頭悪すぎ(激藁
*g*a*s*厨*の*夏*休*み*
ブラ板の推奨ブラは何か議論するスレ
今時アセンブラなんて使ってる奴は人生の敗北者w
まぁフラグの話はIntelのホームページに解説書が載ってるので
それ見て学んでください。(シフト、ローテート命令など見てください)

ActiveX?そんなことよりもっと楽しい事ができますよ。
(考えない人にはわかりませんが)

敗北者?C言語がコンパイラによってアセンブラに翻訳されて、ようやくコンパイルするのに?
ハードウェア作る人にとってはC言語だけでは何もできんよ!(大きくて重くて)
何でそんなことがわからんとですか!
うーん貴官はよっぽど懲罰大隊がお似合いのようだ!それともシベリア送りか?
人生のフラグ立てる命令ってどこにあるんだろう
【人生の】私はアセンブルエラーでシベリア送りになりますた【敗北者】
単発質問スレ
お前ら Motorola 56kのアセンブラ助けて(;´Д`)
binutilsでクロス環境構築できない香具師は人生の敗北者
RISCって死滅しちゃうの?Ver.80686
彼女をアセンブラで構築したい
【Pentiumバグ有るらしいよ】 ここだけ時間が10年ずれてるスレ in 汗板 【回収祭】
【東京湾】セグメント漬け【沈めたろか】
【自称】2年間この板を荒らしつづけたある男【天才】
ネタスレにするなボケども・・・

話すこともないな。
もう埋め始まったの?
次スレどこ〜?
>>785
もちつけ
プレスコ買った香具師、SSE3について語るべし。
788名無し@沢村:04/06/02 00:29
おみゃーらよ、おれの「「Visual E++」」がバージョンアップしたから見ちみれ。
実はおみゃーらよ、今度のバージョンから密かに裏機能をつけているのだ。
どんな裏機能だと思う?ふふふ…教えん!自分じ探せ、おみゃーらよ!

http://hp.vector.co.jp/authors/VA015412/
うるせーバカ
>>775
股間
何故、荒れてるのか。
それが問題だ。
燃料投入までしばし待てや
と、>>792は謎の言葉を残して去っていった。
ファビョーン!
アセンブラってCPUが理解するコードでしょ?
それなのにどうしてcall MessageBox〜とか中に書いて動くの?
アセンブラの参考書を探しているんですが、これは
読んだ方いますか?どうでしょう?
ttp://www.amazon.co.jp/exec/obidos/ASIN/4062606194/qid=1086178123/sr=1-7/ref=sr_1_10_7/250-3639103-1268207
MessageBox の先に、CPUが理解するコードが入ってるのだよ。


実際にはもうちょっと複雑だったりする。
いや、とんでもなく複雑だが。

いま話題がネタスレのスレタイ以外なさげなので
厨房質問大いにOK

だとおもわれ
798名無し@沢村:04/06/02 23:35
おみゃーらよ、おれは昨日謎をかけたろ?
「Visual E++」に裏機能をつけたってな…わかるかな?
おみゃーらよ、それはマシン語とアセンブリ言語のハイブリッド化だったのよ。
まあ、アセンブリ言語のほうは、まだcall、ret、jmp、intの4つにしか対応してないけどな…
これから日々少しずつハイブリッド化を進行させる予定よ。
おみゃーらよ、このプロジェクトが完成した暁には、マシン語だけでも書け、アセンブリ言語だけでも書け、
またマシン語とアセンブリ言語をどんなふうに組み合わせても書ける、前代未聞の恐るべきプログラミングソフトができあがるぞ!!
自分じダウンロードしちみれ?おみゃーらよ?

http://hp.vector.co.jp/authors/VA015412/
799デフォルトの名無しさん:04/06/02 23:38
>>798
ハイブリット化よりアイコン書換れ。
8008086使った事ない:04/06/02 23:47
callは8086の命令か。はじめマクロかと思た。
6809のBSRかJSR相当だとするなら
「現在のインストラクションポインタの値をスタックに退避してから
指定されたアドレスにジャンプする」という命令だと思う。

どこにジャンプするかの指定がcallの後に書かれる訳だが、例えば
call 0x1000
とすれば0x1000番地にジャンプするのだろう。

で、問題のcall MessageBox〜だが、この場合はその飛び先の指定に
ラベルが使われているだけで、ラベルの値はどこか別な所で
定義されているんだろうと思ふ。

MessageBox〜の値が0x1000と定義されていれば
0x1000番地に、MessageBox〜を処理するサブルーチンが
置かれているのだろう。
>798
こいつはタダのバカですね。(^^V
(アセンブラやマシン語の前に日本語勉強しれ)。
>>796
人工知能作ろうと思ってあ〜る読むよりは役に・・・立たないな。
>>795
アセンブラ自体をCPUが読んでるわけじゃなし、結局吐かれるバイナリはCと同じ扱い
>>798
言いたい事はわかったからまずソース出せ。
話はそれからだ。
>>804
凄いものを欲しがりますね
>>798
ハイブリッド化が何を意味するのか分からん。
>>800
MessageBoxを実際のアドレスに直すのはリンカとローダの仕事。
最終的にはOSの仮想マシンの仕事
>>800
>call 0x1000
>とすれば0x1000番地にジャンプするのだろう。
正確には、インストラクションポインタ+1000h。つまり相対アドレスだけどね。
810800:04/06/04 01:09
>809
じゃあBSRの方か。サンキュ。
はじめて読む8086を読んでるんですけど、レジスタとかの
動き等がわかりやすい実行環境ってどうすればいいですか?
RISC
>>811
レジスタとかの動きがわかりにくいかどうかは君の理解力の問題だ。
CPUの状態をいちいち確認しながら動かしたいならデバッガ使え。
デバッガーがあればレジスタの状態を確認しながら実行できそうですね。
でも、フリーでお願いしたいんですけど、ありますか?
>>814
8086なら debug.exe でレジスタの値を見ながらステップ実行出来るが。
もっと画像でビジュアル的に見えるツールは無いのけ?

レジスタから転送してる様子とか
 .┌──────────┐
つ│.. GNU Visual Debugger..│
 .└──────────┘
>>815
debug.exeがあれば問題ないのですが…
どうしたら手に入るのですか?
>>818
OSが2000かXPならコマンドプロンプト開いてdebugと入力してみな。
95以上は標準でついてなかったっけ?
ttp://www.microsoft.com/whdc/devtools/debugging/installx86.mspx

漢ならカーネルデバッガ。
物理アドレスで暴れろ
何か嫌なことでもあったんですか?
コマンドプロンプトで打ってみたんですけど

「'debug'は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。」

となります。 (OSはXPです)


>>821
よくわからんです(´・ω・`)
ところでOS使わずにパソコン起動してそのまま動くようなプログラムはどうやって作るの?
例えばブートローダとかOSそのものみたいなものなんだけど

普通にVCとかでコンパイルしてもOSの上でしか動かないし
フロッピーにプログラム入れて、
PC起動した時にフロッピーの内容読み込むとか言う意味?
>>823
%SystemRoot%\system32\debug.exe
で起動できたらPATHが通ってない。

それでも起動できなかったら、これを使え。
ExDEB
http://www.vector.co.jp/soft/dos/prog/se008450.html
>>827
できました、ありがとうございます

普通の状態だとPATHは通ってるものなんですかね
こういうの始めようとしても最初で躓く人多いんじゃないかなぁ〜?
>>827
>ExDEB
よく使ったなぁ。しみじみ...
それ結構使えるよね。
>>828
普通、C:\windowsとかC:\windows\system32は初めからPATHに登録されてるはずだが…
>>830
そうなんですか…

昔、PATHを追加したときうっかり消してしまってたかもしれません。orz
832デフォルトの名無しさん:04/06/08 23:52
アセンブラの勉強ってどうすればよういですか?
日立のSH2ってCPUでのアセンブラを学びたいです。
コンパイラもないしどうすれば…
>>832
GCC
いちおうデバッガー(なかなかおもろい)
ttp://home.t-online.de/home/Ollydbg/
おいておきます。
835SH2ではないが:04/06/09 00:20
SH4のマニュアル、興奮しながら読んだ。
ベクトル関係がすごい。面白い。
>>835
それはDC専用だべ。(専用でもないか・・・)
いまならシェーダープログラミングでもっと楽しめますよ?
837デフォルトの名無しさん:04/06/09 10:13
初心者ですがチュートリアルでパスワードのはいろいろあるんですが
ドングルを苦楽したいのですがヒントとかありますか?
callをnopにするとかdllファイルまでのたどり方とか
ぜひプロの方アドバイスをお願いします
>>837
プロから言わせて貰うと、ソフト買ってプロに金流れるようにしてください。
>>837
プロじゃないが、スレ違いだ
840デフォルトの名無しさん:04/06/09 11:24
837です
スレ違いですか・・・すいません
>>837
>ドングルを苦楽したいのですがヒントとかありますか?
本当のプロならこんな事ですらヌルすぎてやろうとも思わないはず。
こんな事に時間を使わずにもっと他の事やるよ。
>>832
http://www.renesas.com/jpn/products/mpumcu/32bit/sh/architecture/index.html#2
から、アプリケーションノートに行って、
CPU編アプリケーションマニュアルを隅々まで読むのが確実。
無償コンパイラとかの開発環境もダウンロードできる。
ブートマネージャのMBMみたいなのでCDからもブートできたり
OSなしでCDやディスクの音楽再生できるのを作りたいのですが
どうやってアセンブルすればいいの?
Linuxの最小BOOTを構成して、ソースを追うんだ!
Win32 プラグラムに、パッチを当てるのに
既存コードを短縮する定石は?
84619:04/06/09 22:19
次スレは私に立てさせてください。
アセンブラ… (;´Д`) ハァハァ
>>843

次世代のBIOSがそんな感じだね
>>843
メインメモリが1MBの環境でもVRAMが32ぐらいあればいけそうだ
http://pcweb.mycom.co.jp/articles/2004/02/23/etbios/
こんなのをBIOSに頼らずに使いたいんでしょ。
BIOS使わずにBOOTなんぞできるわけねーだろ。
>>851
ROMくらい焼けますが何か?
853デフォルトの名無しさん:04/06/10 13:56
誰か俺のかわりにアセンブリ言語のプログラム
作ってくもらえないか?
またはそういう掲示板を教えてくれてもよし
BIOSに頼らずにじゃなくてOSに頼らずじゃ無いの?
850のBIOSを落として解析とか
>>852
ROMライタがあれば、プログラミングの知識がなくても焼けますなぁ。

お前程度じゃ、BIOS抜きには作れないだろう。
Morphy OneのBIOSを(ry
Athlon64ってIA-32を拡張したような64bitプロセッサだそうですが
それなら汎用レジスタは8本のままで、ある命令は特定の
レジスタでないとダメとかいう制限もそのままなんですか?
>>859
いままでとおりです。
mul命令なら、被乗数がRAXで結果はRDX:RAXにはいる。
>>859
アムドへ逝ってデータシート拾って濃いと
ちうかぐぐればその手の資料は出て来ないか?

レジスタ(GPR)は64ビットが16本(SP含む)に拡張された。
XMM(SSEレジスタ)は16本に拡張された。
MULとかの制限は興味がないので覚えていないが
アドレシング、たいていのALUは対称的に使えたかと。

FP/MMXレジスタは64ビット8本のままだ( ・∀・ )


もちろんふつーの32ビットWindowsをインストールしている限りは縁のない話。
862さっきゅん:04/06/11 10:00
AMD64では汎用レジスタもXMMレジスタも二倍の16個になってますが
命令によって使えるレジスタの制限は386とほとんど同じです。

AH〜DHレジスタと追加されたBPL,SPL,SIL,DIL/R8〜R15レジスタをひとつの命令で同時に
指定できないという新しい制限もありますが、xHレジスタ自体あまり使わないと思うので
こちらはほとんど問題にならないと思います。
# 覚えてないと稀にハマることがありますが・・・

また、拡張されたレジスタは従来のレジスタを使うより命令長が1バイト長くなることが多いので
スペース優先最適化をしたりパディング合わせをする場合は注意が必要です。

それらを踏まえ、SIL/DIL等の下位バイトレジスタが使えるようになった事でレジスタの価値は
ほぼ同列になり、汎用レジスタが2倍になった事でIA32よりも変数を多く使うプログラムが書きやすい
アーキテクチャになったと思います。
>>858
グラフィックが使えません。
864さっきゅん:04/06/11 11:16
ちなみに、>>861さんが最後に言ったとおりOSが対応してないとまったく意味がありません。
正確には64ビットOSでも32ビットアプリからは拡張されたレジスタは使えません。
この辺は386で拡張されたレジスタとまったく事情が違います。

しばらくは、286や386がそうだったように、Athlon64も高速i386としてしか使われないでしょう。

さいごに拙作ですが64ビットのDOSっぽいOSを作ってるので宣伝しておきますね
http://sakyu.s39.xrea.com/
OSってどうやってアセンプルするの?
さっきゅんかわいいよさっきゅん
( ゚д゚)ハッ!この書き込みにデジャビュ
867さっきゅん:04/06/11 11:55
      ┳
    / ̄ ̄\
    /xxx (,,゚Д゚) <呼んだ?
    lxxx (ノ   l)
    ヾxx   xメ
       U"U
>>864
高速i386では無くて、
「内部ポート構造とパイプライン構造の違うPentium4として」、
でしょう。MMX/SSE/SSE2命令は取り敢えず使えますから。
ただし、内部ポートの構造が違うことを認識していないと、
高速化しようと思って、逆にIPC詰まりを起こすことになるので注意。

…内部ポートの構造といえば、
Dothanのアーキテクチャの資料が見つからないなぁ。
PentiumM自体は、Baniasのときにチラッと見た覚えが有るんだけど。
869さっきゅん:04/06/11 12:52
Pentium4自体高速386としてしか使われないことが多々あるのでー
たしかにMMXとかSSEとかわ386じゃないですね
LinuxにしろwindowsにしろカーネルレベルじゃMMXすら使って無いよ
871さっきゅん:04/06/11 13:13
そうでもないよ
windowsは使ってないような気がするよ
レジスタも無限じゃないし
本当に必要なソフトのために開けとくってのは手かも
>>873
そういえば裏レジスタを割込み専用にしてクロック稼いだな
>>862
>AH〜DHレジスタと追加されたBPL,SPL,SIL,DIL/R8〜R15レジスタをひとつの命令で同時に

って、「movsx R15,ah」のような使い方ができないってこと?
今はともかくMMX出た当時はFPUとの切り替えのたびにペナルティー喰らうし
OSのカーネルごときがバンバン使ったら死ねるんですけど
877デフォルトの名無しさん:04/06/12 01:31
>>875
そうらしい。今AMD64のPDF見ていたが、REXプリフィックス(0x40〜0x4f)というのが
新設され、これはBPL,SPL,SIL,DIL/AH,BH,CH,DHの切り替え及び、オペランドサイズ
32bit/64bitの切り替えに用いる。

つまりx86-64のint型が32ビットになった理由はオペランドサイズを64ビットにするには
REXプリフィックスが必要であり、命令長が1バイト大きくなるためであると考えられる。
これはもちろん設計段階で逆にする事も可能だったろうが(386の考え方で言えばそう
なったはず)64ビットのintというのはそうそう使われる機会がないのとやはりメモリ効率
であろうと推測される。32ビット→64ビットの過渡期にはあり得る選択だ。

そしてもちろんBPL〜DILとAH〜DHをREXプリフィックスで切り替える事なしにオペコード
を作る事も可能だったろうが、できるだけバイト長を短くするために、滅多に同時に使われ
る事がないであろう両者を切り離してしまったのだろうと推測される。そしてもう一つ大きな
必要性は、REXプリフィックスを何とか1バイト長で済まそうと考えたところにあるらしい。

アドレスモードは64ビットモードとコンパチビリティ・モードがあるが、大半は64ビットモード
でアクセスするため、アドレスサイズ切り替えプリフィックスは不要になっている。何とも
ややこしいオペコードマップだ。
当然ながら0x40〜0x4fはINC/DEC命令であり、これはRISC/CISC混在型アーキテクチャ
ではかえってパイプラインストールの原因となるためなるべく使わない事が推奨されて
いるが、それを思い切って削って使用したのはさすがAMDらしい。Intelならまずしなかった
だろう。INC/DECは無くなった訳ではなく2バイト命令になった。
ttp://64bit-os.org/x86-memo/w.i?cu--MGLIkP
↑↑x86-64がケチョンケチョンにけなされております。
881859:04/06/12 07:02
>>さっきゅんさん
OS作ってんですねスゲエ
宣伝されていたサイトを拝見しました
現在プログラム板にはHSP関連スレに凶悪な荒らしどもが住みついています。

・HSPに関係の無い話題でスレッドを上げまくる
・HSPオフィシャルサイトの住人を名指しで誹謗中傷する
・重複スレを乱立させる

などの荒らし行為を行っています。
みんなで団結してム板のゴミどもを追い出しませんか?

【HSP関連スレ】
【皆のレイプ魔】HSP初質P25【WWEヲタ=ハゲ】
http://pc5.2ch.net/test/read.cgi/tech/1086878505/
HSP>>>>>>>>>>>>>C=糞w
http://pc5.2ch.net/test/read.cgi/tech/1071899663/
今日もどこかでHSP初心者が質問ですP19
http://pc5.2ch.net/test/read.cgi/tech/1084089079/
HSPについて
http://pc5.2ch.net/test/read.cgi/tech/1085149790/
883名無し@沢村:04/06/13 01:48
おみゃ〜らーーーーーーーーーーーーーーーーーーーーっ!!!
おみゃ〜らさーーーーーーーーーーーーーーーーーーーーんっ!!!

http://hp.vector.co.jp/authors/VA015412/

「Visual E++」がねーーーーー
ついにメインウインドウをつくれるようになったよーーーーーー
きゃあーもううれしいーーーーーーーーーーーーーっ♪
おみゃ〜らーーーーーーダウンロードしてみちみれ。
そして「winsample」フォルダの中のMainsample.asmを「Visual E++で」開いちみり♪
そしてビルドツールバーを押して、次に実行ツールバーを押しちみり♪
ねーーーーーーー?ちゃんとメインウインドウが出てきたでしょ?ちゃんとエラーもないっしょ?
もうおれ天才ーーーー神ーーーーーーーーーー
おみゃ〜らーーーーーーーーーーーーーーーはあはあ…
884デフォルトの名無しさん:04/06/13 01:49
>>883
Eって何? Executableか?
当然VisualE++はフルアセンブラで書かれてるんだろうな?
>>885
んなわきゃねーじゃん。
一年前まで『機械語』と『マシン語』を別物だと思ってた奴がつくったもんだぜ。
887デフォルトの名無しさん:04/06/13 16:06
Linux/x86でgccの3.2.3なんですが、
void func(void) { char x[256]; } のような関数を作成して gcc -O0 -S してみると、

func:
pushl %ebp
movl %esp, %ebp
subl $264, %esp
leave
ret

のように、自動変数用に264バイトもとられてしまいます。どうも、配列を宣言
したときだけ多めに取られるようです。int x; だけだと普通に subl $4 になります。

なんでこうなってしまうのか教えていただけませんか?
overflow対策?
>>887
http://www.codecomments.com/A86_Assembler/message201820.html
にかいてありまつた。 ('A`)ヴェノア。
VBプログラマが引き起こしそうなバグの影響を緩和するとか。
ただしバグはバグだが。
─┬─┬─┬─┬─┐
  │  │  │王←沢村
─┼─┼─┼─┼─┤
  │  │  │  │  │
─┼─┼─┼─┼─┤
  │  │桂│桂│  │
─┼─┼─┼─┼─┤
  │  │桂│桂│  │
─┼─┼─┼─┼─┤
891デフォルトの名無しさん:04/06/15 05:09
>>886
俺はそれよりも16進数文字列を メ モ 帳 に「B4 09 ・・・」と書いて保存し
拡張子をtxtからcomに変えれば実行できると思ってるのを見て目が取れた。

http://hp.vector.co.jp/authors/VA015412/kaisetu/hello.htm
>>891
>俺はそれよりも16進数文字列を メ モ 帳 に「B4 09 ・・・」と書いて保存し
>拡張子をtxtからcomに変えれば実行できると思ってるのを見て目が取れた。
すんげーワロタ!!
それともネタなのか?
だから格納したデータを関数の中で使おうと思ったら、もう一回「pop」してやらなければならない。
そして関数から戻る場合は最初に「pop」で取り出したアドレスをもう一回「push」してやらなければならないということだ。
(ここんところは、アセンブリ言語の入門サイトでさえ、間違ってるところがあるから、検索してみるといい♪)
http://hp.vector.co.jp/authors/VA015412/kaisetu/girl.htm

既存の概念にとらわれない斬新なコーディング手法だな・・・
>>894
それ読んでたら寒気がしてきた。
それ書いてる奴っていったい何者?
なにげにそのサイト、内容はともかくとして
結構な量を書いてるなぁ。
WONDER QUEST
沢村って真性?それとも釣り?
899さっきゅん:04/06/15 11:31
沢村なんて存在しないよ
幻なんだ
Windows XP 64bit beta プログラミングについて
話題になってる場所教えれ。
俺がやりたいのは、32ビットアプリから64ビットDLLを呼び出すための約束事と
Linux, Cygwin で 64ビット実行形式.or.DLLをクロスコンパイルするノウハウだ。

Linux で Win32 PE をクロスコンパイルすることには成功している。

擦れ違いと言われないように念のため言い訳しとくが、
64ビットDLLだけアセンブラで書きたいというワケだな。
MSの開発サイトにいきゃーいっぱいあるんでね?
バイナリエディタならできる
903900:04/06/15 22:01
とりあえず binutils-2.15 をひっぱってきた。

*** BFD does not support target x86_64-pc-pe.


うんこー
自分でやるか、あるいはバカ正直にDDK漁ってくるかー
(MSDN 加入してないよ〜ん)
漏れDQNだから沢村のどこがおかしいのか分からないよ
>>894とか、正しくはどうなってるの?
>>904
長いことやってないんで忘れてるけど
mov bx, sp
mov ax, [bx+2]
とかやってたような気がする。
>>905
bpのセグメントがデフォルトでSSだからbpを使う事の方が多いんじゃないかな。
DS! = SSの環境ではどうでもいいことだが。
スマソ。ゴミ残った。
DS = SSな。
>>905
おいおい、それを言うならこうじゃねーか?
push bp
mov bp, sp
mov ax, [bp+2]
少なくともメモ帳で十六進数書いて保存しても絶対動きません
>>909
...バイナリエディタ使えば動くでしょう…ってそこが間違いですね。
(ただし拡張子を.comとか、.exeにして機械語を各OSごとのフォーマット、
及び使用しているCPUの命令を形式どおりに打ち込めば動くかもしれないですね)

>>908
そうなってるかもしれませんね。ただしAPIの中には返り値をスタックにおくものも有りましたよ。
また、APIは普通に値をプッシュした後、callしてもOKなような気がします。(tasm、masm**ではそうだった。)

また、xchg [esp+8],[esp](この命令使った事無いんでちょっとおかしいかも…)
としたあとpopしてるかもしれないのでわかりませんね・・・
ちなみに、bpやspを使うとエラーになります。
沢村は__cdeclな関数を呼び出せない。
おまいらVisual E++落としまくってんじゃねーぞ。
newebがすげー重くなってんじゃねーか。
沢村はリバース金子勇。
>910
メモリどうしのxchg って出来なかったような気がする・・・が。出来たっけ?

>ただしAPIの中には返り値をスタックにおくものも有りましたよ。
ちと、disって見たいんで具体的なAPI名を希望。

あと、>>904からの正しいコードの話に追加なんだが、引数スタックを呼び出し先で破棄するのは
ret 2
とかやればいいんで、わざわざ自分でpush/popして調節する必要は無いっぽ
どうしても調整したいっていうんなら、例題の場合レジスタ上に戻るアドレスが有るんだから
pop bx
pop ax
 〜〜
jmp bx
とpushせずにレジスタ経由でジャンプして戻るのが定石。
サブルーチンコールしたものがスタックに値を保持するって、それ
コード依存な不正アクセスじゃないのかと。

たまたまそこに値が入ってただけだろう?
>>914
>ret 2(32ビットの場合はret4)
なるほど!そういう手がありましたか…

>>914-915
wsprintfがそうみたいです。(APIじゃなかったっけ・・・)
masm**でコンパイルして、vkdebugで調べたら、espが変化しています。ほかのPCはどうか知りませんが、スタックが増えていました。
(これが原因でよくエラーが出ました)
そこで、スタックを見てみたら、0000000hとなっていました。仕方ないので、
前後でespをほかの変数に保存する方法を使用しています。
917さっきゅん:04/06/18 13:18
いやそれ普通に考え方間違ってるから・・・
cdeclとsdtcallについて小一時間勉強汁
Note: It is important to note that wsprintf uses the C calling convention (_cdecl),
rather than the standard call (_stdcall) calling convention. As a result,
it is the responsibility of the calling process to pop arguments off the stack, and
arguments are pushed on the stack from right to left.
In C-language modules, the C compiler performs this task.

注意 他の Win32 関数は標準的な呼び出し規約(_stdcall)を使いますが、
wsprintf 関数は C の呼び出し規約(_cdecl)を使います。その結果、
呼び出し側プロセスはスタックから引数をポップする必要があり、
引数は右から左へ向かってスタックへプッシュされます。
C 言語を使って作成したモジュールでは、C コンパイラがこのタスクを実行します
(呼び出された側がスタックをクリアします)。
>>916
>wsprintfがそうみたいです。(APIじゃなかったっけ・・・)
>masm**でコンパイルして、
いえいえ、USER32のAPIです。

>>917
鳥取もstdcallを小一時間typo汁
920さっきゅん:04/06/19 16:00
ヽ(`Д´)ノ
WindowsAPIの業も深そうやのう。かかわりたくないもんじゃ。
おーい村沢
アセンブラでタブブラウザを作りたいのだが
アセンブラからCOMのコントロールを使うにはどうすればいいんだ?
923デフォルトの名無しさん:04/06/21 03:20
C=A×Bって書けますか?
924デフォルトの名無しさん:04/06/21 03:43
>>872
W2kはSSE
XPはSSE2使用
925デフォルトの名無しさん:04/06/21 07:13
引数の個数が不定の場合のstdcallはcdeclと同じになる。
>>922

さすがに無理だろ
>>923
それは1つの命令でってこと? CPUによるよ!
Cで出来る物はがんばればマシン語でも絶対書ける


面倒だがなー
>>925
引数の数が不定だと __stdcall は無理だろ。
スタックの開放はなんとかなるとしても
シンボルの“_<関数名>@<引数のバイト数>”が作れん。
930929:04/06/21 15:34
× 開放
○ 解放
COM系のAPI呼び出せれば出来るんで無いの
ATLのDLL使うのが楽
933デフォルトの名無しさん:04/06/22 15:39
掛け算のプログラムを書いてください
move.w #1,d0
move.w #1,d1
muls d0,d1
// 限定条件無いならこれでOKじゃろ。
long kakezan( long a,long b )
{ __asm {
mov eax, a
mul eax, b
} }
// 乗算命令使わずに、とか言うなら別途書くけど。
936935:04/06/22 16:04
こっちから限定条件出してあげやう。

乗除算命令、および条件判断を一切使わずに、
アセンブラで、整数の
a = b * c
を計算するプログラムを書け。
ただし、入力 b, c の有効精度は8ビット以上、
出力 a の有効制度は16ビット以上とする。
937935:04/06/22 16:05
×有効制度
○有効精度
しつもーん
256x256の表があるものとしていいですか?
条件判断できなかったら表引き以外に方法あるの?
教えてエロい人
940935:04/06/22 16:33
>>938
ダメとは言わないけど、出来たら使うな。判断はダメだけど、
フラグを演算に使うのは有り。

てことで、あと1時間で答え書くぞー。
おーい>>19=>>846。そろそろ準備しといた方がいいぞ。
>>940
まだ1時間待ってくれ
今来たばっかりなんだ
943935:04/06/22 17:29
答える人おらんのかな。
944935:04/06/22 17:30
んでは、18:30まで待ちましょ。
        まもなくここは 乂>>950盗り合戦場乂 となります。

      \∧_ヘ     / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ,,、,、,,, / \〇ノゝ∩ < >>950盗り合戦、いくぞゴルァ!!       ,,、,、,,,
    /三√ ゚Д゚) /   \____________  ,,、,、,,,
     /三/| ゚U゚|\      ,,、,、,,,                        ,,、,、,,,
 ,,、,、,,, U (:::::::::::)  ,,、,、,,,         \オーーーーーーーッ!!/
      //三/|三|\     ∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧
      ∪  ∪       (    )    (     )   (    )    )
 ,,、,、,,,       ,,、,、,,,  ∧_∧∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧
      ,,、,、,,,       (    )    (    )    (    )    (    )
漏れの課題がそれだorz
     \∧_ヘ     / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ,,、,、,,, / \〇ノゝ∩ < 950とり合戦いくぞゴルァ!!       ,,、,、,,,
    /三√ ゚Д゚) /   \____________  ,,、,、,,,
     /三/| ゚U゚|\      ,,、,、,,,                       ,,、,、,,,
 ,,、,、,,, U (:::::::::::)  ,,、,、,,,         \ ぶーぶーぶー /
      //三/|三|\              タリー
      ∪  ∪     (\_/)タリー    タリー   まだ早えよ〜
                (  ´Д)    タリー  タリー
                /   つ  (\_/)  (\_/)ノ⌒ヽ、
               (_(__つ⊂(´Д`⊂⌒`つ(´Д` )_人__) ))
948935:04/06/22 18:32
んじゃ答え。
;IA-32 version 8bit unsigned multiply a:16bit = b:8bit x c:8bit
macromul1bit
. add eax, eax
. sbb edx, edx
. and edx, ecx
. add eax, edx
mend
mul8x8:
. movzx eax, byte ptr b
. movzx ecx, byte ptr c
. shl eax, 24
. mul1bit; mul1bit; mul1bit; mul1bit
. mul1bit; mul1bit; mul1bit; mul1bit
. movword ptr a, eax
. ret
949935:04/06/22 18:33
ルーチン長くなるんでマクロ風にまとめたけど、概略はわかるでしょ。ミソは sbb edx, edx / and edx, ecx ね。
ただし、レジスタリネームの障害になるような処理(シフトを1個にまとめた)してるんで、P4とかじゃ、
かなーリ遅いと思われ。Z80とか向けかなぁ。他のCPUで挑戦してみてちょ。
950 (`・ω・´)シャキーン
951950:04/06/22 18:38
で、スレタイは>>19にすればええの?
952950:04/06/22 18:50
立てたよー。おいらは寝る

アセンブラ… (;´Д`) ハァハァ
http://pc5.2ch.net/test/read.cgi/tech/1087897801/
NOP
>>948,949
なるへそ
95519:04/06/22 20:36
>>950
おおお!!!ゲットされてた!!
スレタイ覚えててくれてありがとう!!!
アセンブラ… (;´Д`) ハァハァ
>>949
まあ、ニモニックの処理時間を計算しないと意味ないよな。
それをCPUが掛け算1個に内部で丸めてたらすごいがw

ただ、組み込みに使うようなCPUはビット操作は早いが演算は遅かったりするから
アセンブラいじってる人は使いたいんじゃないかな。

それ系のアセンブラアルゴリズム辞典とかもあれば読み物としても面白そうなンだがなぁ。
書いて出してよw
記念パピコ
>>929
遅レスだが、命名規約もcdeclと同じになるの
誰かお助け下さい
画像ソフトを作成しているのですが、アセンブラで書きたいと思ったのですが、
いろいろ調べたのですが、よく分かりません
// asmcodeの所に、*rをxorするのを書きたいと思うのですが、
ポインタ内の値をそのまま、いじる方法はあるのでしょうか
asm("xor %0,0ffffffh" : : "r"(*r)); ではないですよね。
uchar *r(img.bits());
uchar *g(img.bits() + 1);
uchar *b(img.bits() + 2);
uchar *end(img.bits() + img.numBytes());
while (r != end)
{
// asmcode
*r = *r ^ 128;
*g = *g ^ 128;
*b = *b ^ 128;
r+= 4; g += 4; b += 4;
} //gcc
32bitの画像ならこれでいいんじゃ?
_asm{
mov eax,r
l1:
xor dword ptr [eax],808080h
add eax,4
cmp eax,end
jb l1
}
>>960
ターゲットマシンがSPARCだったりしてw。
いえ、mips でつ。
Alphaが好きです
    DB  37 DUP (?)
    resb 36
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
バッファとかに

db '7777777777777777'

っての良く使ったっけ。逆アセすると

AAA
AAA
AAA
 …
AAA

になるから、デバッグ時にとても見つけやすいんだな。
PUSH
埋めろとか言われて久しいが全然うまってないなw
新しい方が釣堀になってしまったからな。
971デフォルトの名無しさん:04/06/27 02:50
マヌケがCがない環境があるっつー指摘を理解できないみたいだが。
>>967
その手のネタだと0xdeadbeefが一番有名だと思うんだが。
某ドライバを逆汗してたら、
mov dword ptr [ecx+08],deadbeaf
mov dword ptr [eax+30],facedead
mov dword ptr [eax+30],deadface
なんてのがでてきた。
無効な値として有名なやつですな。
975うめたいんでアゲ:04/06/29 02:00
そうなんだ。独学でやってたから、聞いたことなかったなぁ。
当時はネットなんぞはやる余裕もなかった。
Windowsでもえらーで0xdeadbeaf吐くことがあるね
beefだーごめんよー
>>976
>>973のヤツは実はWindowsの一部。
なぜかbeefじゃなくてbeafになっていた。
win32で動くx86-64アセンブラってありますか?
980さっきゅん:04/06/29 10:25
>>979
nasm文法でよければここから
http://www.tortall.net/projects/yasm/

gas文法が好きならここにあるgccとか
http://orange-pekoe.64b.org/cgi-bin/skynet/index.cgi

以下DAT落ちするので次スレへどうぞ
アセンブラ… (;´Д`) ハァハァ
http://pc5.2ch.net/test/read.cgi/tech/1087897801/
981979:04/06/29 11:38
>>980
ありがとうございます。あるんですねw

WinXPのカーネルモードでLongモードにして遊んでいるのですが
64bitコードをハンドアセンブルさせるのは疲れるので助かります。
982さっきゅん:04/06/29 12:00
素直にXP64使いませんか?(汁
>>981
プロテクトモードからLongモードに切り替えるには、ページングのOFF、ONが必要ですよね。
そのため仮想アドレスと物理アドレスが合っているメモリ領域を確保していると思いますが
どのような方法で確保したのでしょうか?
984デフォルトの名無しさん:04/06/30 01:11
985979:04/06/30 01:34
アセンブラ… (;´Д`) ハァハァ
http://pc5.2ch.net/test/read.cgi/tech/1087897801/
埋め
アセンブラ… (;´Д`) ハァハァ
http://pc5.2ch.net/test/read.cgi/tech/1087897801/
アセンブラ… (;´Д`) ハァハァ
http://pc5.2ch.net/test/read.cgi/tech/1087897801/
アセンブラ… (;´Д`) ハァハァ
http://pc5.2ch.net/test/read.cgi/tech/1087897801/
産め
アセンブラ… (;´Д`) ハァハァ
http://pc5.2ch.net/test/read.cgi/tech/1087897801/
産んだ
994デフォルトの名無しさん:04/06/30 08:34
1000?
995デフォルトの名無しさん:04/06/30 08:35
1000=
996デフォルトの名無しさん:04/06/30 08:35
1000*
997デフォルトの名無しさん:04/06/30 08:36
$1000
998デフォルトの名無しさん:04/06/30 08:36
#1000
999デフォルトの名無しさん:04/06/30 08:37
b
1000デフォルトの名無しさん:04/06/30 08:37
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。