1 :
デフォルトの名無しさん :
04/02/07 21:40
軽やかに3ゲット
とてもエッチなスレですね
Windowsで out とか in とか使って直接ハードウェア読む方法にについて 書いてある本かウェブサイトを知っている方居ましたら、教えていただけないでしょうか。
爽やかに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
アセンブラ… ('A`)マンドクセ
28 :
名無し@沢村 :04/02/12 23:38
>>28 のサイトでもう何というか…アレだ
いやもう何も言うことはないよ
いまだにuパイプvパイプを意識してしまう
31 :
デフォルトの名無しさん :04/02/15 09:56
>>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/な。 あとコンパイルじゃなくてアセンブルと普通はいう。 質問するときはエラーメッセージもきちんと書こう。
セミコロンはどういう意味で入れてるんだ?
改行をコメントアウト
nasm系アセンブラは嫌いですか?
GSレジスタって使われたことがあるのでしょうか? 少なくとも、NT系では使ってないですよね。
TOWNSではGSつかいまくり フラットモデルなら当然いらないよな Win32は変態だからFSは使うけど
NTのFSレジスタの使い方も、ほとんど意味がないような気がする
47 :
名無し@沢村 :04/02/18 22:11
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(モトローラ系)の記法に慣れる必要はあるね。
gccの出力を見るなら ・スタックフレーム(ローカル変数)へのアクセスに使用しているレジスタ ・レジスタ変数として使用するために予約しているレジスタ は把握しておいてからの方が読みやすいかも。 あと、最適化の度合いによっては 全然別物に見えるコードになっちゃったりするから。
コンピュータの構成と設計って本でMIPSを勉強するのがいいよ。 RISCに関する基本的なことは全部載ってる。
アセンブラで簡単なソース作ってアセンブルリスト見てるとおもしろいです。 初心者にもいい勉強になるんでないでしょうか。
適当に C のプログラムを書いて、逆汗。
なんで逆アセンブル? コンパイラにアセンブラソースを吐かせりゃいいじゃん。
>>83 82はきっと機械語と照らし合わせてるんだよ。
アセンブラを吐けないコンパイラもありますから
lddqu 命令の使用感レポートキボンヌ
88 :
デフォルトの名無しさん :04/02/23 20:41
アセンブラはお腹を一杯にしてくれまつか?
食ってみろよ
(゚д゚)ウマー
(+д+)マズー
bcc5.5.1を使ってます。 以下のように const char hello[] = { 'h','e','l','l','o' }; 文字列を確保したとき、const配列なので、 読み取り専用セクションに配置されそうだ と思いました。 読み取り専用セクションの名前は .rdata でしょうか? それから、このセクションは、 同じプログラムを複数起動したときに、 共有される(メモリ使用量が減る)のでしょうか?
.code じゃないの? >共有される(メモリ使用量が減る)のでしょうか? されないかと
.text
AMD64向けに何かコード書いてる香具師はいないのか?
_ /〜ヽ (。・-・) オレオレ ゚し-J゚
>>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%位、スループットが改善するようです。
まあ、アライメントをうまく合わせられればそっちのほうが良いと思います。お手軽高速化用ですね。
>>99 sub ecx,1
の前に、
add esi, 64
add edi, 64
を入れるの忘れてました。スマソ。
101 :
デフォルトの名無しさん :04/02/25 12:04
BCDってなんのためにあるんですか?
_ /〜ヽ (。・-・) 10進数の計算とか ゚し-J゚
>>102 それはそうなんですが、1バイトで10進数の一桁を
表現することの意味が分りません。具体的な使用例
見たいなのがあれば教えて下さい。
4bitで一桁ですね。
COBOLの数値表現形式の一つですので、 アセンブリ言語でBCDをサポートすると実行を高速化できます。 COBOLは、銀行などの事務計算によく使われますが、 そういうアプリケーションでは小数を扱ったときの桁落ちが許されません。 そんなとき10進数で演算できると便利なのです。 1%の金利(=0.01)というのを2進数で表してみるとわかります。
昔のアーケードゲームのスコアとかではよく使われたもんだが>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 ってありますが、これ間違いですよね?
連カキコ、すいません。
電卓のCPUはBCD計算に特化されているものだよー。 なにしろ、4ビットマイコンのくせに16桁のBCDの加減算を1命令で できたりする(w 某社の16ビットポケコンは86じゃ遅いから、専用のBCD演算コプロを 積んでいたりする。さすが電卓屋。
>>110 日本語と英語のマニュアルでは、CVTxxx命令、割り算命令が違ってるね。
間違っているのは日本語のマニュアルの方みたいだけど。
>>110 日本語マニュアルは、急いで作ってるのかタイプミス多いし、
コピペして作ってあるところが多くて、
ひとつ間違ったら連続で間違っている場合が結構ある。
(だから逆に間違いが分かりやすいという話も有る・・・)
それと、Xeon込みで無い時の
「Intel Pentium4プロセッサ最適化リファレンスマニュアル」
だと、ADDPS,DIVPSのレイテンシ、スループットには、
正しい値が記述してあるので、版を更新する際にエンバグしたと思われ。
それでも、AMDと違ってちゃんと日本語マニュアル作ってるだけ全然良い。
ただ、
http://www.intel.com/technology/itj/q12001/pdf/art_2.pdf みたいな周辺資料の日本語版が無いのはなんでだろう…。
突っ込んだ最適化をするときは結構重要なのだけど。
_ /〜ヽ (。・-・) 日本語の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の方が倍速いな。
133 :
NASM初心者 :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 かつての最適化伝説も今やダメポ
>>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
Digital Mars 32bitのコードに寒気を覚えた。 折れの脳内トランスレータじゃとてもそんなコード吐けない orz
なんか後付けっぽく嫌なんだが、おれが考えなし に書いたらdmcのコードにする。 ここの常駐人もだいたいそうだと思うんだが
こうして見るとOpenWatcomの遅れぶりがめだつな 関数呼び出しを定義できるくらいしか、面白みないな コードジェネレータのソース読んでみたけど全然 わからんし・・・
最適化ほとんどできないヘタレプルグラマなんでorz
コテは放置が基本だorz
つか鳥取砂丘って共有コテって聞いたけど?
orzてなに?
あ、わかりました。一秒長く考えるべきでした。
>>153 150のとおり、依存関係バリバリのコードは
賢くないよ。レジスタに使用に制限があるなら別だが。
↑「に」が1個多いね
主張はコードでよろしく。cmovはだめだかんね
なんでcmovccはだめなの?
はっきり言ってこちらが聞きたい。 なぜ使ってよいのかと。
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
>>173 cxは間違いです。
ecxに書き直してもう一度やってみました。
結果はlp1が30万、lp2が70万でした(値が安定しなかったのでHTをOff)
ということで、cmovを吐くコンパイラの勝ちということで 終了
cmovて何? Pentiumにあた?
↑シーラカンス
プログラム言語知識まったく無しなんだけど逆アセンブラ勉強したいのだけど 初心者でもわかる本教えて下さい
本なんてありません
いまやP6以降のプロセッサが主流なのに、 頑なに元祖386由来の命令に拘る理由って なんなんでしょ>コンパイラ作ってる人
>>182 わざわざ本を買う必要はありません。
初心者が勉強する程度なら、ネット上の解説や資料で十分。
>>184 ここにいる素人には永遠にわからんよプゲ
初心者の勉強に最適なネット上の解説や資料ってどこにありますか?
ハカーキタ━━━━━━(゚∀゚)━━━━━━ !!!!!
ところどころわからないのがある
(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もそれぞれ意味があって使いわけてる ように見えるけど
そろそろスレ違いな話題はやめましょう。
>>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にできないって事ぐらいの意味
200 :
デフォルトの名無しさん :04/02/28 15:41
メール欄に書き込むのが面倒なだけじゃねーの。
249 マロン名無しさん sage 04/02/28 14:25 ID:??? ●やさしい煽り学 文字で何と書いてあるかではなく書いた人間が一体何を狙って そこにその文章を書いたのかを考える。 文字自体はほとんど読む必要がない。 なぜなら彼の本当の狙いは文字としては書かれていない。 狙いが分かったら後はそれを失敗させる。 ? 「狙い」の典型的なパターン 場の雰囲気を悪化させたい。 誰かのやる気を無くさせたい。 誰かと誰かの関係を悪化させたい。 煽りに反応させることで相手の人望を失わせたい。 それらを為すことで自己顕示したい。 煽る人間はその行為によって何かが変わって欲しいと考えている。 従って先方からしてみれば反論だろうと罵倒だろうと とにかく誰かから何らかの反応を引き出せたら成功であるということに注意しなくてはならない。 最も多くのケースを効果的に解決できる手段は、安易ではあるが、「全員一致での無視」である。 もし不幸にも煽りに対して真面目に反応してしまう人間が身内にいるなら 何とかしてその人間を黙らせなくてはならない。 そういった中途半端な味方は煽り本人より厄介である。 また、煽りという手法をよく知る人間にとっては、 煽りに対して真面目に反応している人間というのは極めて無様に写ることにも注意すべきである。 もしあなたが既に人望を持つような立場の人間であるなら、 全ての煽りに対して常に冷酷に対処しなくてはならない。
最近このスレ荒れやすくなったと思わないか?
春が近いからこんなもんだろう。 他のスレも変なの増殖してるっぽいし。
俺が言いたかったのは、lp1とlp2では計測している時間の意味が全く異なるって事。 lp1が計測しているのは三項演算子のスループット。 lp2ガ計測しているのは三項演算子のレイテンシ。 lp2と同じ意味(レイテンシ)でlp1を計測するのであれば、 次のように三項演算子の出力が次の三項演算子の入力になるようにしなければならない。 lp1: cmp eax, 0 mov edx, 100 mov eax, 300 cmovne eax, edx sub ecx, 1 jne lp1
俺のせいで荒れちゃったのかな。 マジで誤ったつもりなんで、まったり進攻にもどって下さいよ まぁそれは別として、コンパイラの吐くコードの品評は なかなか面白いな
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でしか発行できないから。
>>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
○t4 + 4 ×t3 + 4
クロックはかるまでも無く、cmov使った方が当たり前に 速いと思うんだけど ついでに言うとwinなりlinuxなりではかっても、参考値 ぐらいにしか思えない
↑バカ?
↑バカ
JPEG/MPEGでおなじみのDCT演算をSSEで組んでみました。小数点演算はナシで、 wordの整数演算のみで組んでみたのです。バタフライ演算とかいうやつですね。 100万回ループさせてタイムを計ると、mmxで真正直にDCTを計算させたものより 4割近く遅いし、コードもデカイ。いいことなしです。 さて問題です。どうすればPen4でDCTが速くなるでしょうか? 1. コードが増える整数演算は止め、固定小数点あるいは浮動小数点演算を行う。 2. 同様にコードが増えるバタフライ演算をやめ、真面目にDCTを実行する。 3. バタフライ演算かつ整数演算でも早くなる。精進しろ。 3案のうちどれが適切でしょうか。ただし、根拠のない3はお断りです。ソースコードがあれば参考にしたいですね。
まずお前がコード提示しろ
宿題スレのノリだな
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日後好きな人から告白されるわ宝くじは当たるわ 出世しまくるわ体の悪い所全部治るわでえらい事です
>>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 そりゃ、デコーダの消費も実行ユニットの消費も少なくて済むからでしょう
ありがとうざいます。 プリフィックスについてはよくわからないので、 lea使ってみます。
pause命令って2バイトnopなんだよね。アレプレフィックス一杯つけたらどうなるんだろう
236 :
デフォルトの名無しさん :04/03/03 01:58
winXP sp2ではPAEモード(64Gのメモリが使えるやつ)がデフォルトになるの? もしそうなら、パフォーマンスが落ちたりしないのかな
PAEがデフォルトになるのは64bit版だけじゃないの?
238 :
名無し@沢村 :04/03/03 06:38
>>217 DCT演算ならCASLUで業務用アプリを組んだときに、使ったことがあるよ。
AMD64のPAEでしか使えないから32bitプロセッサ積んでるなら関係ないんじゃない?
>>239 レガシーモードのページング方式はK8からいくつか追加されたけど、
従来型の4kニ階層のやり方ではNXビットなど置くスペースはPTEにはないかと。
XPSP2での拡張は新しいページング方式と一緒に使わなくてはならない。
物理メモリ搭載量が例え4Gよりはるかに少なかったとしても。
っていうか、NXビットってCPUが見るフラグでしょ。 置く置かないの問題ではないよね。
>>242 いやだからCPUのプログラムインタフェイスの設計の問題として
これはインテルの陰謀に違いない。 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だったよね。 上位ビットは大部分が使われていないけど
>>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
256 :
デフォルトの名無しさん :04/03/04 09:55
かぶったw
思いっきりかぶっちゃったね(´ー`)
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 だと、パーシャルレジスタストール起きちゃうのかな?
>>272 SuperPIは多倍長乗算にFFTを使っており
ビット逆順アクセス処理にランダムメモリアクセスを伴います。
このため、メモリアクセスには敏感なソフトだと思います。
試しにEDO DRAMのメモリセッティングを変更した場合の結果を書いておきます。
SuperPI 104万桁, Pentium II, PAE off
7分54秒 : EDO DRAM 60nsセッティング
8分50秒 : EDO DRAM 70nsセッティング
自分でちょこっとテストコードを書いて試してみた感じでは、
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゚
>>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 という命令は存在しないと思う。
>>297 サンクス
結構マニュアルのミスあるみたいですね。
MOV r/m64, imm32 (32bit即値の符号拡張)も
IA-32eのマニュアルでは、32bit即値のゼロ拡張になってるし。
全然関係ないけど、movdの一つ目のオペランドの上位ビットが 0クリアされるのがムカツク。余計なことを
>>299 多分
movd レジスタ, メモリ
の場合を言っているんだろうけど、
ゼロクリアされないと、レジスタの余計な依存関係が発生して、
スケジューラにかなりの負担が掛かるので却下。
(例えば、レジスタを部分的に残してしまう movhpd とかは、
使うタイミング間違うとかなり面倒な依存関係が起きて
パフォーマンスの低下を招く)
同じ理由で、中途半端にフラグの変化する
inc,dec も、P4以降では使わないほうがいい。
gccのインラインアセンブラの文法がよく分からないのですが、詳しく書かれているサイトや本などありませんか?
>>299 同感。
Aviutlのデータ、ダブルワードにして欲しい。
305 :
デフォルトの名無しさん :04/03/13 09:38
な、なんだってー(AA略
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以外でも、ローテート演算子持ってる高級言語ってないね。 ・・・いや、あるかもしれないけど俺は知らない。
ローテートて、使い道ないだろ? なんかある?
現代暗号とか組んでみようとしたときに必要だった気が・・・
キャリーを巻き込んでのローテートとかもあるよな。
ローテート命令でで掛け算をする。 ってかもう使わんか。
>>322 シフトの桁数が多い時に、逆方向にローテートして余りをマスクする。
安物CPUには任意の桁数をシフトする命令がないのですよ。
>>327 最適化の邪魔になるのであんまし使いたくない。
PC-98のグラフィック描画で、ローテート命令はよくつかったけど。
330 :
デフォルトの名無しさん :04/03/14 16:33
すみません。OSとアセンブラはどのような関係にあるのでしょうか。
吉野家と牛丼の関係ぐらい?
何か違うような気がする
特にこれといった関係は無いと思うが。 OS の一部分はアセンブラ使って書かれると思うけど。
system call とかは?
某OSのコードだとアセンブラの部分は極一分しかなかった。
最近のコンパイラの最適化は結構賢い 昔、Cなんてのはトロい代名詞だった… (最近はCPUパワーにおんぶされてるというのもあるが)
昔はコンパクトでかわいげがあったけど 今は顔もみたくない 関係でいえば嫁みたいなものかなぁ 見たくないけど一番の理解者
MS-DOSでは、コンパクトに.COMで作るのが好きだった 最近は全部.EXE。。。
洩れは殆んど .HEX。。。
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でしょ
初めて読む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
の方が早い場合が多い。(依存性解決の必要が無いからね)
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ビット確認
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;
大丈夫じゃないの? モリアガラン
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
>>374 もちろんそのプログラムはマシン語で開発したんだろうな?
恐ろしくでかいEXEができるのはなぜ?
>>374 なんだか面白そうだね。
でも、”Visal E++のダウンロード”ってなっているよ。
沢村を弄るスレはここですか?
あ、さっきゅんだ。俺だよ俺
俺俺詐欺キタ━━━━(゚∀゚)━━━━!!!!!!
不覚にも藁田
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
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だと目に見える速度で切り替わってるん?
[スタートボタン] → [ファイル名を指定して実行] で "perfmon" と入力して[OK]を押と、パフォーマンスモニタが立ち上がる。 ╋ボタンを押して[カウンタの追加]ダイアログボックスを出す。 [パフォーマンスオブジェクト]に"System"を選択し、 [一覧からカウンタを選ぶ]から"Context Switches/sec"を選択して [追加]ボタンを押す。 これで1秒間に何回コンテキストスイッチが起こっているか リアルタイムで確認できます。
>>401 割り込みも含んでいるのでは?
でも・・・「キャッシュ1ライン埋める程度の作業に10000クロック」で
なんか説得力失くしてるような
タイムアウト以外でもコンテクストスイッチは発生するし intelのキャッシュはライン全てが埋まる前に順次アクセス可能になったような気がする
P4のキャッシュラインって、確か64byteでしょ。 せいぜい数百クロックで埋まると思うんだが。
メモリアクセスのコストはでかいよ。
今日「いまどきのアセンブラプログラミング」なる本を買ってきました。早速勉強してみます。
>>411 もしやさほどいい本でもないと・・・・?
早速7Pで誤字を発見、こういうことなのであろうか・・・・。
立ち読みした事あるけど地雷だね
パラパラとめくって見たけど・・・・なんだこりゃ誤字だとか誤記だとかが多すぎます。 なんとか頑張ってみます。
その本の紹介文の一部です >ゲームやソフトを実際に解析する具体例を以て行う実践解析ガイド >ゲームで「キャラクターを無敵にしたい」とか、特定のソフトで機能制限を解除したい」などが 導入としてこの手の話題は悪くないと思いますが 肝心のアセンブラの解説にいくまでに息切れした感があります ゲームラボの延長のような位置付けなんでしょうね
たしかに・・・ツールの説明でページ使いすぎです。
>>410 その本はゲーム解析者の間では「買う価値の無い本」として有名です。
ゲームの改造ネタは色々なゲーム解析サイトの解説を参考にしていますが、
ライターに知識がないのでこの本の解説では間違いだらけになっています。
それに、インテルのアーキテクチャマニュアル丸写しのページは、
索引がないのでとても使いにくく評判が悪いです。
ゲームの解析がやりたいのなら、下のサイトで勉強した方が良いでしょう。
「いまどきのアセンブラプログラミング」よりもはるかに役に立ちます。
アセンブリ言語のソースコードもありますし。
http://gamereverserz.cjb.net/
>>418 そうですか・・・・衝動買いはいけませんね、ありがとう。
>>410 アセンブリを真面目にやりたいならはじめて読む8086でも嫁。
ゲーム解析は知らん
「プログラミングの力を生み出す本」って読んだことある人いる? 評判いいみたいなんだが、実際どうなんでしょう?
アセンブラのシンプルな美しさがたまらん。 コードを一行書くたびにうっとりしてる。 高級言語のゴテゴテした記述には吐き気がする。
>>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
意味のわからないレスが続いております。
GUIなデバッガがあるかと言うことだろうか? もしそうならOllyDbgなどがあるけど
意味のわからないレスが続いております。
母国語(日本語)をおろそかにしていると、外国語の習得 もおぼつかないぞぉ
debugでGUIできる?、という意味自体いまだにわからん俺はバカですか
debug.comでGUIのpろぐらむが
>>446 debugとGUIに関する知識をつけてから来るように。
はい、次の人。
439=441=448 ヽ||´ ∀`||.。oO(知ってるがお前の態度が気に入らない にははーっ)
知ってるがお前の態度がピッチャーデニー
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
RET?
>>439 >debugでGUIできる?
debugとGUIの単語を入れ換えれば意味が分かる俺は天才ですか?
意味が変わる罠
中学生お断り
ぶでむし
>>443 OllyDbgは使えそうだが、Winか。
Linux環境のやつを探しているのだが。
>>459 >>439 ではないよね?
kdbgとかgdbのGUIフロントエンドの類はいくつかあるみたいだが
461 :
デフォルトの名無しさん :04/04/19 21:46
おなかはいっぱいでつか?
できますか?
できちゃった。。。
>>425 です。
結局、基本方針は作り直しに限りなく近い移植
となりました。 アセンブラを参考にしつつ、作業をすすめるつもりですが・・・。
アドバイスありがとうございました・・・。
そう言えば $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
str[0]はcharだからebx全部収めるには小さいと思うけど大丈夫?
>>478 ではありませんが、参考になりました。
char c;
asm ("movb $0x41, %%al;\n\
movb %%al, %0;" :"=r" (c) );
putchar(c);
おまいらアセンブリのコーディングにはどんなエディタ使ってる? 俺はedit.exeだが・・・
488 :
デフォルトの名無しさん :04/04/25 15:12
ビデテープかよ
プロテクトモード移行関連のいい資料ないかな・・・ インテルのマユアルぐらいしかしかないか
まゆある まゆタン(*´Д`)ハァハァ
>>492 こういう時だけは2chに張り付いてるキモい奴が裏山しくなるんだよな…。
お前も張り付いてんじゃんw
>>492 また復活した。多分最小限のWin32APIとかが入ってるのかな。
即デリされて即同じ垢取ったんだろうからまた即デリか?
またビデテープだし
ナニコレ?
>>494 あのレス速度と書き込み内容見てもそう思ったのか?相当頭腐ってるようだが
>498 まだ493から2時間もたっとらん
ニヤニヤしていいですか?いいですよね。(・∀・)ニヤニヤ
>>compiler.e-city.tv ホンマに一発で豆32できるね。Warningだらけだが。 ホンマにIntel C++使えるね。Warningだらけだが。
そこが少なくともここより糞スレだからこっちに書いた
mov dx,NIYA mov ah,09h int 21h segment data NIYA: db 'NIYA NIYA',0dh,0ah,'$'
>>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バイトアライン
・・・するとデータの並びが綺麗になって処理が少し早くなる
ってことはAの箇所は無くても動作上は問題ないってことですね。
これがアラインなのか。ナルホド
どうもアリガトン
>>507 ,508
510 :
デフォルトの名無しさん :04/04/26 01:55
引数をどういう順序で積むかとか、関数内で変更しちゃいけないレジスタの一覧とか、 そういう規則(calling conventionっていうんでしょうか?)はどこ見れば書いてありますか? x86のLinuxでインラインアセンブラで遊んでいます。
>>511 サンクスコ
しかしなんつーかもっと公式っぽいのはないもんですかね・・
>>511 見てみたけどあんまぱっとしないね
VCの呼び出し規約だったらMSDNにあったはず
>>510 gcc/config/i386/i386.h
マクロの説明はinfoにある。
インラインアセンブラなら引き数ちゃんと指定すりゃ、
そんなん気にしなくてもいいはずだが。
>>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 (゚д゚)ウマー
もいっこ、、gdbは、Cソースとasmリストを両方表示するような、いわゆる混合モード?のようなのはないのでしょうか? disas結果とにらめっこはつらいっす。
>>521 いや〜、emacsでM-x gdbしてるんすが、混合モードにできるんすか??!!
524 :
デフォルトの名無しさん :04/04/27 00:15
いまさらpentium・・・
目次紹介ぐらいつければいいのに
解説がこれだけだと地雷かどうか判断つけかねるね
528 :
デフォルトの名無しさん :04/04/27 00:40
はじめて読む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 =アセンブリ言語とマシン語が常に一対一で対応すると思ってる香具師
( ´_ゝ`)
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の最適化もそんなに悪くはないはず
アセンブリのスレですよ。
オブジェクトに互換性は無いの? 開発環境がWindowsに限定されるからやる人がいないだけで リンカさえ用意すればx86環境はMicrosoftでも統一できないか?
>>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 ;(省略)
配列の使い方が分からないです。 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] こんな説明で分かるかな?
>574-576 なんとなく分かりました ありがとうございます
578 :
デフォルトの名無しさん :04/05/03 18:03
xemacs上でgdbを使っているんですが、実行中および前後の命令を表示しつつ ステップ実行することはできないでしょうか? gcc -S結果のファイルをあらかじめ 用意しておくなどの方法でもかまいません。 よろしくおねがいします。 ...と。
>>578 define hogehoge
x/1i $pc
si
x/2i $pc
end
くらいでどうよ。
おまいら何つかってコーディングしてるよ?
紙とエンピツ
エディター
cat > file
努力と根性
カロリー
588 :
デフォルトの名無しさん :04/05/09 23:32
おいアセンブラはやる価値あるか?
>>588 そんな事よりきいとくれ。
俺が学生の時に60過ぎの教授、「アセンブラと言ってもこれでは有りません」
とか言って、プログラミング言語の講義中に麻宮騎亜の「アセンブラ0X」を出して来た
んだけどどう思う?
それがどうしたよ、おっさん。
反応する人間=仲間を探したかったんだよ。うん。
アセンブラ勉強しようと思うんですが お勧めなサイトとか本とかあったら教えてください
ぐぐれ
>>592 勉強する目的を書いた方が良いかと。
例えば、目的がアセンブリ言語でのプログラミングの場合と、
目的がゲームの解析の場合では、回答も違ってくるから。
いずれにせよ、「いまどきのアセンブラプログラミング」という書籍は買わないように。
絶対に後悔するから。
ここにはモトローラの石使いはおらんのかい? LDAA #8AH CMPA FG BCC SWCAL などの命令が見られないのが寂しい。。
STAB ぐさりと刺す。 SEX オニーチャンノエッチー(AA略。
>>599 ありがとうございます。
某オンラインゲームのチートスレでそこは初心者には難しすぎるから
もっと優しいところから始めろと言われたのですが大丈夫でしょうか?
>>601 >>599 のサイトは、プロセスメモリエディタすら使いこなせない初心者には難しいが、
これからアセンブリ言語のゲーム解析への応用を学ぶ人には丁度いい難易度だと思う。
「Questions/Suggestions」のコーナーで、初心者はどう勉強すればいいか解説してあるし。
603 :
デフォルトの名無しさん :04/05/11 03:54
emacsやvimはアセンブリ言語では作られていないのですか?
いません。
どおりで重いわけだ
(・∀・)はアセンブリ言語では作られていないのですか?
いません。
どおりで重いわけだ
>>591 え〜?「60過ぎの教授」なんだろ?
きっと一世一代のネタだったんだよ。
最近の女の子はアセンブラで作られていますか?
いません。
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がくっついてるんで 何か資料がないと…
左右スクロールはこんな感じか? (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;左ボタン
タブが完全に飛んでしまった。 つか、上下チェックでやってるコードを参考に 左右チェックのコードを書き加えれば動くんじゃないかなと。 ソースの75-90行あたりに上下チェックのコードが書かれてます。
>>624 >僕はアセンブラもDOSもダメです。
じゃあ諦めろよ。
それとも何か?「誰か改造して!」っていう依頼なのか?
ちゃんと答えてやったところで、アセンブル&リンクできるかどうか 非常に疑問だな。そもそもアセンブラとリンカはあるのかな?
>>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 ではないのであしからず。
女子高生に人気の 斡旋ブラ 好評発売中!
アセンブルポ
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が ウ コン
仮想マシンだヴォヶ
なつかしい命令がいっぱい。
たとえCコンパイラがマシン語を吐いているとしても それはマシン語からOSのAPIを呼び出せる理由の説明にはならない
馬鹿ではない。ネタだ。
いや、ネタじゃなくてマジなんですけど 世間でもアセンブラでWin32は無理とか言われてるし
>>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); } めっちゃ呼べるけどね...。
つーか、RosasmっていうWin32バイナリを作る為のアセンブラもあるんだけどね。
>>664 >でもってAPIはDLLファイルに入っている関数でアルファベットの名前も付いてる
それもマシン語なんだが
なんだかなあ…
>>664 一度、アセンブリコード付きのコンパイルリストを出してみろ。
ダイナミックリンクの動作、仕組みが知りたいって事でしょ。 俺は知らんけど。 文字列をOSに渡してOSは指定されたものをメモリ上にロードして よろしく実行してくれるんじゃないの?
bcc21 -S test.c で、アセンブラコード吐けるんじゃなかった? APIを使ったプログラムをCで書いてアセンブラではいたら、出て来るんじゃない?
誤 bcc21 正 bcc32
起動時にリンクするのと実行時にロードするのとでは 扱いがちょい違うよね。
アセンブラできることが小さなプライドなんだろう。 そっとしとけよ。
せめてポート直叩きしたり、割り込みハンドラ定義したり、 Cのスタートアップを自力で書いたりしてくれないと、 アセンブラできるとは言って欲しくない。
678 いぢめた方が暇つぶしにはよさそうな…
681 :
デフォルトの名無しさん :04/05/19 23:53
Z80アセンブラのプログラムで、9000h番地から256バイト分のメモリの 値を、0,1,2,3・・・255の値で埋めるというプログラムを教えてください 最初はORG8000Hってかんじです。お願いします。
>>681 そんな難問ここにいる香具師に解かるわけないじゃん。
自分で考えたほうが早いって、絶対。
661必死だな
このスレは自慢房のオナニースレだから
>>683-684 たぶん俺にだよな?
681 に対して助言半分、厭味半分のつもりだったんだが。
6809版 ORG $8000 LDX #$9000 CLRA LOOP STA ,X+ INCA BNZ LOOP RTS
>>688 周囲の失笑を買うことが多くありませんか?
× BNZ LOOP ○ BNE LOOP だったか。 >689 久しぶりに書いてみてぇ、とか思ったんで。
>>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はとじ括弧なのか。 よく解読できたな。
すげえ、感動した。 元は「多少冗長だけど、普通に意図は理解できる文章」なのに、 ")"を"9"に変えただけで、これほど 「何いってんだか全然わけわかんねえ文章」になるなんて。
手元のキーボードだと 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を削除してやっても、まったく問題なく動作する。
う〜む。
現在Windows98を使っていて、Z80の勉強しようと思い vectorで「Z80CPU Assembler & Simulator」ってのを見かけたので 落として使ってみてるんですけど、解像度が低くて美味しくありません。 何か他に便利なフリーソフトはないでしょうか?
>>解像度が低くて美味しくありません 当方の解像度がSVGAでソフトの方がSXGA推奨なので orz
>>722 真のアセンブラマスターになるのに環境にこだわってはいけない。
未踏のジャングルを突き進む探検家や未知の洞窟を探索する冒険家のように
その場にあわせた環境に適応して生きていかねばならない。
>>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知らなかっただろう?
二人は双子、似てない双子。
それは、チックル・チーコ。
>>719 testがある時とない時ではオーバーフローしたときの結果が違うヨ
a = 0x7FFFFFFF, b = -2
なんてのは試してみた?
ついでにいうと >0のかわりに>=0を使った場合はtestを削れるような コンディションコードがある
普通の感覚であれば、testは使う必要がないんだけどね。 Cの場合、intとintの演算結果はintになるからややこしい。
>>732 あれ、sub命令ってオーバーフローフラグを設定しないんだっけか。
>>732 えっ、以下になるので結果はあってるんでは?
2147483647(0x7FFFFFFF) - 4294967294(-2) = -2147483647(0x80000001)
結果、f()は呼ばれない。
げっ間違ってたです。ごめんちゃい。
>>736 は忘れてください。
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
などとしているようです。意味不明、&スレ汚しすいませんでした
MASM32って、はっきり言って違法だから。 そこんとこヨロシク。
しかし、国籍と本名出しているのにつかまっていないところや、 自分でリンカやコンパイラ作ったところを見ると、(商標違反っぽいが) 違法なのかどうかあいまい(MSがあるのは訴訟国家アメリカなのに) 微妙っぽいですね。
Windowsのライブラリって、Windowsを買い、契約したときに使用権限が 与えられないものなんでしょうか?(そこのところ良くわからないです) デルフィをだしているボーランド社もまた別のライセンス契約しているんでしょうか? まぁスレッドが荒れるならこれ以上言及しませんが、とても疑問に感じました。
先生!質問です。 下の関数をアセンブラにしたいのですが、うまくいきません。 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
という風にしないと認識しなかったはずでは?(ほかの箇所も同様)
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 でもいい感じがするけど。
あ、0のときダメだ。 忘れてくれ
なるほど。単純にSFが0かZFが1の時にジャンプが目的なのね。 今更理解したYo…。
>>754 なるほど。単純にSFが1かZFが1の時にジャンプが目的なのね。
でした。。
いくらアセンブラ板住人といえど (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年間この板を荒らしつづけたある男【天才】
ネタスレにするなボケども・・・ 話すこともないな。
もう埋め始まったの? 次スレどこ〜?
プレスコ買った香具師、SSE3について語るべし。
788 :
名無し@沢村 :04/06/02 00:29
うるせーバカ
何故、荒れてるのか。 それが問題だ。
燃料投入までしばし待てや
ファビョーン!
アセンブラってCPUが理解するコードでしょ? それなのにどうしてcall MessageBox〜とか中に書いて動くの?
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
callは8086の命令か。はじめマクロかと思た。 6809のBSRかJSR相当だとするなら 「現在のインストラクションポインタの値をスタックに退避してから 指定されたアドレスにジャンプする」という命令だと思う。 どこにジャンプするかの指定がcallの後に書かれる訳だが、例えば call 0x1000 とすれば0x1000番地にジャンプするのだろう。 で、問題のcall MessageBox〜だが、この場合はその飛び先の指定に ラベルが使われているだけで、ラベルの値はどこか別な所で 定義されているんだろうと思ふ。 MessageBox〜の値が0x1000と定義されていれば 0x1000番地に、MessageBox〜を処理するサブルーチンが 置かれているのだろう。
>798 こいつはタダのバカですね。(^^V (アセンブラやマシン語の前に日本語勉強しれ)。
>>796 人工知能作ろうと思ってあ〜る読むよりは役に・・・立たないな。
>>795 アセンブラ自体をCPUが読んでるわけじゃなし、結局吐かれるバイナリはCと同じ扱い
>>798 言いたい事はわかったからまずソース出せ。
話はそれからだ。
>>798 ハイブリッド化が何を意味するのか分からん。
>>800 MessageBoxを実際のアドレスに直すのはリンカとローダの仕事。
最終的にはOSの仮想マシンの仕事
>>800 >call 0x1000
>とすれば0x1000番地にジャンプするのだろう。
正確には、インストラクションポインタ+1000h。つまり相対アドレスだけどね。
>809 じゃあBSRの方か。サンキュ。
はじめて読む8086を読んでるんですけど、レジスタとかの 動き等がわかりやすい実行環境ってどうすればいいですか?
RISC
>>811 レジスタとかの動きがわかりにくいかどうかは君の理解力の問題だ。
CPUの状態をいちいち確認しながら動かしたいならデバッガ使え。
デバッガーがあればレジスタの状態を確認しながら実行できそうですね。 でも、フリーでお願いしたいんですけど、ありますか?
>>814 8086なら debug.exe でレジスタの値を見ながらステップ実行出来るが。
もっと画像でビジュアル的に見えるツールは無いのけ? レジスタから転送してる様子とか
.┌──────────┐ つ│.. GNU Visual Debugger..│ .└──────────┘
>>815 debug.exeがあれば問題ないのですが…
どうしたら手に入るのですか?
>>818 OSが2000かXPならコマンドプロンプト開いてdebugと入力してみな。
95以上は標準でついてなかったっけ?
何か嫌なことでもあったんですか?
コマンドプロンプトで打ってみたんですけど
「'debug'は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。」
となります。 (OSはXPです)
>>821 よくわからんです(´・ω・`)
ところでOS使わずにパソコン起動してそのまま動くようなプログラムはどうやって作るの? 例えばブートローダとかOSそのものみたいなものなんだけど 普通にVCとかでコンパイルしてもOSの上でしか動かないし
フロッピーにプログラム入れて、 PC起動した時にフロッピーの内容読み込むとか言う意味?
>>827 できました、ありがとうございます
普通の状態だとPATHは通ってるものなんですかね
こういうの始めようとしても最初で躓く人多いんじゃないかなぁ〜?
>>827 >ExDEB
よく使ったなぁ。しみじみ...
それ結構使えるよね。
>>828 普通、C:\windowsとかC:\windows\system32は初めからPATHに登録されてるはずだが…
>>830 そうなんですか…
昔、PATHを追加したときうっかり消してしまってたかもしれません。orz
832 :
デフォルトの名無しさん :04/06/08 23:52
アセンブラの勉強ってどうすればよういですか? 日立のSH2ってCPUでのアセンブラを学びたいです。 コンパイラもないしどうすれば…
SH4のマニュアル、興奮しながら読んだ。 ベクトル関係がすごい。面白い。
>>835 それはDC専用だべ。(専用でもないか・・・)
いまならシェーダープログラミングでもっと楽しめますよ?
837 :
デフォルトの名無しさん :04/06/09 10:13
初心者ですがチュートリアルでパスワードのはいろいろあるんですが ドングルを苦楽したいのですがヒントとかありますか? callをnopにするとかdllファイルまでのたどり方とか ぜひプロの方アドバイスをお願いします
>>837 プロから言わせて貰うと、ソフト買ってプロに金流れるようにしてください。
840 :
デフォルトの名無しさん :04/06/09 11:24
837です スレ違いですか・・・すいません
>>837 >ドングルを苦楽したいのですがヒントとかありますか?
本当のプロならこんな事ですらヌルすぎてやろうとも思わないはず。
こんな事に時間を使わずにもっと他の事やるよ。
ブートマネージャのMBMみたいなのでCDからもブートできたり OSなしでCDやディスクの音楽再生できるのを作りたいのですが どうやってアセンブルすればいいの?
Linuxの最小BOOTを構成して、ソースを追うんだ!
Win32 プラグラムに、パッチを当てるのに 既存コードを短縮する定石は?
次スレは私に立てさせてください。 アセンブラ… (;´Д`) ハァハァ
>>843 メインメモリが1MBの環境でもVRAMが32ぐらいあればいけそうだ
BIOS使わずにBOOTなんぞできるわけねーだろ。
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をインストールしている限りは縁のない話。
AMD64では汎用レジスタもXMMレジスタも二倍の16個になってますが 命令によって使えるレジスタの制限は386とほとんど同じです。 AH〜DHレジスタと追加されたBPL,SPL,SIL,DIL/R8〜R15レジスタをひとつの命令で同時に 指定できないという新しい制限もありますが、xHレジスタ自体あまり使わないと思うので こちらはほとんど問題にならないと思います。 # 覚えてないと稀にハマることがありますが・・・ また、拡張されたレジスタは従来のレジスタを使うより命令長が1バイト長くなることが多いので スペース優先最適化をしたりパディング合わせをする場合は注意が必要です。 それらを踏まえ、SIL/DIL等の下位バイトレジスタが使えるようになった事でレジスタの価値は ほぼ同列になり、汎用レジスタが2倍になった事でIA32よりも変数を多く使うプログラムが書きやすい アーキテクチャになったと思います。
ちなみに、
>>861 さんが最後に言ったとおりOSが対応してないとまったく意味がありません。
正確には64ビットOSでも32ビットアプリからは拡張されたレジスタは使えません。
この辺は386で拡張されたレジスタとまったく事情が違います。
しばらくは、286や386がそうだったように、Athlon64も高速i386としてしか使われないでしょう。
さいごに拙作ですが64ビットのDOSっぽいOSを作ってるので宣伝しておきますね
http://sakyu.s39.xrea.com/
OSってどうやってアセンプルするの?
さっきゅんかわいいよさっきゅん ( ゚д゚)ハッ!この書き込みにデジャビュ
┳ / ̄ ̄\ /xxx (,,゚Д゚) <呼んだ? lxxx (ノ l) ヾxx xメ U"U
>>864 高速i386では無くて、
「内部ポート構造とパイプライン構造の違うPentium4として」、
でしょう。MMX/SSE/SSE2命令は取り敢えず使えますから。
ただし、内部ポートの構造が違うことを認識していないと、
高速化しようと思って、逆にIPC詰まりを起こすことになるので注意。
…内部ポートの構造といえば、
Dothanのアーキテクチャの資料が見つからないなぁ。
PentiumM自体は、Baniasのときにチラッと見た覚えが有るんだけど。
Pentium4自体高速386としてしか使われないことが多々あるのでー たしかにMMXとかSSEとかわ386じゃないですね
LinuxにしろwindowsにしろカーネルレベルじゃMMXすら使って無いよ
そうでもないよ
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バイト命令になった。
>>さっきゅんさん OS作ってんですねスゲエ 宣伝されていたサイトを拝見しました
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
当然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対策?
VBプログラマが引き起こしそうなバグの影響を緩和するとか。 ただしバグはバグだが。
─┬─┬─┬─┬─┐ │ │ │王←沢村 ─┼─┼─┼─┼─┤ │ │ │ │ │ ─┼─┼─┼─┼─┤ │ │桂│桂│ │ ─┼─┼─┼─┼─┤ │ │桂│桂│ │ ─┼─┼─┼─┼─┤
891 :
デフォルトの名無しさん :04/06/15 05:09
>>891 >俺はそれよりも16進数文字列を メ モ 帳 に「B4 09 ・・・」と書いて保存し
>拡張子をtxtからcomに変えれば実行できると思ってるのを見て目が取れた。
すんげーワロタ!!
それともネタなのか?
>>894 それ読んでたら寒気がしてきた。
それ書いてる奴っていったい何者?
なにげにそのサイト、内容はともかくとして 結構な量を書いてるなぁ。
WONDER QUEST
沢村って真性?それとも釣り?
沢村なんて存在しないよ 幻なんだ
Windows XP 64bit beta プログラミングについて 話題になってる場所教えれ。 俺がやりたいのは、32ビットアプリから64ビットDLLを呼び出すための約束事と Linux, Cygwin で 64ビット実行形式.or.DLLをクロスコンパイルするノウハウだ。 Linux で Win32 PE をクロスコンパイルすることには成功している。 擦れ違いと言われないように念のため言い訳しとくが、 64ビットDLLだけアセンブラで書きたいというワケだな。
MSの開発サイトにいきゃーいっぱいあるんでね?
バイナリエディタならできる
とりあえず 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をほかの変数に保存する方法を使用しています。
いやそれ普通に考え方間違ってるから・・・ 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汁
ヽ(`Д´)ノ
WindowsAPIの業も深そうやのう。かかわりたくないもんじゃ。
おーい村沢 アセンブラでタブブラウザを作りたいのだが アセンブラからCOMのコントロールを使うにはどうすればいいんだ?
923 :
デフォルトの名無しさん :04/06/21 03:20
C=A×Bって書けますか?
924 :
デフォルトの名無しさん :04/06/21 03:43
925 :
デフォルトの名無しさん :04/06/21 07:13
引数の個数が不定の場合のstdcallはcdeclと同じになる。
>>923 それは1つの命令でってこと? CPUによるよ!
Cで出来る物はがんばればマシン語でも絶対書ける 面倒だがなー
>>925 引数の数が不定だと __stdcall は無理だろ。
スタックの開放はなんとかなるとしても
シンボルの“_<関数名>@<引数のバイト数>”が作れん。
× 開放 ○ 解放
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 } } // 乗算命令使わずに、とか言うなら別途書くけど。
こっちから限定条件出してあげやう。 乗除算命令、および条件判断を一切使わずに、 アセンブラで、整数の a = b * c を計算するプログラムを書け。 ただし、入力 b, c の有効精度は8ビット以上、 出力 a の有効制度は16ビット以上とする。
×有効制度 ○有効精度
しつもーん 256x256の表があるものとしていいですか?
条件判断できなかったら表引き以外に方法あるの? 教えてエロい人
>>938 ダメとは言わないけど、出来たら使うな。判断はダメだけど、
フラグを演算に使うのは有り。
てことで、あと1時間で答え書くぞー。
>>940 まだ1時間待ってくれ
今来たばっかりなんだ
答える人おらんのかな。
んでは、18:30まで待ちましょ。
まもなくここは 乂
>>950 盗り合戦場乂 となります。
\∧_ヘ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
,,、,、,,, / \〇ノゝ∩ <
>>950 盗り合戦、いくぞゴルァ!! ,,、,、,,,
/三√ ゚Д゚) / \____________ ,,、,、,,,
/三/| ゚U゚|\ ,,、,、,,, ,,、,、,,,
,,、,、,,, U (:::::::::::) ,,、,、,,, \オーーーーーーーッ!!/
//三/|三|\ ∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧
∪ ∪ ( ) ( ) ( ) )
,,、,、,,, ,,、,、,,, ∧_∧∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧
,,、,、,,, ( ) ( ) ( ) ( )
漏れの課題がそれだorz
\∧_ヘ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ,,、,、,,, / \〇ノゝ∩ < 950とり合戦いくぞゴルァ!! ,,、,、,,, /三√ ゚Д゚) / \____________ ,,、,、,,, /三/| ゚U゚|\ ,,、,、,,, ,,、,、,,, ,,、,、,,, U (:::::::::::) ,,、,、,,, \ ぶーぶーぶー / //三/|三|\ タリー ∪ ∪ (\_/)タリー タリー まだ早えよ〜 ( ´Д) タリー タリー / つ (\_/) (\_/)ノ⌒ヽ、 (_(__つ⊂(´Д`⊂⌒`つ(´Д` )_人__) ))
んじゃ答え。 ;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
ルーチン長くなるんでマクロ風にまとめたけど、概略はわかるでしょ。ミソは sbb edx, edx / and edx, ecx ね。 ただし、レジスタリネームの障害になるような処理(シフトを1個にまとめた)してるんで、P4とかじゃ、 かなーリ遅いと思われ。Z80とか向けかなぁ。他のCPUで挑戦してみてちょ。
950 (`・ω・´)シャキーン
NOP
>>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 ありがとうございます。あるんですねw
WinXPのカーネルモードでLongモードにして遊んでいるのですが
64bitコードをハンドアセンブルさせるのは疲れるので助かります。
素直にXP64使いませんか?(汁
>>981 プロテクトモードからLongモードに切り替えるには、ページングのOFF、ONが必要ですよね。
そのため仮想アドレスと物理アドレスが合っているメモリ領域を確保していると思いますが
どのような方法で確保したのでしょうか?
984 :
デフォルトの名無しさん :04/06/30 01:11
梅
埋め
産め
産んだ
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
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。