1 名前:デフォルトの名無しさん [2006/05/24(水) 01:43:34 ] アセンブラ全般に関するスレッドです。 【前スレ】 アセンブラ… ヽ(゚∀゚)ノフォーウ! pc8.2ch.net/test/read.cgi/tech/1132761638/ 過去ログは>>2 辺り
263 名前:デフォルトの名無しさん [2006/07/04(火) 00:19:44 ] YASM
264 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 02:21:01 ] >>263 休むな。
265 名前:デフォルトの名無しさん [2006/07/04(火) 03:16:08 ] NASMを使っているけど、コンパイルするまでの手間がだるい。 中間ファイル作成→ALinkでコンパイル この手間を無くしたい。 MASMって使用者が多いと思うけど、上記項目を一括して出来るの? 出来るなら乗り換えようかな。
266 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 03:48:31 ] >>265 batファイルを作ればいいような。
267 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 07:18:52 ] 近頃の若いもんはmakeもしらんのか
268 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 08:39:59 ] 統合環境に組み入れられるだろ。 つーか make でいいよな?
269 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 09:39:11 ] DOSの頃はMASMやTASMを愛用してたけど、 Win環境に移ってからこっちインラインアセンブラしか書かなくなったなぁ。
270 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 11:41:38 ] makeはいちいちMakefileを書くのが面倒だろう なのでbat ・・・フルアセンブリ・1ファイル完結の話だよな? そうじゃないなら俺もMakefile書くが
271 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 17:40:39 ] アセでそんなにでかいプロジェクトなんてやらないし どうせ全ビルドでも一瞬で終わるんだ 数行書くごとに全ビルドでもまったく苦にならんw
272 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 19:57:12 ] nasm.exe(-f win32)で作成したobjはld.exeでもリンクできるなぁ‥‥ めどいならgccでリンク。 それはそうと、nasmのセクション宣言で共有属性をつけることは出来ない? とりあえずFMOで共有メモリを実現している。 gasなら .section .sdata,"rws" って書けば共有属性が付くけど。
273 名前:デフォルトの名無しさん mailto:sage [2006/07/06(木) 00:06:20 ] SHのプロジェクト預かったのだがコンパイラ先生が生成したアセンがまったくわからんのです。シミュレータぶんまわしてもそこがわからんorz タヂケkt SuperH RISC engine C/C++ Compiler (V.8.00.05) EX). Address ML Assembler 00007E66 D23D MOV.L @(H'00F4:8,PC),R2 以下考察 Inst Dest Displacement b1101 0010 0011 1101 h d 2 3 d 構文のDisplacemnetは下位2bit分(1/4としている)を省略し記述になっているようだ Destinationは簡単にR2を2としているだけ MOV.L @(disp,PC),Rnの解説(仕様書抜粋) ディスプレースメントは8bitまで(H'1-FF) LONG WORD 拡張×4 最大:b1111111100:0x1020 WORD 拡張×2 最大:b0111111110:0x 510 としている よってDisplacementはH'03D0 PCは下位2bitをマスクする H'00007E66 & H'FFFFFFFC よってH'7E64 R2 = PC + Displacement = H'8234となる? しかし実際は シムではR2 = H'00003774 ドボヂテ(TロT)
274 名前:デフォルトの名無しさん mailto:sage [2006/07/06(木) 01:32:32 ] >>273 Displacementは、普通±を考慮すると思うのだが。 8bitのDisplacementだと、bit7が1だと「−」になるとか…。 SHは触ったことが無いので間違っていたらゴメン。
275 名前:デフォルトの名無しさん mailto:sage [2006/07/06(木) 02:33:04 ] @は即値じゃなくて、間接アドレッシングじゃないのか?
276 名前:デフォルトの名無しさん mailto:sage [2006/07/06(木) 02:49:31 ] 考察ってのはどういうことなの?ちゃんとマニュアルに命令形式が載ってるでしょ。 >b1111111100:0x1020 >b0111111110:0x 510 ってのもおかしいし。 R2=Read_Long( (0x00007E66 & 0xFFFFFFFC) + (0x3D<<2) ) = Read_Long( 0x7E64+0xF4 ) = Read_Long(0x7F58) アドレス0x7F58にあるLong値がR2に入る。 ttp://japan.renesas.com/ から「SuperH RISC engine ファミリ」>「ドキュメント」で 日本語のソフトウェアマニュアルにたどり着けるから、それ読むといいよ。
277 名前:デフォルトの名無しさん mailto:sage [2006/07/06(木) 04:11:21 ] 誰もドキュンの意見は聞いてません 帰れ
278 名前:デフォルトの名無しさん [2006/07/06(木) 11:37:38 ] add, sub, and, or, lw, sw, beq, bne, j, addi, andi, ori, sll, srl, sra これだけの命令で16or32ビット同士の数字の掛け算のプログラムを作れますか?
279 名前:278 [2006/07/06(木) 11:59:57 ] /* multiplication.c: Unsigned 16-bit x 16-bit */ main(){ int x = 0x0000c9ae; int y = 0x0000f6e5; int z = mul(x, y); printf("%08x * %08x = %08x\n", x, y, z); } int mul(int x, int y){ int a, b, c; int i; // counter a = x; b = y; c = 0; // production for(i = 0; i < 16; i++){ // for 16 bits if((b & 1) == 1){ // LSB of b is 1 c += a; // c = c + a } a = a << 1; // shift a 1-bit left b = b >> 1; // shift b 1-bit right } return(c); // return production } ちなみにC言語で書くとこうなるらしいです
280 名前:デフォルトの名無しさん mailto:sage [2006/07/06(木) 12:19:20 ] ふと思ったが、何でもできる最小限の命令セットってどのくらいだろう。 メモリのリードライト、条件ジャンプ、あと加算? そういやBrainFuckが何でもできるんだったな。
281 名前:デフォルトの名無しさん mailto:sage [2006/07/06(木) 12:33:54 ] チューリングマシンとか、RAM とかの話になると思うけど、 多分 定数 1 加算 0 判定 間接参照 程度で大丈夫じゃないかな?
282 名前:デフォルトの名無しさん mailto:sage [2006/07/06(木) 12:45:22 ] 分岐はいるだろう
283 名前:デフォルトの名無しさん mailto:sage [2006/07/06(木) 13:17:01 ] PCに加算できれば分岐は要らない
284 名前:デフォルトの名無しさん mailto:sage [2006/07/06(木) 13:20:26 ] レジスタから指定したアドレスの内容を減算し、 結果をレジスタとアドレスにストアする。 これでどんなプログラムでも書けるらしい。 実用的にはPCやレジスタにもアドレスを付け、 1番地と2番地に書くと3番地に加算結果、4番地に減算結果、etc というハードにすると、MOVE命令だけでOK 1命令CPUのすごいところは、命令デコーダが不要なことだ!
285 名前:デフォルトの名無しさん mailto:sage [2006/07/06(木) 14:33:41 ] >>284 その分コーディングで効率を上げないと無駄が増える
286 名前:デフォルトの名無しさん mailto:sage [2006/07/06(木) 15:47:42 ] >>278 シフト命令の他に回転命令が無いと面倒臭くなるな。
287 名前:デフォルトの名無しさん mailto:sage [2006/07/06(木) 17:53:21 ] 出来る出来ないは別にして最低限無いと人間が記述する時に不便or不都合が生じる、 という最低限な命令セットの話で。
288 名前:デフォルトの名無しさん mailto:sage [2006/07/06(木) 18:00:35 ] RISC系CPUの初期モデルの命令セットでも見れば? まあ、x86とかでもアセンブラレベルでの命令の種類はそう多くはないんだが。
289 名前:デフォルトの名無しさん mailto:sage [2006/07/06(木) 19:28:36 ] 俺なら真っ先にHALTとNOPとブレークポイント例外を入れるね。
290 名前:デフォルトの名無しさん [2006/07/06(木) 19:52:24 ] >>289 「最低限」必要か?
291 名前:デフォルトの名無しさん mailto:sage [2006/07/06(木) 19:59:05 ] >>290 HALTが無いとチューリングマシンとして成り立たないのでは?
292 名前:デフォルトの名無しさん mailto:sage [2006/07/06(木) 21:39:12 ] もろもろどうもです >>273 LONG WORD 拡張×4 最大:b1111111100:1020 WORD 拡張×2 最大:b0111111110: 510 正しくは上記10進です。うっかりしてました。 マニュアル確認しました。 MOV.L @(H'00F4:8,PC),R2 PC:0x00007E66 R2=Read_Long( (0x00007E66 & 0xFFFFFFFC) + (0xF4<<2) ) = Read_Long( 0x7E64+0x3D0 ) = Read_Long(0x8234) マニュアルの形式に沿って計算したが、シミュレータではR2=0x00003774と出力している。 そのあとには"JSR @R2"として関数を呼び出している。シミュレータでの動作は問題ないので手計算が間違っている!間違いはどこなんですかね?
293 名前:デフォルトの名無しさん mailto:sage [2006/07/06(木) 22:19:23 ] >>291 それが世の中HALTが無いCPUもあったりするんですよ。
294 名前:デフォルトの名無しさん mailto:sage [2006/07/06(木) 22:23:11 ] >>292 ちゃんとマニュアル読んでるのか? H'8234番地の中身確認してみれ。
295 名前:291 mailto:sage [2006/07/06(木) 23:54:15 ] >>291 ええと、少し調べたところ、チューリングマシンはHALTが無くてもいいそうな。 無限ループに陥ったと確定した時点で「停止」扱いでOKらしい。 すまん。
296 名前:デフォルトの名無しさん mailto:sage [2006/07/07(金) 00:44:09 ] >>294 0x8234に目的の値が確保されてるってこと?アドレスから値を持ち込むにはMOV.L @R2,Rnが必要じゃないの? マニュアル(RJJJ09B0228-0700,Rev7.00 P6-59)には計算通りに導けるが、MOV.L @(H'00F4:8,PC),R2 PC:0x00007E66のシミュレーション結果がR2 = 0x00003774となるのかがどうにも
297 名前:デフォルトの名無しさん mailto:sage [2006/07/07(金) 01:39:00 ] そーゆーもまいらにBrainF*ck
298 名前:デフォルトの名無しさん mailto:sage [2006/07/07(金) 11:46:21 ] 6502の命令セットはシンプルで若干不足気味に まとまった命令セットだったと思う。
299 名前:デフォルトの名無しさん mailto:sage [2006/07/07(金) 23:13:39 ] アセンブラ全般といいつつx86系ばかりだね UNIXベンダのプロセッサのアセンブリプログラムは無いポ?
300 名前:デフォルトの名無しさん mailto:sage [2006/07/09(日) 01:01:24 ] 300ゲットしておきますか。
301 名前:デフォルトの名無しさん mailto:sage [2006/07/09(日) 09:41:58 ] すごくPPCをやりたいんですけど… わかりません。
302 名前:デフォルトの名無しさん [2006/07/09(日) 10:23:20 ] >>301 黒箱かiMac買えば?
303 名前:デフォルトの名無しさん mailto:sage [2006/07/09(日) 10:33:43 ] >>302 Macならある。
304 名前:デフォルトの名無しさん mailto:sage [2006/07/09(日) 11:26:31 ] >>303 ヒマだから反応しておく。何がわからないんだ。 命令そのものか、又は命令の使い方か?
305 名前:デフォルトの名無しさん mailto:sage [2006/07/09(日) 12:12:57 ] >>304 どっちも。
306 名前:デフォルトの名無しさん mailto:sage [2006/07/09(日) 13:09:30 ] >>305 「玄箱」と「PowerPC」でぐぐればPowerPCの解説HPが見つかるかもしれない。 Macでぐぐってもアセンブラを解説したHPは出て来ない気がする。 しかし、PowerPCのアセンブラも知らないで、何を作るつもりなのか? その辺を明確にしておかないと、上達は有り得ないと思う。
307 名前:デフォルトの名無しさん mailto:sage [2006/07/10(月) 23:28:11 ] >>306 激励したつもりだったんだけど…orz
308 名前:デフォルトの名無しさん mailto:sage [2006/07/10(月) 23:30:47 ] >>307 の訂正 >>306 では無くて>>305 です。 連続書込み、スマソ
309 名前:デフォルトの名無しさん mailto:sage [2006/07/13(木) 19:48:19 ] アセンブラで逝く!逝く!逝っちゃうの!
310 名前:デフォルトの名無しさん mailto:sage [2006/07/15(土) 12:18:13 ] みさくら語でおk
311 名前:デフォルトの名無しさん mailto:sage [2006/07/15(土) 14:10:51 ] i386にバイト反転付き整数ロード/ストア命令ってある?
312 名前:デフォルトの名無しさん mailto:sage [2006/07/15(土) 14:34:18 ] ない
313 名前:デフォルトの名無しさん mailto:sage [2006/07/16(日) 02:03:02 ] 26時間観ながら保守。
314 名前:デフォルトの名無しさん mailto:sage [2006/07/16(日) 02:04:17 ] う〜、誤爆した。
315 名前:デフォルトの名無しさん mailto:sage [2006/07/16(日) 08:21:59 ] スリムでドボンとか言う奴はどこいったんだ
316 名前:デフォルトの名無しさん mailto:sage [2006/07/16(日) 09:17:49 ] 糞コテは呼ばんでええよ
317 名前:デフォルトの名無しさん mailto:sage [2006/07/17(月) 12:35:35 ] インラインアセンブラはスレ違いかもしれないけど質問。 Xeonで動かそうと思って double func(double *sx, double *cx, double *sy, double *cy, int xe, int ye) { double sum = 0; for (int ix = 0; ix < xe; ix++) { double sx1 = sx[ix]; double cx1 = cx[ix]; for (int iy = 0; iy < ye; iy++) { double sy1 = sy[iy]; double cy1 = cy[iy]; sum += (cx1 * cy1 - sx1 * sy1) + (cx1 * sy1 + sx1 * cy1); } } return sum; } こげな関数のループ内部を asm volatile( " movsd %1, %%xmm0; movhpd %3, %%xmm0; movapd %%xmm0, %%xmm2 movsd %2, %%xmm1; movhpd %4, %%xmm1; movapd %%xmm1, %%xmm3 mulpd %%xmm1, %%xmm0; movhlps %%xmm0, %%xmm1; subsd %%xmm1, %%xmm0 mulpd %%xmm3, %%xmm2; movhlps %%xmm2, %%xmm3; addsd %%xmm3, %%xmm2 addsd %0, %%xmm0; addsd %%xmm0, %%xmm2; movsd %%xmm2, %0" : "=g" (sum) : "g" (cx[ix]), "g" (cy[iy]), "g" (sx[ix]), "g" (sy[iy]) : "%xmm0", "%xmm1", "%xmm2", "%xmm3" ); こう書いてみたんだが、もっと効率上げられないもんかな。 ループ部はiccの各種最適化に頼りたいから残しておきたいんだが。
318 名前:デフォルトの名無しさん mailto:sage [2006/07/17(月) 20:40:02 ] >>317 素直に2要素ずつやったらいいんでないの。 > ループ部はiccの各種最適化に頼りたいから とはどういうこと? この処理なら関数全部をインラインアセンブラで 書くのが、速度も出るし手っ取り早いと思うが。
319 名前:デフォルトの名無しさん mailto:sage [2006/07/17(月) 20:41:32 ] >>318 みたいな原始人まだいたんだ(^o^)
320 名前:デフォルトの名無しさん mailto:sage [2006/07/17(月) 20:53:01 ] だいたい、Cなんて中身の何も無いループ回すだけでちんたら遅すぎ。 ポインタなんか使ったら余計な演算入りまくりで遅いし。まあ、最近のCPUは掛け算が早くなったから大分良くなったが。
321 名前:デフォルトの名無しさん mailto:sage [2006/07/17(月) 20:57:07 ] >>317 コンパイラがサポートしてるならintrinsics関数で書く。
322 名前:デフォルトの名無しさん mailto:sage [2006/07/17(月) 21:21:13 ] C言語レベルで最適化する余地があると思うが ヒント for(int iy = 0; iy < ye; iy++){ sumA+=cx1*(cy1+sy1); sumB+=sx1*(cy1-sy1); } sum+=sumA+sumB;
323 名前:デフォルトの名無しさん mailto:sage [2006/07/17(月) 22:12:57 ] >>322 まだ最適化できる。 ヒント for(int iy = 0; iy < ye; iy++){ sumA += cy1; sumB += sy1; } sum += cx1 * (sumA+sumB); sum += sx1 * (sumA-sumB);
324 名前:323 mailto:sage [2006/07/17(月) 22:19:41 ] >>323 あ、自分で書いといて今気づいた。 この書き方だとループも外に括りだせるからO(n)で計算できる。 もとのコードだとO(n^2)だから圧倒的に性能が向上する。 というかアセンブラに手を出す前に論理レベルで最適化しろという典型例ですな。 まぁ、このスレで言うのは無粋だけどw
325 名前:デフォルトの名無しさん mailto:sage [2006/07/17(月) 22:30:29 ] うーん惜しいな。yだけじゃなくてxも最適化できる。 for(int iy = 0; iy < ye; iy++){ sumA += cy1; sumB += sy1; } for(int ix = 0; ix < xe; ix++){ sumC += cx1; sumD += sx1; } sum = sumC * (sumA+sumB) + sumD * (sumA-sumB); ま、こっちはオーダーレベルの最適化にならないがな。
326 名前:317 mailto:sage [2006/07/17(月) 23:01:47 ] ひーん、諦めかけてからレスがたくさんついてる〜 #あ、icc使用って書くの忘れてた。 そもそも、「コンパイラよりもアセンブラの方が絶対速い。ループ内部だけでもアセンブリ化しろ」と 主張する頭の固い人たちを納得させられればいいので、ループの最適化には手を出さずに済ませたいわけです。 で、「xmmレジスタは並列演算できるのだから絶対速い」というヒント(という名の指示)の元、 >317のようなコードを書いてみたわけですが。 処がこの程度のアセンブリ化ではC部分とのI/Fに時間を取られるようで効率が上がっていません。 実際元のソースをiccでコンパイルするとループをアンロールして4回分ずつ回すようです。 勿論SSE命令も使うし並列化オプションを指定すれば並列化してくれるし。 なので、このまま「保守性と開発工数を考えればコンパイラに任せたほうが無難」という報告をしてもいいのですが、 念のため(と技術的興味から)アセンブリ部分で無駄がないかを聞いてみたかったのです。 >>318 恐らく2回分ずつアンロールしたコードを書くと速そうですが、コンパイラも同じ程度のコードを出しそうです。 >>320 正直私には、gcc辺りのコードを書くのがやっと。iccに勝てるコードを書けるとは思いません。 #この場合、Cの単純な翻訳と言う意味で。 >>321 iccのマニュアルをさっと読んだ限りでは見た記憶がないのですが、調べてみます。 >>322-325 えーと、最終的なコードはもそっと複雑になるのでロジックレベルの最適化は>317で止めた次第です。 #後出しすんません。 ってことで、何かあれば引き続きお願いします。 #FPU命令とSSE命令って組み合わせるとどうなるのかなぁ。こればっかりはニモニック表にらめっこしてもわからん……
327 名前:デフォルトの名無しさん mailto:sage [2006/07/18(火) 07:13:29 ] >恐らく2回分ずつアンロールしたコードを書くと速そうですが、コンパイラも同じ程度のコードを出しそうです。 インラインアセンブラの内部はコンパイラの最適化は効かない。 movsdやmovhlpsで1要素ずつ移動してるのが無駄だ。 >えーと、最終的なコードはもそっと複雑になるので それがどんなコードか書いてくれないとレスのしようがない。 >>324 のような最適化が最も重要なのに、それを検討する前から アセンブラの書き方を考えるのはちょっとおかしい。 >FPU命令とSSE命令って組み合わせるとどうなるのかなぁ。 それは面白いのでレスをしたいところだが、 どんな処理かわからんことには・・・。
328 名前:デフォルトの名無しさん mailto:sage [2006/07/18(火) 07:27:13 ] >>327 >恐らく2回分ずつアンロールしたコードを書くと速そうですが、コンパイラも同じ程度のコードを出しそうです。 単純に、自前で書いてもコンパイラに任せても同じ程度のコードだと言っているだけだな。 アンロールしないと速度でないのは承知しているみたいだし。 >えーと、最終的なコードはもそっと複雑になるので 多少複雑になっても本筋は変わらんだろ。要はダメ出ししたいだけみたいだから。 >326はとっとと諦めてダメレポート書けばいいんでね。
329 名前:デフォルトの名無しさん mailto:sage [2006/07/18(火) 07:39:41 ] >>326 >iccに勝てるコードを書けるとは思いません。 結果は出てるんじゃんw アセンブラで速度を問題にする場合はある程度センスが要求されますので、あきらめた方が良いかとおもわれ
330 名前:デフォルトの名無しさん mailto:sage [2006/07/22(土) 18:26:54 ] Technical Assemblerの掲示板、もはや機能してないねぇ‥‥ 大量のスパムURLでログが流されまくり。
331 名前:デフォルトの名無しさん [2006/07/29(土) 20:09:22 ] 一週間ぶりにあげ
332 名前:デフォルトの名無しさん [2006/07/29(土) 21:02:14 ] 差を割った数をサマリーするのにサマリーの差を割ってる馬鹿ども
333 名前:デフォルトの名無しさん mailto:sage [2006/07/29(土) 23:47:36 ] だれか助けてくれ!! MIPSでクイックソートを作らないといかんのだが分からん・・・ 言語はMIPSベースの16ビットマイクロプロセッサ用 で、基本MIPSと同じです。 違う点、MULT DIV命令が無い 即値ロードはlhi $a,label で上位1バイト lliで下位1バイト読み出すものとする。 詳しくは、 ttp://72.14.207.104/search?q=cache:S58cP_y64_MJ:www.giga.it.okayama-u.ac.jp/~nobuya/jikken/02/p16.pdf+lli+lhi&hl=ja&ct=clnk&cd=3&lr=lang_ja ソートされる要素の数は0x4000番地に 要素は0x4000から以下2バイト刻みで入っているものとする。
334 名前:デフォルトの名無しさん mailto:sage [2006/07/29(土) 23:58:44 ] クイックソートの仕方は知ってるの?
335 名前:デフォルトの名無しさん mailto:sage [2006/07/30(日) 00:09:36 ] >334 それは、Cでは書けるんですが、 アセンブラになるとちょっとお手上げ状態です。 あとレジスタが8個しか使えない制限つきだったりします・・・。
336 名前:デフォルトの名無しさん mailto:sage [2006/07/30(日) 00:30:28 ] レジスタが使えないのなら、メモリを使えば良いじゃない! 文句があるならベルサイユへいらっしゃい!
337 名前:デフォルトの名無しさん mailto:sage [2006/07/30(日) 00:45:21 ] あとメモリなんですが、0xFFFFまで使用可能なんですが、 データが1026個はソートできる仕様との事なので あんまり深いスタックは惚れません・・・
338 名前:デフォルトの名無しさん mailto:sage [2006/07/30(日) 00:52:59 ] 最適化OFFにしてCで書いたのを逆アセンブラしたのを参考にするとかは?
339 名前:デフォルトの名無しさん mailto:sage [2006/07/30(日) 00:58:05 ] Cでソース書いて スタックの使い方決めて レジスタを割り付けて 手動で1行ずつ変換
340 名前:デフォルトの名無しさん mailto:sage [2006/07/30(日) 09:58:32 ] NASMで絶対間接far callを書きたいんだけどどう書いたらいいの?
341 名前:デフォルトの名無しさん mailto:sage [2006/07/30(日) 15:43:04 ] masmで32bitだと call qword ptr mem だったかな? よく覚えてないけど。
342 名前:デフォルトの名無しさん mailto:sage [2006/07/30(日) 20:36:46 ] >>340 call far [edx] call far [0xdeadbeaf] >>341 call fword ptr MEM
343 名前:デフォルトの名無しさん mailto:sage [2006/07/30(日) 23:43:52 ] >>342 のプログラムをコンパイルして実行したら不正な処理をしたとOSに怒られました! みなさんも気をつけてください!
344 名前:デフォルトの名無しさん mailto:sage [2006/07/31(月) 00:27:27 ] >>343 君もう来なくていいから
345 名前:デフォルトの名無しさん mailto:sage [2006/07/31(月) 12:43:27 ] 0xdeadbeef なら怒られないかも?
346 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 18:42:07 ] C言語の x[n]=c1*delx という式をアセンブラに書き換えたらどうなるか必死に考えて mov eax,c1 mov ebx,delx mul ebx mov x[n],eax となるのではなかろうかと思うのですが、正しいですか。 これをVC++6.0でインラインアセンブラにしようとしたら、同じサイズのオペランドのが 必要とかでエラーでした。早くアセンブラを理解できるようになりたい。
347 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 18:50:36 ] ebxをそんな用途に使う奴を始めてみた
348 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 00:52:54 ] >346 非常に基本的なことなんだが、まず x, n, c1, delx 全ての変数の型が不明。 仮に全てunsigned longだったとして、 mov eax,c1 mul delx で十分。 最後に x[n] という表記はナイ。
349 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 01:20:55 ] すっごい低レベルですが質問させてください。 「アセンブリの教科書」で勉強はじめたんだけど いきなりつまづいたの。P54のフラグレジスタの説明で mov al,7F inc al mov bl,0 sub bl,80 AX=0080 BX=0080 OV UP EI NG NZ NA PO CY ~~ ~~ 符号付き演算でAX=0080になるのはよく分かる。 (1000 0000)の1は符号ビットで 127+(-128)=-1にするため (1000 0000)は-128、(1111 1111)は-1と決められてる。 inc alで符号付き演算の桁上がりが生じたから オーバーフローフラグはOVとなる。 一方、符号無しの場合のsub bl,80では (0000 0000)-(1000 0000)=(1000 0000) つまり0-128=128の0は256扱いになってるから、 これってつまり(0000 0000)ではなしに桁上がりで (1 0000 0000)として扱われたってこと? 演算結果の桁上がりが生じてCYってのはそーいうこと? 一方が符号付きで他方が符号無しと判断されるのはなぜ?
350 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 01:21:57 ] CYの下線~~ずれた…
351 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 01:35:55 ] >>350 一般的に減算のあとのキャリーフラグは、ボローフラグの意味となる。 つまり、繰り上がりが生じたのではなく繰り下がりが生じたと言う意味。
352 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 01:47:10 ] >>351 あっ、なるほど。そのほうが意味的に納得です。 mov al,7F inc al が符号付きとして処理され mov bl,0 sub bl,80 が符号なしと処理された 扱いの違いの理由は何故でしょう? もしかしてalを使うと符号付きの演算扱いになるとか、でしょうか?
353 名前:デフォルトの名無しさん mailto:sage朝顔日記 [2006/08/04(金) 09:26:36 ] レジスタalとbを変えて試しても符号付、符号なしの結果の違いはないから これはincとsubの違いと見当をつけて先へ進むことにします。
354 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 10:43:51 ] あー、フォローするの忘れてた。 フラグリファレンスによると、x86系CPUではinc/decではCFは操作されない。 これは、8bitCPU時代からの伝統でキャリーをレジスタ(orメモリ)間で伝播させる用途で便利。 #最下位バイト同士をaddして、インデックスに使用するレジスタをインクリメントして2番目をadcして…… 尚、例えば68000の場合は対象がデータレジスタならフラグが影響を受けてアドレスレジスタでは影響を受けない。 この様に、フラグの振る舞いはCPUによって違うので、 実験から推測するのではなくリファレンスで調べておくことをお勧めする。
355 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 11:41:10 ] >リファレンスで調べておくことをお勧めする。 了解です。ありがとう御座いました。
356 名前:デフォルトの名無しさん [2006/08/14(月) 23:13:45 ] Ollydbgってなんで公式サイトのファイルぶっこわれてるの?
357 名前:デフォルトの名無しさん mailto:sage [2006/08/14(月) 23:50:21 ] >>356 今試したら問題なくDLできたよ 再DLでいけるかと www.ollydbg.de/
358 名前:デフォルトの名無しさん mailto:sage [2006/08/14(月) 23:58:37 ] >>356 OllyDbg日本語化パッチとOllyDbgQ&A hp.vector.co.jp/authors/VA028184/
359 名前:デフォルトの名無しさん mailto:sage [2006/08/17(木) 11:08:26 ] acapulco.dyndns.org/doc/CodeAnalyst/simulation.htm
360 名前:デフォルトの名無しさん [2006/08/17(木) 12:41:45 ] 初歩的な質問なんですが mov WORD [100] 1 ってかくと ---------- 00000001 100番地 ---------- 00000000 101番地 ---------- ってメモリに書かれると思うのですが mov DWORD [100] 1 ってかくと ---------- 00000001 100番地 ---------- 00000000 101番地 ---------- 00000000 102番地 ---------- 00000000 103番地 ---------- の認識でいいでしょうか?
361 名前:デフォルトの名無しさん mailto:sage [2006/08/17(木) 14:10:12 ] CPUによって違う。 リトルエンディアンのCPU(インテルx86等)ならその認識でいいと思う。 あとアセンブラによって記法が異なるので、今度質問するときはCPUと 使用アセンブラを書いた方がいいかも。(その記法は初めて見た。)
362 名前:・∀・)っ-○◎●新世紀ダンゴリオン ◆DanGorION6 mailto:sage [2006/08/18(金) 01:21:50 ] mov DWORD PTR [100],. 1 か
363 名前:デフォルトの名無しさん mailto:sage [2006/08/18(金) 03:07:16 ] つーかレジスタ経由しないで転送できるん?