1 名前:デフォルトの名無しさん [2007/08/14(火) 17:18:08 ] アセンブラ全般に関するスレッドです。 【前スレ】 アセンブラ… ( ゚д゚)ウッウー pc11.2ch.net/test/read.cgi/tech/1174825173/
252 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 16:25:45 ] RGBで分けなくてもいいと思うんだけど
253 名前:244 mailto:sage [2007/12/29(土) 21:39:45 ] >>245-252 ありがとうございます。 >>246 さんのアイデアを元に少しもじって、 無事除算の回数を一回に減らすことができました。 また、>>248 さんのテーブルを使った手法でも、 それとほぼ同程度の速度を出すことに成功しています。 これなら何とか要求されている時間を満たせそうです。 参考までに変形後の式を書いておきます。 temp_a = (256 - src_a) * dest_a >> 8; new_a = src_a + temp_a; // temp_a / new_a + src_a / new_a = 255より dest_temp_a = (temp_a << 8) / new_a; src_temp_a = 255 - dest_temp_a; // 以下、pmaddwdを用いて並列計算 new_r = (dest_r * dest_temp_a + src_r * src_temp_a) >> 8; new_g = (dest_g * dest_temp_a + src_g * src_temp_a) >> 8; new_b = (dest_b * dest_temp_a + src_b * src_temp_a) >> 8; >>251 MMXを使うものも含め、アルファブレンドのソースはよく紹介されていますが、 出力先のα値まで保証するものは少し調べた限りでは見当たらなかったので、 今回は自作してみることにしました。
254 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 23:06:46 ] 出力先のα値は何に使うの?
255 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 06:31:12 ] >>254 最終的に別の画像にまたアルファブレンドします。 出力先のα値が保証されていると、 複数枚の画像をブレンドした状態でキャッシュできるので、 枚数が跳ね上がったときに重宝しています。
256 名前:デフォルトの名無しさん [2007/12/31(月) 23:16:29 ] 全部アセンブリでCからリンクできる関数を書きたいのですがどうすればいいでしょうか? まったく見当もつかず途方にくれてます。 ポインターだけでもいいので教えてください。
257 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:21:35 ] gcc -S foo.c
258 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:23:57 ] >>256 というか、先ずは環境を明らかにしようぜ。
259 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:39:11 ] x86のLinuxか、PowerPCのLinuxでお願いします。 gccです。 >>257 それはアセンブラをじっと眺めろということでしょうか???
260 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:48:21 ] 何か関数を作って、法則見つけようぜ、ってことじゃね。 とりあえず、 ・ 最初と最後にはスタックフレームの確保を行うと楽。 ebp とか esp とかいじってる部分がそれ。 ・ 退避すべきレジスタがいくつかある。最初と最後で push/pop してるやつがそれ。 ・ 引数を渡すときは、基本的には引数をスタックに push する。 後ろの引数から push するか前のから push するかはコンパイラ次第。確認しる。 可変長引数かどうかで変わる事もあるので注意する。 ・ 関数を呼んだ後に引数の分だけスタックポインタを戻すには、 呼び出し側から esp に引数のサイズだけ add するか、 関数から戻る時に ret の引数を使うかする。 どっちなのかはコンパイラ次第。確認しる。 可変長引数かどうかで変わる事もあるので注意する。 標準関数を call した後に add する必要があるかどうかも確認しる。
261 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 01:08:32 ] 2008年こそアセンブラをマスター!
262 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 13:50:30 ] >>260 どこかにその法則を説明しているサイトなり書籍はないですか? というとか誰かアセンブラを習うのに最適な学習書を紹介してください
263 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 14:20:46 ] >>262 つ gcc.gnu.org/
264 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:19:25 ] >>262 asm-cだけわかればいいのか? 結局、石のアーキ知らないと、asm使う意味が薄いよ。 x86とppcじゃ違いすぎ。
265 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 16:26:57 ] 昔、ボーランドのTURBOシリーズでCやPASCAL(Delphi)やらからAssmを呼び出す為の説明が在ったのを思い出した。
266 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 17:39:36 ] calling convention gcc でぐぐれ。stdcall fastcall cdeclでもいいぞ。
267 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 01:08:01 ] regparm使って破綻しそうな予感。
268 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 21:38:01 ] 久しぶりにbinutilsのスナップショットきた。 asでも-marchのサポートとかが入ったから遅れたのかな?
269 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 17:32:51 ] コードをエンコードしてセクション名ブランクにしてセクションの属性を IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE にしてる実行時デコード型プログラムの逆アセ面倒くせー!! はぁ、ちょっちスッキリした。
270 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:44:45 ] IA-32(x86) GASでよかったら 「プログラミングの力を生み出す本 インテルCPUのGNUユーザーへ」 ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=4-274-13207-2 なんてどうかな? NASMにシフトするにしてもGASは知ってて損はないとおもうし スタックフレームの説明ぐらいなら書いてありますよ
271 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 02:54:50 ] 人生nopだ。
272 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 19:45:38 ] >>271 イ`
273 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 19:57:29 ] 死ぬということじゃなくて, 何もせずに時(クロック)だけが進んでいく,って意味じゃまいか
274 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 21:08:24 ] hlt 後で起こしてくれ
275 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 00:25:46 ] 俺なんか here: jmp here してるんだぞ
276 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 11:17:37 ] Windows32プログラミングするのにお薦めのアセンブラ、デバッガってなんですかね。 インラインアセンブラと EXDEB使ってるんだけど、32bit部分対応で微妙に使いにくい。
277 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 11:25:01 ] >>276 アセンブラが使いにくいのかデバッガが使いにくいのかどっちだ。
278 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 02:49:40 ] >>275 暖房器具ですか? つうか"jmp $"でいいんでないかい。 >>277 デバッガじゃないかい。 機械語レベルでまともなデバッガなんて絶滅したと思うが。
279 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 15:39:58 ] 教えてください。 int __stdcall AsmFunc(int *v1, int *v2); という関数の中身をMASMで書きたいのですが、下のように書いてもうまく動作しません。 v1に数値3hを代入したいだけなのですが、何も変化がありません。アセンブル、コンパイル、リンクでエラーは出ませんでした。 // asmfunc.asm _AsmFunc@8 PROC PUBLIC push ebp mov ebp, esp mov eax, 3h mov dword ptr [ebp + 8], eax leave ret 8 _AsmFunc@8 ENDP // test.c int v1, v2, ret; ret = AsmFunc(&v1, &v2); どう書くのが正しいですか?
280 名前:デフォルトの名無しさん [2008/02/24(日) 15:40:49 ] age忘れ
281 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 15:51:39 ] mov ecx, dword ptr [ebp + 8] mov dword ptr [ecx], eax こうじゃない?
282 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 15:55:59 ] >>281 ありがとうございます!その通りでした。 上のソースでは、v1の参照先ではなく、v1そのものに入れてしまっていたんですね。 助かりました。
283 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 18:45:07 ] 279ですが、逆アセして色々調べたところ、下の1行で良いことがわかりました。 mov dword ptr 8[ebp + 8], eax MASM特有の記法でもない様子なので、これで行こうと思います。
284 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 19:28:17 ] インラインアセンブラでasmの前に _ が 一個の場合と二個の場合の違いを教えてください。
285 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 19:32:25 ] コンパイラのマニュアル読め
286 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 20:19:03 ] インラインアセンブラの記法はコンパイラ独自
287 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 22:04:50 ] ちなみにVisual C++だったらどっちでも同じだな。
288 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 12:57:59 ] Visual C++の場合 _asm は/Zaオプション使用時には未定義になるが __asm は/Zaオプション使用時でも有効
289 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/02/27(水) 23:08:56 ] asmだか__asmのどっちかって規格の予約語じゃなかったっけ? はずされたんだっけ?
290 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:20:36 ] とりあえず C++ の規格には asm がある。 どういう意味になるかは処理系定義。
291 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:26:04 ] ANSI規格の解説も読めない白痴が来るとスレがひたすら引き締まる
292 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/02/27(水) 23:28:10 ] アンシー(笑) スイーツ(笑)
293 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:33:06 ] 7.4 The asm declaration An asm declaration has the form asm-definition: asm { string-literal } ; The meaning of an asm declaration is implementation-defined. [Note: Typically it is used to pass information through the implementation to an assembler. ]
294 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/02/27(水) 23:46:55 ] __asm__ はCのほうな
295 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:56:26 ] asm は J.5.10 にあるようだが、 __asm__ なんてどこ探してもないぞ。
296 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/02/28(木) 00:15:58 ] gcc
297 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 00:25:21 ] 自分から規格の話振っといて 何で処理系依存の話してるんだ?
298 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/02/28(木) 00:28:57 ] いいえ、ケフィアです。
299 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 11:55:32 ] >>297 病気の子なんだからほっときなさい
300 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 12:18:28 ] aboneばかりだが前後の状況から察するに またあいつ負けてるのか
301 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 17:29:58 ] MSVCについてくるアセンブラソースを、勝手に流用したらタイーホ? 例えばx86用strcpy.asmをGAS用に移すとか。
302 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 18:39:56 ] ライセンス嫁
303 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 22:43:27 ] >>301 そりゃダメだろ。 まあ、strcpy() あたりだとどう書いても似たようなものになるとは思うが。
304 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 12:01:48 ] >>301 MSVCRT.DLLをリンクする程度だったら それはシステムライブラリ扱いだからモウマンタイ? ていう話ではない?
305 名前:301 mailto:sage [2008/03/05(水) 12:26:41 ] やっぱり黒か… ライセンスを探したがどこにも無くて。 x86でNULLを探すための、アライメントを考えた4バイトを一気に調べるソースが、とても参考になったから使わせてほしかったけど、止めておきます。
306 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 12:37:20 ] 単独でルーチンにもならんような、部分的なテク(イディオム)をまねするぐらいなら 問題ないな
307 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 16:18:57 ] >>306 現時点の業界内での常識的判断からは「問題ない」かも知れないが、 訴訟などでイチャモンをつけられる可能性は否定出来ない。 仕事のコードは 判っている範囲ではクリーンにせざる得ない世になっている気がする。
308 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 22:08:10 ] >>304 .dll のリンクはまた別の話だろ。 それがダメなら、Windows のアプリなんか作れないだろ。
309 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 22:46:02 ] かといって for(i=0;i<max;i++){ の行をコピペしただろとか噛み付かれることまで気にすんのは杞憂がすぎるよーな。 つか strcpy ぐらいなら gas に移植しなくても gcc が標準で同等版もってそうな 気がするけど。
310 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 13:33:57 ] 原則に戻ろう 創造性のあるコードをコピーすることが違法
311 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 14:43:52 ] 人間は違法
312 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 07:55:54 ] 違法だが合憲
313 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 23:18:58 ] どなたか教えてください。 参考書を見ながら学習中ですが、1.の環境で2.のファイルを3.のコマンドでビルドした結果4.のアセンブリコードを得ました。コールして欲しいsys_writeがコールされず、実行ファイルは思った動作になりません。 5.のように修正し、6.で実行ファイルを生成すると思った動作になります。 何が問題となって3.のコマンドでsys_writeコールが生成されないのかわかりません。
314 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 23:19:37 ] 1.環境 CPU:AMD-K6(tm) gcc version 4.1.2 GNU ld version 2.17 Debian GNU/Linux ldconfig (GNU libc) 2.3.6 2.ファイル hello-asm.c #include<unistd.h> char message[]="Hello, world!\n"; int sys_write(int fd, const void *buf, int len){ int ret; asm("int $0x80" : "=a" (ret) : "a" (4), "b" (fd), "c" (buf), "d" (len)); return ret; } void sys_exit(int stat){ asm("int $0x80" : : "a" (1), "b" (stat)); } void main(){ sys_write(1, (void*)message, sizeof(message)); sys_exit(123); } 3.コマンド gcc -nostdlib -save-temps -Wl,--entry=main -Wl,-t -o hello-asm -O2 -finhibit-size-directive -fno-ident -fomit-frame-pointer -fcall-used-ebx hello-asm.c
315 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 23:21:57 ] 4.生成アセンブリコード一部 main: leal 4(%esp), %ecx andl $-16, %esp pushl -4(%ecx) pushl %ecx subl $4, %esp movl $123, (%esp) call sys_exit popl %eax popl %ecx leal -4(%ecx), %esp ret 5.正常動作アセンブリコード main: 削除: leal 4(%esp), %ecx 削除: andl $-16, %esp subl $16, %esp pushl $15 pushl $message pushl $1 call sys_write 6.修正後コマンド as hello-asm.s -o hello-asm.o /usr/lib/gcc/i486-linux-gnu/4.1.2/collect2 --entry=main -o hello hello-asm.o
316 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 00:10:48 ] asmにvolatileを付けてみたらどうかね。
317 名前:313 mailto:sage [2008/03/11(火) 00:25:38 ] >>316 おおー、直りました! コンパイラは不要なソースとして認識したんですね。。。 -O2 → -O0 に変更したらvolatile無しでも動作しました。 ありがとうございましたm(_ _)m
318 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 12:31:21 ] gccでアセンブラはかせてみたら下のようになった(抜粋)んだが・・・ main: pushl %ebp movl %esp, %ebp subl $8, %esp andl $-16, %esp movl $0, %eax "andl $-16, %esp"の部分は動作的にはスタックポインタの下位4bit切り捨てはわかるんだけど、 どういう意味なのかがよく分かりません。 ページング方式だからメモリ確保かなあと思ったけど確保される容量みても全然すくないし・・・
319 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 12:43:39 ] アラインメント合わせだと思うけど
320 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 19:19:06 ] -n での AND は便利なので覚えるべし。 >>318 の例だと 16バイトアラインで8バイト以上のスタック領域を確保 という意味になる。 机上で考えてごらん。 もちろん>>318 の例のエピローグコードは理解できるね?
321 名前:318 mailto:sage [2008/03/14(金) 14:02:58 ] レスありがとうございます。 いろいろ自分でも調べてましたが、アライメントの調整っぽいですね。 アセンブラは学校で理論的なことは教えてもらったんですが、実践的なことは全然ならってなくて・・・ >>320 エピローグコードって最初の3行のコードですよね? これって 呼び出し元のベースポインタの退避 呼び出し先のベースポインタの設定 最初のプッシュしたデータ分のスタックポインタの設定 ですよね?
322 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 18:24:59 ] 辞書位引け epilogue prologue
323 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 23:37:20 ] プロローグとエピローグのどっちがどっちだったか分からない時期が俺にもありました…
324 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 23:41:13 ] pro- 前〜 epi- 後〜
325 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 04:01:46 ] GCCの拡張で、".code16gcc"を使えば、32bitセグメントから16bitセグメントの関数を 呼び出したり(その逆も)するのが簡単になるようなんですけど、16bitと32bitが混在 するようなコードを書く場面ってあるんですか?
326 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 10:51:51 ] ブートローダーとか?
327 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 10:54:18 ] 仮想86モードとか?
328 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 10:55:11 ] リブートのためのエピローグコードとか?
329 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 00:06:50 ] 16ビットで書いてあるコードを32ビットに移植したいときとか?
330 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 19:44:52 ] 物好きとか?
331 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 22:27:27 ] code16gccは16bitコードを埋め込める機能であって呼び出せる機能ではないようだが
332 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 22:28:17 ] DEADBEEF
333 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/03/20(木) 22:31:35 ] BADFACE
334 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 12:18:21 ] CAFEBABE
335 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 13:13:16 ] EFFACED
336 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 15:47:17 ] BACA
337 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 17:13:58 ] LCDのバイアス電源は主電源落とす前に切っとけよ。 とかいうときに。
338 名前:デフォルトの名無しさん mailto:sage [2008/03/22(土) 12:46:20 ] Ce11Ba11
339 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 09:51:15 ] 最近アセンブラ勉強し始め、初めての8086+Debugコマンドで本を読み終わったんだが、 次はどこぞのアセンブラを使ってみたいと思う。 少し前だとnasmだと思うけど、最近は何がメインで使われてる? Win+CygwinかFreeBSDの環境で使う予定。
340 名前:デフォルトの名無しさん [2008/04/13(日) 10:03:05 ] あげ
341 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 10:13:32 ] >>339 Windowsのデバドラ開発とかだったら由緒正しいMASM。確かDDKに添付。 PC-Unix界隈だとやはりnasmか、あるいはgas
342 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 10:28:09 ] こんな過疎スレ常に見てるやついないって 今でもNASM・GAS
343 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 10:38:01 ] >>341 ,342 thx まだnasmがいいのか。MASMも使えるならやってみるかな ム板ってアセンブラスレ、ここくらいだっけ? やっぱり2chにはアセンブラ使い少ないのか。。。
344 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 11:38:47 ] て言うか、RISC が流行りだした頃から、アセンブラのコード書くのが 激しく面倒になったし C でそれなりの性能が出るようになったから、 BIOS / ブートローダとか、ほんとにカリカリチューニングする奴ぐら いしか使ってないだろ。
345 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 11:46:34 ] 音声処理、画像処理、暗号化、圧縮… まあこんなとこか
346 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 11:55:44 ] ダンゴさんはもっと有用なことに使ってそうだな
347 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 12:01:05 ] >>344 R3000とかは、そこら辺のCISCなどよりむしろ楽だったよ、しかも高速だった。 R4000以降は最低だけどね
348 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 12:03:01 ] gas は嫌いだ、人が書くようにできてない
349 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 14:04:07 ] gasの構文はきもいんだよな
350 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 14:55:30 ] >>347 アセンブラの書きやすいCPU(基本に忠実な32ビットCPU) 68020、MIPS32、V70 アセンブラの書き難いCPU SuperH、Alpha、SPARC、ARM、IA64など
351 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 15:23:07 ] アセンブラの書き難いCPU x86も追加してくれ
352 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 15:49:20 ] ARM そんなに悪くないけどなぁ。