1 名前:デフォルトの名無しさん [2007/08/14(火) 17:18:08 ] アセンブラ全般に関するスレッドです。 【前スレ】 アセンブラ… ( ゚д゚)ウッウー pc11.2ch.net/test/read.cgi/tech/1174825173/
151 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 23:32:45 ] 同じ奴か? 応用だろ。考えろ。
152 名前:アセンブラ初心者 [2007/11/07(水) 23:37:43 ] 違いますよ。初投稿です。
153 名前:アセンブラ初心者 [2007/11/08(木) 00:40:56 ] 本当に、誰か教えてください。考えてもわからない。
154 名前:デフォルトの名無しさん [2007/11/08(木) 00:42:21 ] 応用だろ。ログみて考えろ
155 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 00:47:48 ] @A+Bはレジスタか?そのまんまだろ。 A3倍はその結果を3回足せばいい。 B[8080h]はメモリからレジスタにロードして、×2は同じものを足せばいい。 CAの結果からBの結果を引いて D[8081H]に格納 以上。
156 名前:アセンブラ初心者 [2007/11/08(木) 01:05:07 ] LDA [8080h] ADD A MOV C←A ADD B ADD A ADD A SUB C STA [8081h] HLT こんな感じですか?
157 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 01:18:23 ] 「感じ」としてはそんなもんだが ADD B の時点でAの中身がどうなってるかよく考えろ。
158 名前:アセンブラ初心者 [2007/11/08(木) 01:21:06 ] ADD Bの前にSUB Aを入れればいいのですか?
159 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 02:03:05 ] >アセンブラ初心者 お前KIT生だろ?
160 名前:アセンブラ初心者 [2007/11/08(木) 02:03:43 ] そうですけど
161 名前:sage [2007/11/08(木) 02:03:56 ] >アセンブラ初心者 蜷川先生もここ見てるから、おまえ落第決定だなwwwww
162 名前:age [2007/11/08(木) 02:06:28 ] >アセンブラ初心者 石塚お兄さんも見ているから覚悟しておけよwwwwwww
163 名前:デフォルトの名無しさん [2007/11/08(木) 02:10:32 ] 注意: 過去最近、試験はできたのにレポートが書けていなくて(あるいは他人の丸写しで)不合格に なる例が多く見られた。レポートはじっくり時間をかけて考えられるので、レポートでは全員満 点が取れるものとして試験の評価基準を設定してある。必ず満点が取れるような内容のものを提 出すること。よく考えず簡単に書いたまま本当に合っているか再確認を怠ったり、わからないか らといって一部の問題を未記入で提出することのないよう注意すること。追跡を行うなどして、 答が正しいかよく確認すること。 って先生も言ってんだろ。
164 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 02:25:26 ] >>156 つ [紙と鉛筆] レジスタとメモリの内容がどう変化するのか 1命令毎に自分で書き出してみぃや
165 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 07:44:11 ] >[8081h]←(A+B)*3-[8080h]*2の処理を行うプログラミングを教えてください。 LHLD [8080h] ; LDAしたらAがなくなっちゃうでしょ MVI H,0 DAD H ; 8bitの加算じゃ元が80h以上の場合オーバーフローする MOV E,L MOV D,H ; [8080h]*2をDEにsave MOV L,A MVI H,0 ; Aの値を16bitに MOV C,B MVI B,0 ; Bの値を16bitに DAD B ; (A+B)を計算 DAD H DAD H ; *3 MOV A,L SUB E MOV L,A MOV A,H SBB D MOV H,A ; HL-DE "DAD"はあるが"DSUB"が無いので8bitで計算 SHLD [8081h] ; 結果はぎりぎり8bitに収まる HLT
166 名前:165 mailto:sage [2007/11/08(木) 07:51:04 ] レジスタの使い方の一般則:Aはアキュムレータだから、保持には使わないのが原則。 (計算に使えるように常に空けておくべき) HLは16bitのアキュムレータとして使う。(8085の命令セットがその思想でできている) BC,DEは一時的な保持のために使ってよい。 165は冗長だが、この原則で書いてあるので一般性がある。156だと頭でAを壊すとか、 元の値が8bitフルレンジだと結果が正しくならないとかの欠陥がある。
167 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 08:44:16 ] 世間じゃ8085が流行ってるのか?
168 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 08:58:16 ] いまどき大学でやるようなネタでもないような気がするんだけどね。 まー制限が多い方が HW という偶像につかえる司祭としての PG っつー 立場を痛感できて良いという思想の教授なのかもしれんが。
169 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 09:24:12 ] 俺は68kが一番無難だと思ってる。
170 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 11:21:57 ] MIPS の方が良くね?
171 名前:デフォルトの名無しさん [2007/11/08(木) 11:47:58 ] 4004だろ
172 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 13:22:13 ] RISCアセンブラじゃ単純すぎて面白みが足らないじゃんw CPUを作るならMIPSが一番いいと思うけど。
173 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 13:24:31 ] そこでARMですよ
174 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 21:51:52 ] それは人生の無駄遣い。
175 名前:デフォルトの名無しさん [2007/11/08(木) 22:35:04 ] MIPSって普及してるの? ARMに押されていそうだよね。
176 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 10:44:04 ] 宿題丸投げがあるところをみると 馬鹿大学生の間では普及率が高いらしい。<MIPS
177 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 10:50:44 BE:1657152779-2BP(125)] それはパタヘネ(コンピュータの構成と設計)がMIPS使ってるからじゃないかな
178 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 11:19:47 ] だね。大学だとMIPSで教えるから認知度は大きい。 ARMは作ると訴えられてしまうw
179 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 19:49:23 ] PICがMIPSになったそうだからMIPS逆襲のオカン。
180 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 20:33:34 ] ほぅ。 ttp://www.microchip.com/stellent/images/mchpsiteimages/BLOCK.jpg AVR32みたいな独自コアじゃないのか。 まあMIPSのアセンブラを手書きしたいとは思わねーが。
181 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 13:23:42 ] 「アセンブラが怖い」なんて、誰がいってるの?(1/3) − @IT MONOist ttp://monoist.atmarkit.co.jp/fembedded/articles/miconkiso1/07/miconkiso1_07a.html
182 名前:デフォルトの名無しさん [2007/11/15(木) 23:30:45 ] 64ビットのすごさがわかるマシン語書ける人、 サンプル見せて欲しい。
183 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 23:49:40 ] なにも考えずに書いても速度アップするのが64ビットの凄いところ
184 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 01:40:24 ] linuxのコード読みたいんだが疑似命令がよくわからん。 どこかいい解説してるとこない?
185 名前:デフォルトの名無しさん [2007/11/16(金) 16:13:08 ] >>1
186 名前:デフォルトの名無しさん [2007/11/16(金) 21:29:23 ] 初回例外は ntddll.dll にあります。 0xc00000008:invalid handle 7C94EB53 mov dword ptr [esp],eax 7C94EB56 mov dword ptr [esp+4],0 7C94EB5E mov dword ptr [esp+8],0 7C94EB66 mov dword ptr [esp+10h],0 7C94EB6E push esp 7C94EB6F call 7C94EBAC 7C94EB74 mov eax,dword ptr [esp] 7C94EB77 mov esp,ebp 7C94EB79 pop ebp 7C94EB7A ret 7C94EB7B nop 7C94EB7C lea esp,[esp] 7C94EB83 lea ecx,[ecx] どういう意味かわかる方居ませんか。 ドラッグドロップ系の操作をするとこれが出ます。
187 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 21:36:35 ] その情報の意味を知り得るのはそのソースを持ってる奴だけだよ。
188 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 23:07:38 ] >>186 エラーメッセージ以上の事はわからない。 invalidなhandleを渡してるために例外発生して止まってる。 表示されてるコード自体はスタックにパラメータ積んで関数呼び出ししてる部分だけ。 意味の通じるラベルが表示されてないから、callで呼びだしてる先の動作がどうなってるかは不明。 原因はわからないが、おそらく次にあげる2つのうちどちらか。 ・dllを使ってるプログラムにバグがある。 ・ntddll.dllが壊れている。 対策としては ・プログラミングしててデバッグ中に出るなら、ソースを良く確かめる。 ・何かアプリケーションソフトを使ってて出るのなら、sfc /scannowでWindowsファイルが壊れてないかチェック。 もしくは、そのソフトの使用を諦める。
189 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 00:24:42 ] kiRaiseUserExceptionDispatcherでinvalid handle
190 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 01:46:05 ] メモリ破壊系のバグ(ex同期ミス)がkernel handle/critical section(内部でeventを持ってる)に及ぶと そうなるときもあるけど、正直それアセンブラがどうとかじゃなくてwindowsプログラミングだから。 デバッガでsymbolちゃんと設定すりゃもうちょいマシな逆アセになるよ
191 名前:デフォルトの名無しさん [2007/11/17(土) 12:46:44 ] アセンブラでマシン(ノートPC Dynabook)をrebootさせる方法が知りたいです。 簡単にできるのでしょうか?
192 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 13:08:54 ] 何故アセンブラ? OS依存のAPI使えばできるだろうが
193 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 14:02:15 ] rebootなんて、どこだかのアドレスに飛ぶだけだぞ。 どこだったか忘れたがw
194 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 16:08:18 ] >>193 なんとも脆弱なOSだな、それ
195 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2007/11/17(土) 17:04:00 ] rundll user.exe,exitwindowsexecってもう使えないんだっけな
196 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 23:14:18 ] >191 OSによるけど、簡単にはできない。 Win系、PC-UNIX系ならカーネルモードで動作する必要があるだらうから、 ドライバじゃないと無理。 あるいはOS依存のAPIに飛ばせばよいが、引数をちゃんと設定するには Cとかで作った実行ファイルを逆アセンブルしないとわからん。 古いMS-DOSだと193の言う通り、FFFF0hに飛ぶだけ。
197 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 10:09:47 ] nasm 2.00RC1 バージョン飛んだwww
198 名前:デフォルトの名無しさん [2007/11/19(月) 20:22:46 ] AT互換機でハードよりの何か良い書籍はありませんか?
199 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2007/11/19(月) 23:09:35 ] Pentiumマシン語入門編
200 名前:デフォルトの名無しさん [2007/11/21(水) 19:55:02 ] 1<=N<=12の範囲で0<=a<=b<=c<=d<=Nかつa+b+c+d=Nとなるすべての数を求める プログラムでN==6,のときd=2,c=2,b=2,a=0の次の配列はd=2,c=2,b=1,a=1と しないといけないのですがd=2,c=2b=2,a=0でプログラムが終了してしまいます 分岐式がおかしいと思うのですがうまくいきません、アセンブラはこうなりました EOR ACC,ACC ADD ACC,07h ST ACC,[0A0h] EOR ACC,ACC ST ACC,[0A1h] LD IX,0B0h ST IX,[0A2h] LOOP1: CMP ACC,[0A0h] BGE END LD ACC,[0A0h] SUB ACC,[0A1h] CMP ACC,01h BNZ LABEL7 ST ACC,[0A3h] LD ACC,[0A0h] CMP ACC,04h BGT END
201 名前:デフォルトの名無しさん [2007/11/21(水) 19:56:51 ] LD ACC,[0A3h] LABEL7:ST ACC,[0A3h] LD IX,ACC LD ACC,[0A0h] SUB ACC,IX LD IX,[0A3h] LOOP2: CMP ACC,IX BLE LABEL1 SUB ACC,01h BA LOOP2 LABEL1:ST ACC,[0A6h] LD IX,[0A3h] LD ACC,[0A6h] ADD IX,ACC ST IX,[0A4h]
202 名前:デフォルトの名無しさん [2007/11/21(水) 19:57:37 ] LABEL4: LD ACC,[0A0h] SUB ACC,IX LD IX,[0A6h] LOOP3: CMP ACC,IX BLE LABEL2 SUB ACC,01h BA LOOP3 LABEL2:ST ACC,[0A5h] LD IX,[0A4h] ADD IX,ACC LD ACC,[0A0h] SUB ACC,IX LD IX,[0A5h] CMP ACC,IX BLE LABEL3 LABEL6:LD ACC,[0A1h] ADD ACC,01h ST ACC,[0A1h] BA LOOP1 LABEL3:ST ACC,[0A7h] LD IX,[0A2h] LD ACC,[0A3h] ST ACC,[IX] ADD IX,01h LD ACC,[0A6h] ST ACC,[IX] ADD IX,01h
203 名前:デフォルトの名無しさん [2007/11/21(水) 19:59:31 ] LD ACC,[0A5h] ST ACC,[IX] ADD IX,01h LD ACC,[0A7h] ST ACC,[IX] ADD IX,01h ST IX,[0A2h] LD ACC,[0A6h] CMP ACC,02h BGE LABEL5 LD ACC,[0A5h] cmp ACC,02h BZ LABEL8 BA LABEL6 LABEL5: SUB ACC,01h ST ACC,[0A6h] LD IX,[0A3h] ADD IX,ACC ST IX,[0A4h] BA LABEL4 LABEL8:SUB ACC,01h LD IX,[0A4h] ADD IX,ACC LD ACC,[0A3h] SUB ACC,IX ST ACC,[0A5h] BA LABEL3 END: HLT end ご助言お願いします
204 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 20:16:54 ] デバッガで試せ。
205 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 22:10:49 ] >ご助言お願いします だらだらコピペすんな。
206 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 07:35:01 ] フローチャート起こしてじっくり考えてみろ。
207 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 08:52:56 ] 8086(x86)の逆アセンブラでお勧めってあります? 98のゲーム(プリペル)を解析してWindowsに移植しようと思っているんだけど… 98エミュレータに手を加えて、CPU上で動くコード部をそのままdumpするつもりです。 そしてdumpされたコードを逆アセンブルして解析していく方法を考えています。
208 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 12:18:35 ] 一から作ったほうが早いんじゃまいか・・・
209 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 13:45:27 ] >>208 あのプリペルの、歩幅とキー入力の絶妙なシンクロは ぜひともそのまま再現したいんですよ
210 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 13:54:11 ] ZZ86
211 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 13:54:36 ] 98をよくしらないんだがエミュレータを間に挟むのはなんで?
212 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 14:01:33 ] >>210 98用のアセンブラはちょっと。 でもMDEとか懐かしいね。 >>211 DOSフォーマットじゃない独自のファイルシステムなので、 ディスアセンブルするのは起動から追わなくてはいけないので 結構面倒なんです。どこがコード部分かもわかりませんしね。 知りたいのはメインルーチンのみなので、 明らかにコードが通過した場所のみをダンプするのが楽そうに思えました。 ただ、万が一ダイナミックにコードが展開されていたらダメですけどね。
213 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 14:16:38 ] だいたいわかった その用途なら高機能なのより素直な奴の方がよさげだが詳しくないのでなんとも dispeかおりーでばっぐあたりじゃだめか
214 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 14:35:26 ] >>213 プロセスでもexeファイルでもなく、 単純にコードの羅列を逆アセンブルするという用途なのですが、 どうもそういう低機能な逆アセンブラはないみたいなんです。 dispeもOllyDbgも、プロセスもしくはファイル単位で ディスアセンブルをするようです。
215 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 15:12:05 ] ああdispeはともかくollyはエミュごとかけるってのを想定してた
216 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 15:19:49 ] あるいはダミーのPEヘッダつけてやるってのも手か?
217 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 17:05:06 ] ダミーのPEヘッダだとJMPFとか面倒そうですね 下手に分析されると変なところにラベル作られてしまいそう そこらへんは手作業でやるしかないかな
218 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 17:25:28 ] だなあ シンプルなのが欲しいなあ
219 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 18:52:01 ] >単純にコードの羅列を逆アセンブルするという用途 うさみみハリケーンだと、プロセスメモリの指定範囲だけ逆アセンブルできる。 あと、うさみみハリケーンの付属ソフトを使えば、バイナリデータをテキストか ファイルで指定して、逆アセンブルするのも可。 シンプルな逆アセンブラってことなら、↑でいけるかと。
220 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 20:50:25 ] >単純にコードの羅列を逆アセンブルするという用途 俺はnasmについてくる逆アセンブラを使ってる。 ndisasm test.bin > test.asm コレでおkだと思う。
221 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 20:51:22 ] debug.exe…
222 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 21:48:10 ] Sourcer ってまだ売ってたっけ・・・?
223 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 23:53:25 ] symdeb.exe
224 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 00:10:36 ] >>207 古のソーサー
225 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 17:53:23 ] まずファイルを抽出すること
226 名前:デフォルトの名無しさん [2007/11/24(土) 22:31:13 ] MASMの演算子offset,segと同じ意味のNASMは何にあたるのでしょうか? NASMの本で良書をご存知の方、教え
227 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 23:07:27 ] >>226 「教え」? 「てちょんまげ」?
228 名前:デフォルトの名無しさん [2007/11/24(土) 23:53:30 ] >>227 て下さい。 です。失礼しました。
229 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 16:59:27 ] あーちくしょー アセンブラ使いてー ニモニックで書きてー スタック使いてー オールレジストリの高速関数書きてー あーちくしょー
230 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 17:30:38 ] レジストリ?
231 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 18:21:21 ] もうちょっと激しく突っ込んで下さいですorz
232 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 18:22:18 ] オールレジストリか… 変数の格納場所としては面白いかもな
233 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 14:43:09 ] あ ア ニ ス オ ???
234 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 02:15:05 ] table番地以降にいくつかの32ビットの符号付きの整数が入っているとして その中に負の数がいくつあるかをカウントして 結果をcount番地に入れるプログラムを書け ちなみにARMを使ってます AREA QET13,CODE ENTRY LDR R0, =table MOV R1,#0 MOV R2,#0 loop LDR R0,[R0, R1, LSL #4] ;R0 = table[R1] CMP R0,#0 ADDLT R2,R2,#1 BNE loop SWI 0x11 table DCD 0xf1560012 DCD 0x1560012f DCD 0x80330123 DCD 0x7f611c22 DCD 0xa0000242 tableEnd DCD 0 END まだ習いはじめでよくわかりませんが正の数1回カウントするとループをぬけてしまいます どうか御教授お願いします
235 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 02:52:31 ] >>234 ARM知らないけど、 R0をポインタとして使っているのに中身を代入して破壊してたり、 R1を更新していなかったりしてない?
236 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 16:43:47 ] 俺も知らないけど、ADDを非フラグ操作にするんじゃね〜の?
237 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 17:36:17 ] ARMしらんけど ADDLT R2,R2,#1 これはなにやってんの?
238 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 17:45:39 ] R1加算が抜けているので無限ループするはずだがそれは置いておいて LSL #4は4ビット左シフトだから一度に16バイト進んでいるのが原因だと思う
239 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 17:54:46 ] ENTRY以降を擬似cで書くと、こういうことじゃないの? R0 = table; R1 = 0; R2 = 0; loop: R0 = R0[R1 << 4]; condition = R0 - 0; if (condtion < 0) R2 = R2 + 1; if (condtion != 0) goto loop; SoftwareIntrrupt(0x11); となると、問題点は ・R0の破壊(from >235) ・R1の更新がない(from >235, >238) ・R1のシフト量がおかしい(from >238) ってことだね。
240 名前:デフォルトの名無しさん [2007/11/27(火) 23:50:55 ] NASMでセグメント演算子はどうするのでしょうか? オフセットは以下のようにすればOKですが、このセグメントはわかりません。 mov ebx, orz hlt orz 0
241 名前:デフォルトの名無しさん mailto:age [2007/11/28(水) 00:25:46 ] youtubetv.atspace.com/?2xfbo5@JustKakuuYoSay
242 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 15:09:30 ] 初めて自力での改造に成功したぜ ( ゚д゚)ウッウー
243 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 16:48:28 ] mpeg compass.jp 名古屋駅近辺でお話しましょう
244 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 12:49:24 ] A8R8G8B8のα値まで含めたアルファブレンドをMMX化しようと考えているのですが、 どうしても除算が3回から減らせず、なかなか思うような速度が出ません。 Cで書くと temp_a = ((256 - src_a) * dest_a) >> 8; new_a = src_a + temp_a; new_r = (dest_r * temp_a + src_r * src_a) / new_a; new_g = (dest_g * temp_a + src_g * src_a) / new_a; new_b = (dest_b * temp_a + src_b * src_a) / new_a; (ただし 0 < dest_a <= 255, 0 < src_a < 255) のようになり、積和の部分が目にとまったので、MMXで書けないかと考えました。 案の定RGBの積和部分(dest_x * temp_a + src_x * src_a)は簡単に書けたのですが、 三色素同時にnew_aで割る方法や式変形がどうしても分からず、結局三回divを使ってしまっています。 この除算を減らす、もしくは他の方法で高速化するような方法はないでしょうか。 諸事情によりPen2でそれなりの速度を出さなければならず、四苦八苦しています……。
245 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 14:02:16 ] ソースうp
246 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 14:17:49 ] さきに temp_a / new_a src_a / new_a を計算しておいてそれをかけりゃいいんじゃないの?
247 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 15:14:17 ] それを整数演算でやるわけにはいかないだろ。しかも、割り算が二回だし。 # それはそうと、Pen2はSSEないんだっけ? あれば単精度演算も遅くないんだが……
248 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 16:07:39 ] ちょっと誤差がでるけど、俺だったらこうするかな? new_a = src_a + temp_a; new_r = (dest_r * temp_a + src_r * src_a) / new_a; ↓ new_a = src_a + temp_a; temp_div = 65535/new_a; //実際にはテーブル化して temp_div = table[new_a]; new_r = ((dest_r * temp_a + src_r * src_a) * temp_div) >> 16; // ( x * temp_div ) >> 16 はPMULHWを使用
249 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 17:02:47 ] pmullwは符号付きだから>>244 のdest_r * temp_aとかできないと思ったが、 下位16bitだけのpmullwは符号なしにも使えるんだったな。 >>248 にもpmulhwは符号付きだとツッコミ入れようとしたら、 出てくるnew_rの値は明らかに32767以下だから関係なかった。。
250 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 17:18:32 ] PMULHWは符号付きだったのか…。 符号なしのPMULHUWはPen3で追加された命令で Pen2ではサポートしてないのね。
251 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2007/12/29(土) 05:12:56 ] MMX アルファブレンドでググったらそのものなソースが出てくるが。