[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 06/06 15:11 / Filesize : 188 KB / Number-of Response : 881
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

アセンブラ… (゜□゜) ↑アッー!↓



1 名前:デフォルトの名無しさん [2006/05/24(水) 01:43:34 ]
アセンブラ全般に関するスレッドです。

【前スレ】
アセンブラ… ヽ(゚∀゚)ノフォーウ!
pc8.2ch.net/test/read.cgi/tech/1132761638/

過去ログは>>2辺り

239 名前:デフォルトの名無しさん mailto:sage [2006/06/29(木) 08:36:55 ]
スレ違いのWEBサーバの話題終了ー。

以降通常運営でお送りいたします。

240 名前:デフォルトの名無しさん mailto:sage [2006/06/29(木) 12:01:14 ]
nasmのEQUと%defineって何が違うの?

241 名前:デフォルトの名無しさん mailto:sage [2006/06/29(木) 12:37:06 ]
下のように乗算のプログラムを完成させたいのですがさっぱりわかりませんorz
誰かボスケテ

start:
add $1, $0, $0 ; $1: address of X
addi $2, $0, 16 ; $2: counter = 16
add $3, $0, $0 ; $3: product Z
lw $4, 0($1) ; $4: X, load X to $4
addi $1, $1, 4 ; address + 4
...
loop:
...

add $3, $3, $4 ; Z = Z + X
shift:
...

addi $2, $2, -1 ; counter--
bne $2, $0, loop ; go to loop if counter != 0
sw $3, 0($1) ; store Z
finish: j finish ; dead loop

242 名前:デフォルトの名無しさん mailto:sage [2006/06/29(木) 12:53:05 ]
>>241
一度2進数の掛け算を筆算で書いてみな

243 名前:デフォルトの名無しさん mailto:sage [2006/06/29(木) 18:16:49 ]

13(10) x 10(10) = 130(10)

       1101(2) = 13(10)
      x 1010(2) = 10(10)
----------------
       11010(2)
     1101000(2)
----------------
     10000010(2) = 130(10)



244 名前:デフォルトの名無しさん [2006/07/02(日) 11:15:33 ]
質問なのですが

C言語の
for(t=1;t<9;t++)
をアセンブラで書くとどうなるのでしょうか?

245 名前:デフォルトの名無しさん mailto:sage [2006/07/02(日) 11:53:02 ]
>>244
mov eax,1
L1:
cmp eax,8
jg L2
inc eax
jmp L1
L2:


246 名前:デフォルトの名無しさん mailto:sage [2006/07/02(日) 12:10:27 ]
xor ax,ax
mov cx,8
a:
inc ax
loop a


247 名前:デフォルトの名無しさん mailto:sage [2006/07/02(日) 12:45:17 ]
>>244
    XOR   GR7,GR7
    ST    GR7,t
    JUMP  L02
L01  ・・・
    ・・・
    LD    GR7,t
    LAD   GR7,1,GR7
    ST    GR7,t
L02  LAD   GR1,9
    CPA   GR7,GR1
    JMI   L01
    ・・・



248 名前:デフォルトの名無しさん [2006/07/02(日) 12:49:08 ]
>>245さん
ありがとうございます

eaxというのは変数と解釈して良いのでしょうか?

あと各命令は

eaxを1とおく
<L1>
8と比較してeaxが以上ならば
<L2>へ飛ぶ
eaxが小さければ
<L1>を実行する
<L2>

というかんじでしょうか

249 名前:デフォルトの名無しさん mailto:sage [2006/07/02(日) 13:08:25 ]
jgは「以上」じゃなくて「より大きい」だよ。

250 名前:デフォルトの名無しさん mailto:sage [2006/07/02(日) 13:11:10 ]
> eaxというのは変数と解釈して良いのでしょうか?

おーい。

だいたい、「アセンブラで書け」というなら、プロセッサ書けよ。

251 名前:デフォルトの名無しさん [2006/07/02(日) 13:14:22 ]
H8/3664 です

252 名前:デフォルトの名無しさん mailto:sage [2006/07/02(日) 13:15:59 ]
>>247
× XOR GR7,GR7
○ LAD GR7,1
だな。

253 名前:デフォルトの名無しさん mailto:sage [2006/07/02(日) 13:54:03 ]
>>251
組み込みCPU関係は電気・電子板で聞いたほうがいいかも。

254 名前:デフォルトの名無しさん [2006/07/02(日) 14:15:00 ]
ありがとうございました

255 名前:デフォルトの名無しさん mailto:sage [2006/07/03(月) 03:47:29 ]

>>244-249

なんでCPU指定されてないのに会話が続いてたんだろう


256 名前:デフォルトの名無しさん mailto:sage [2006/07/03(月) 05:03:24 ]
なんでもいいからアセンブリ書きたい気分だったんだろ

257 名前:デフォルトの名無しさん mailto:sage [2006/07/03(月) 06:11:59 ]
CPUの指定がない場合は回答側が好きなCPUを選べます。



258 名前:デフォルトの名無しさん [2006/07/03(月) 22:49:18 ]
NASM MASM TASM
どれを使ってますか

259 名前:デフォルトの名無しさん mailto:sage [2006/07/03(月) 22:50:43 ]
GAS 一択。

260 名前:デフォルトの名無しさん mailto:sage [2006/07/03(月) 22:55:03 ]
TASM。

261 名前:デフォルトの名無しさん [2006/07/03(月) 22:56:42 ]
GASでCOMを作成できますか


262 名前:デフォルトの名無しさん mailto:sage [2006/07/03(月) 22:59:01 ]
NASM MASM LASM GAS

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行ずつ変換






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<188KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef