X



アセンブラ初心者スレッド 2©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
0615デフォルトの名無しさん
垢版 |
2019/11/30(土) 16:05:29.45ID:AFPNe0zJ
どうして依存性が切れないのか理解できてないのがレベルが低いって言ってんだよ
WAW依存とか理解してるか?
0616デフォルトの名無しさん
垢版 |
2019/11/30(土) 16:29:11.13ID:WebQyLi7
>>612 の擬似コード

for (int i = 0 ; i < 100 ; i++){
. . CLC
. . for (int j = 0 ; j < 1000 ; j++){
. . . . ADC dest[i][j], src[i][j]
. . }
}

メモリアクセスや制御時間がゼロとしても
100 x 1000クロックかかる
ADCが前のADCの結果に依存するから
順番に処理をするしかない

RCL/RCRを使ったシフトも同じ
0617デフォルトの名無しさん
垢版 |
2019/11/30(土) 16:32:15.54ID:WebQyLi7
これはコンパイラの最適化やCPUのアウトオブオーダーでは解決出来ない

アセンブラで書こうがCで書こうが
頭が悪い人にとってはこれが限界
0619デフォルトの名無しさん
垢版 |
2019/11/30(土) 17:22:23.36ID:xhEM6aVw
そういうキャリーが必要な、前の計算結果が必要で依存する計算は、
キャリーがないCPUだとさらに効率は悪化するから例として意味がない。

128bitを1bit左シフト
SHL
RCL

mips64だとどういうコードですか?
andi
srl
sll
sll
or
みたいな? 大変でつね。他に便利な命令でもあるんですかね?RISCに対して失礼な質問でしたね^^
0620デフォルトの名無しさん
垢版 |
2019/11/30(土) 17:32:16.88ID:8+8CeiWg
> 頭が悪い人にとってはこれが限界

ほんとそのまんまでわらた
依存性を減らす、隠蔽するのが最適化の肝
ちょっとは考えてね
0621デフォルトの名無しさん
垢版 |
2019/11/30(土) 17:36:12.41ID:8+8CeiWg
当然>>616のままじゃダメ
MIPSだろうがARMだろうがx86だろうが

工夫するんだよ
その工夫がキャリーフラグを使うとちょっと難しい

いや、
そもそも>>616のままでも制御をフラグ無しでやらないといけないから大変だね
遅い命令を使って保存しておく????
0623デフォルトの名無しさん
垢版 |
2019/11/30(土) 17:45:13.95ID:8+8CeiWg
キャリーフラグの人は多倍長1ビットシフトを繰り返す
普通の人はバレルシフタをうまく使う
0624デフォルトの名無しさん
垢版 |
2019/11/30(土) 17:52:27.94ID:21OIT27J
一度に1000回もADCするとかよほど暇なアプリケーションなのだろうな
マイコンのADCと仮定すると速い物でも計0.5〜1msecくらいかかるだろう
単に移動平均が欲しいだけなら必要なコストはADC変換1回に付き加減算各1回+メモリアクセスですむんだし
0625デフォルトの名無しさん
垢版 |
2019/11/30(土) 19:36:02.39ID:8+8CeiWg
何で移動平均が突然?
多倍長の話だろ?

そもそも多倍長なんか普通は使わない
普通は64bitで収まる
だからキャリーフラグを使った足し算なんて普通はしない

キャリーフラグを使った演算は
8bit、16bit時代の、遅いCPU時代のなごりだ
0626デフォルトの名無しさん
垢版 |
2019/11/30(土) 21:00:54.84ID:xhEM6aVw
>>625
ARMは最初から32bitだし、AVRに至っては32bit時代に新規に開発された8bitCPUだし、
共に市場で成功したRISC CPUである。キミがキャリー使わないのは単にコード書かないからに過ぎない。
Cでif文でも書けばコンパイラが必然的に使ってしまう。
0628デフォルトの名無しさん
垢版 |
2019/11/30(土) 22:20:20.00ID:jbs9cucn
>>626
ARMはともかくAVRって
1個ずつ順番にやるしかないCPUは>>616で良いんだよ
このコードが糞なのはスーパースカラーの話
つまり、現代の高速CPU全て

スーパースカラーでどうやって速くするか
SIMDでどうやって速くするか
ベクトルコンピューターでどうやって速くするか

頭が悪いと>>616が限界
0630デフォルトの名無しさん
垢版 |
2019/11/30(土) 22:31:00.07ID:AFPNe0zJ
>そもそも多倍長なんか普通は使わない
とか書いておきながら100個の多倍長とか、ずいぶんと極端な例を持ち出すことw

ローテート命令が依存性を抱えてる理由に即答することもできずに、別の話題で誤魔化そうとしてるから
あんたがアウトオブオーダーをまともに理解してないのは確定的だな
これで究極の最適化だのほざいてたのかよw
0631デフォルトの名無しさん
垢版 |
2019/11/30(土) 22:33:09.34ID:jbs9cucn
煽れば答えがもらえると思うのは間違い
レベルが違い過ぎて話にならんから無視するぞ
0632デフォルトの名無しさん
垢版 |
2019/11/30(土) 22:34:55.48ID:FaWuMeWQ
>>607
「話にならん」が口癖の人には悪いけど、可読性は非常に大事。
MASMならマクロが使えるから、定型的な処理はマクロで書いておけばその処理が必要な部分は1行で書けるし、
if-elseマクロを使うだけでもだいぶわかりやすくなる。
http://shaw.la.coocan.jp/masm/control.php

特に他人が書いたソースをいじらないといけないときは可読性大事。修正や変更の手間が大幅に省ける。
0633デフォルトの名無しさん
垢版 |
2019/11/30(土) 22:37:24.82ID:xhEM6aVw
>>629
頓珍漢なレスにマジレスしてやったらそれを理解せず頓珍漢なこと言われてもだな。
それともMIPSは1bitシフトとバレルシフタと命令が別なのかい? RISCなのにw

> キャリーフラグの人は多倍長1ビットシフトを繰り返す
> 普通の人はバレルシフタをうまく使う

とにかく煽りではなくコード見せてよ。
バレルシフタを上手くつかった任意bitのシフトを。キミは普通の人なんだろ?
0634デフォルトの名無しさん
垢版 |
2019/11/30(土) 22:44:56.42ID:AFPNe0zJ
>>631
俺が答えを知らないんじゃなくて、お前が知らないんだろw
煽られても答えることが出来ないからって、レベルが違うとかw
恥も上塗りしまくれば目立たなくなるともお思いで?
wwww
0635デフォルトの名無しさん
垢版 |
2019/12/01(日) 01:20:15.72ID:npZTl1ra
100個の多倍長の配列なんて極端な例を持ち出さなきゃ、普通にアウトオブオーダー実行されるってことだよな
でなきゃそんな欠陥CPUなんてスパコンで使うはずないだろうに

mov edx, 1

xor eax, eax
キャリーを変化させたい命令
cmovc eax, edx
ってやりゃ、キャリーフラグの結果をGPRに反映できるはずだから、以降は機械語の制限による
依存は切り離せるはずだよな
0636デフォルトの名無しさん
垢版 |
2019/12/01(日) 01:44:07.93ID:npZTl1ra
cmovcじゃなく、
adc eax, 0
でもいいか
こっちの方が余計なレジスタ使わなくていいし
0637デフォルトの名無しさん
垢版 |
2019/12/01(日) 02:42:43.59ID:rpSiZ7Ms
コンパイラに出力させると
例えば、15bitの左シフトはこんな感じ
  $3:$2←$5:$4 << 15
  dsrl  $2,$4,49
  dsll  $3,$5,15
  or   $3,$2,$3
  dsll  $2,$4,15

risc-vのRV64GCだとこう
  a1:a0←a1:a0 << 15
  srl   a5,a0,49
  sll   a1,a1,15
  sll   a0,a0,15
  or   a1,a5,a1

arm64だとこう
  x1:x0←x1:x0 << 15
  mov   x2, x0
  lsl   x0, x0, 15
  extr  x1, x1, x2, 49
0638デフォルトの名無しさん
垢版 |
2019/12/01(日) 02:43:56.72ID:rpSiZ7Ms
任意のシフトはこんな感じ
  $3:$2←$5:$4 << $6

  sll  $2,$6,0
  dsrl $3,$4,1
  nor  $7,$0,$6
  dsrl $7,$3,$7
  dsll $3,$5,$2
  andi $6,$6,0x40
  dsll $2,$4,$2
  or   $3,$7,$3
  movn $3,$2,$6
  movn $2,$0,$6

risc-vのRV64GCだとこう
  a1:a0←a1:a0 << a2
    and   a5,a2,64
    beqz  a5,.L1
    sll   a1,a0,a2
    li   a0,0
    jal zero, .L2
.L1:
    srl   a5,a0,1
    not   a4,a2
    srl   a5,a5,a4
    sll   a1,a1,a2
    or   a1,a5,a1
    sll   a0,a0,a2
.L2:
0639デフォルトの名無しさん
垢版 |
2019/12/01(日) 02:44:18.13ID:rpSiZ7Ms
arm64だとこう
  x1:x0←x1:x0 << w2
  mov   w4, 63
  sub   w5, w4, w2
  lsr   x4, x0, 1
  sub   w3, w2, #64
  cmp   w3, 0
  lsl   x1, x1, x2
  lsr   x4, x4, x5
  orr   x1, x4, x1
  lsl   x4, x0, x3
  csel  x1, x4, x1, ge
  lsl   x0, x0, x2
  csel  x0, x0, xzr, lt
0640デフォルトの名無しさん
垢版 |
2019/12/01(日) 11:18:31.61ID:sKSeAmO2
そういえば最近のx86は
典型的な条件ジャンプは
内部的に比較やテストとあわせて1個のuOP命令になる

内部的にはMIPSの条件ジャンプをリッチにした感じ
比較とブランチで2命令も費やしてたら
パフォーマンス的に問題だからね

分岐でも演算でも、
キャリーフラグの出番はもうほとんどない
0641デフォルトの名無しさん
垢版 |
2019/12/01(日) 12:25:49.37ID:rpSiZ7Ms
Intel® 64 and IA-32 ArchitecturesOptimization Reference Manual
64-ia-32-architectures-optimization-manual.pdf
248966-033June 2016
109ページ目3-12の3.4.2.2 Optimizing for Macro-fusionに書かれてるね
リンクはNGワードで貼れなかったのでググッてね
0643デフォルトの名無しさん
垢版 |
2019/12/01(日) 13:38:02.71ID:N3Tb7oIA
>>640
キミが有名なMIPS君かw
0644デフォルトの名無しさん
垢版 |
2019/12/01(日) 13:45:41.30ID:npZTl1ra
>>640
jcc命令の説明
77 cb JA rel8 D Valid Valid Jump short if above (CF=0 and ZF=0).
73 cb JAE rel8 D Valid Valid Jump short if above or equal (CF=0).
キャリーフラグは使われてるぞ
0645デフォルトの名無しさん
垢版 |
2019/12/01(日) 13:47:09.12ID:npZTl1ra
ちょっと見難いね
JA Jump short if above (CF=0 and ZF=0).
JAE Jump short if above or equal (CF=0).
0646デフォルトの名無しさん
垢版 |
2019/12/01(日) 14:13:26.95ID:rpSiZ7Ms
>>644
>>642にマクロフィユージョンで内部的に1命令になるって書いてあるじゃん
JA、JAEはTEST、AND、CMP、ADD、SUBがマクロフュージョン可能なようだね
0647デフォルトの名無しさん
垢版 |
2019/12/01(日) 14:21:48.12ID:npZTl1ra
>>646
間にフラグをいじらない他の命令挟むとフュージョン出来ないはずだし、
フュージョンした場合でも、フラグレジスタも一緒に更新するので、フラグを使うと考えていい
演算回路のキャリー信号を使わないということは、まず考えられないよ
0648デフォルトの名無しさん
垢版 |
2019/12/01(日) 14:22:09.47ID:p3Z7Nr0h
>>643
MIPS君が何者かしらんが
おれはx86/ARM/MIPS全てを愛する男
SH/RL78/C6000/C2000/PIC/AVR/RX
などなどいろいろと経験あり
0652デフォルトの名無しさん
垢版 |
2019/12/01(日) 14:33:05.42ID:npZTl1ra
>>650
なんで噛みついて来るんだ?
間にmovが入ったりしてもフュージョンすると思ってる?
こういう時は普通にフラグレジスタを参照するぞ
0653デフォルトの名無しさん
垢版 |
2019/12/01(日) 14:40:26.09ID:npZTl1ra
確かマクロフュージョンって、実行キューに入るときには別々のμOPsに分解されたはず
整数パイプと分岐ユニット用にね
0654デフォルトの名無しさん
垢版 |
2019/12/01(日) 15:01:21.03ID:rpSiZ7Ms
>>653
また分割しちゃったらマクロフィユージョンで統合した意味なくないか?

>>646のExampleのところにこう書かれてるね
Sandy Bridge microarchitecture enables more arithmetic and logic instructions
to macro-fuse with conditional branches.
In loops where the ALU ports are already congested,
performing one of these macrofusions can relieve the pressure,
as the macro-fused instruction consumes only port 5, instead of an ALU
port plus port 5.
0655デフォルトの名無しさん
垢版 |
2019/12/01(日) 15:30:27.00ID:npZTl1ra
>>654
そういや、分解されるのはマイクロフュージョンの方だったか?
ポート5でALUと分岐ユニットが一緒になってるから間違ってたかも、ゴメン
でも、フュージョン出来ない書き方も可能なはずなので、フラグ参照するパターンもあるはずだよ
0656デフォルトの名無しさん
垢版 |
2019/12/01(日) 22:01:05.21ID:N3Tb7oIA
>>648
MIPSマシン、RISC-Vマシンなんて手に入らないからMIPSの話はMIPSスレでよくね? ここ初心者板だよ? 

ほんとこんなところでスレチのMIPS、RISC-Vニュースコピペしないでくれるかな。
ここム板だよ。荒らしと変わらないよ。興味あるならMIPSスレのほう除くでしょ。
0660デフォルトの名無しさん
垢版 |
2019/12/01(日) 22:54:42.00ID:rpSiZ7Ms
RISC-Vが手に入るようになったからトランジスタ技術2019年11月号や
インターフェースの2019年12月号で特集やってるわけだが
0661デフォルトの名無しさん
垢版 |
2019/12/01(日) 23:20:53.64ID:rpSiZ7Ms
RISC-VはMaix Bit、MaixdunoならArduinoで使えるのでかなり敷居は低くなったぞ
価格も3000円から4000円程度
これらがダメというならAVRの話もダメということになるね
そもそもこんなに荒れたのは
>>529->>539の話があって、>>540を貼ったらAVR信者が食いついて荒らしただけ
0662デフォルトの名無しさん
垢版 |
2019/12/01(日) 23:26:12.86ID:npZTl1ra
MIPS君?って、
>フラグはアウトオブオーダーの妨げになるし
>並列化も出来ないから
って主張が完全崩壊して、当分は現れないんじゃないかな…
アウトオブオーダーの知識も色々とおかしくて、あれで最適化の講釈する度胸はないだろ
0666デフォルトの名無しさん
垢版 |
2019/12/02(月) 19:22:50.55ID:kmSxls5X
AVX512に慣れると、
他のコアがチープに見える
特に32bit〜64bitの中途半端なヤツが

京の次のヤツのARMってSIMD何ビットだっけ?
ちょっと遊んでみたい
0669デフォルトの名無しさん
垢版 |
2019/12/03(火) 11:32:29.72ID:g2sdmHcp
チープなやつは大体どれも変態だよ

C言語で記述不可能なのもあるから
PICは変態な中でもまだマシな方
0674デフォルトの名無しさん
垢版 |
2019/12/14(土) 02:42:04.15ID:er8xklWG
日本では特に間違って伝わってるからなぁ
想像するのがC言語やスクリーンエディタ機能組み込まれてた頃のBASICのGOTOっていう
0675デフォルトの名無しさん
垢版 |
2019/12/14(土) 07:46:40.45ID:6lStbnNy
古臭くて役にも立たない話をするのが大好きで、LARGEADDRESSAWAREやキャリーフラグで
大爆死した誰かさんがしれっと戻って来てるのか?
0676デフォルトの名無しさん
垢版 |
2019/12/14(土) 12:04:43.11ID:teIen0U1
GOTOがというより抽象化に関する教育の不足が問題なんじゃ
昨今のプログラミング教育も本質が見えているようには見えない
0677デフォルトの名無しさん
垢版 |
2019/12/14(土) 12:07:38.82ID:2PNj6NH4
歪んだ教育のせいで
ループ内で意地でも
continue, break, goto
を使わない人がいる

その為、
無駄な変数を使ったり
ループ条件が複雑になったり
本末転倒
0678デフォルトの名無しさん
垢版 |
2019/12/14(土) 13:25:49.98ID:TlZt0bii
breakにラベル指定出来なかったのはCの設計ミスやろ
0679デフォルトの名無しさん
垢版 |
2019/12/14(土) 13:34:05.64ID:JwYnIOEa
多重ループはgotoで抜ける
って事だろうけどね
gotoはラベル名を考えるのが面倒

break 2;
で2段階breakが出来ると良い
0680デフォルトの名無しさん
垢版 |
2019/12/14(土) 13:39:05.39ID:qH7KRmrQ
>>679
N88-BASICのような時代は、行番号があったからラベル名を考える必要が
なく楽だった。MASMの場合は、プロシージャローカルのラベル名が
使えたので、lab1:, lab2: のようにしておくと楽だった。
Cの場合、見た目的に「ラベルが浮く」現象が起きるのも問題。
0681デフォルトの名無しさん
垢版 |
2019/12/14(土) 13:44:49.72ID:qH7KRmrQ
BASICの場合、
1000 xxx
1010 if xxx > xxx then 1200
1020 xxx
1030 goto 1300
1200 xxx
のように書けて至って楽だったし、見た目も綺麗に書けた。

アセンブラの場合も
xxx proc near
   mov yyy,zzz
lab1:
   call aaa
lab2:
   dec ecx
   jnz bbb
xxx endp
のように命令の前には tab(0x09) 付けされ、ラベルと区別が付き易いのでとても
綺麗に書けた。ところがCの場合は、ラベルと命令の見た目のバランスが悪いので
問題となった。構造上の汚さよりもその問題の方が大きい。
0684デフォルトの名無しさん
垢版 |
2019/12/14(土) 16:23:54.51ID:qH7KRmrQ
>>683
こんな感じですか?
{
  {
  ラベル名1:
    if ( xxx < yyy ) {
      普通の文1;
    ラベル名2:
      普通の文2;
    }
  }
}
0691デフォルトの名無しさん
垢版 |
2019/12/15(日) 11:22:32.97ID:ymerGKQi
アセンブラは元々CPUに寄せてるのが普通で、人間に合わせるなんてこと考えてません。
人間がわかりやすいようにしたければマクロで補うなり、プリプロセッサ作るなどして工夫すればいいんですよ。
0693デフォルトの名無しさん
垢版 |
2019/12/15(日) 13:07:08.62ID:o9m7qUoD
ハーバードだろ
0694デフォルトの名無しさん
垢版 |
2019/12/15(日) 13:31:23.47ID:ymerGKQi
>>692
でもね、プロセッサ変わる度に覚え直すのは面倒だしつらいだろ。
面倒なものや難しいものをそのまま力業で押し通そうとするのはやっぱり頭悪いやり方。
賢い人なら、もっと頭使って少しでも使いやすく、わかりやすく変えていくもんだと思うんだよね。
0697デフォルトの名無しさん
垢版 |
2019/12/15(日) 19:26:43.84ID:ymerGKQi
>>696
Cが対応しているプロセッサならそれ使えばいいけど、同じ処理をアセンブラで書くのとCで書いたのでは実行ファイルのサイズが大きく違う。
Cは余計なランタイムルーチンがリンクされて無駄に太る。Cで書いてもアセンブラで書くのとほとんど同じサイズになる処理系があればその方が良い。
そして、なければ作るしかない。覚えにくいニーモニックを頑張って覚えるくらいなら、そういう処理系を作ることに労力を使ったほうがいいんじゃないかな。
0698デフォルトの名無しさん
垢版 |
2019/12/15(日) 19:42:57.22ID:5kgRNS4L
今時マイコンですら結構な容量のフラッシュROMを積んでいるし
高級言語に由来するフットプリント増が問題になるケースは少ないと思うが
高いリアルタイム性が要求されたり重い処理をするケースはアセンブラで書く場合がある
0699デフォルトの名無しさん
垢版 |
2019/12/15(日) 20:20:04.05ID:5sPbacoo
>>697
需要がないプロセッサは作らない
それだけ

変態アーキテクチャは理由があってそうなってる訳だし
普通のCPUならC/C++で使いやすいように整備されてる

Cランタイムサイズが問題になるCPUだと
ランタイムも小さく出来るのが普通
(printf、malloc を使わないなど)
0704デフォルトの名無しさん
垢版 |
2020/01/14(火) 15:59:36.64ID:uFo9dhko
68000君は居ないようだな。残念だ
C言語も神が作ったのではない、breakやcontinueがどこに飛ぶのか分からん時はある。
入門書を信じ込んだ狂信者、原理主義者のような、痛い目に会ってない素人は結構いる。
0705デフォルトの名無しさん
垢版 |
2020/01/14(火) 19:13:53.43ID:VTSZmZmV
>>704
> breakやcontinueがどこに飛ぶのか分からん時はある。
そんな経験はないなあ。普通はCの仕様通りに動く。
Cの仕様通りに動かないとしたらそのCコンパイラのバグだと思いますよ。
もし本当にわけがわからない動作をしたときはテストプログラムを書いてどう動くか調べたり
アセンブラソース出力して見てみればいい。
0707デフォルトの名無しさん
垢版 |
2020/01/15(水) 12:54:18.67ID:mdjDjCL2
素朴な疑問なんだが逆アセンブラのラベルってどうやって生成されるの?
レジスタ間接ジャンプのジャンプ先アドレスなんて実行してみないと判らないような・・・
0709デフォルトの名無しさん
垢版 |
2020/01/16(木) 05:34:03.43ID:I1VMveuP
>>705
>そんな経験はないなあ。普通はCの仕様通りに動く。
多重ループ脱出やifやなんやらのネストでどこに行くか分からなくなる事は無かったんか
Cの経験浅い人は、そういうことが分からないんだろうな。
0712デフォルトの名無しさん
垢版 |
2020/01/16(木) 23:36:50.30ID:GgmseacB
>>709
複雑なものを複雑なままコードにするからそうなる。
多重ループと言ってもせいぜい2重か3重だし、それ以上深いループになるようなコードだったら
そもそも考え方が悪いからシンプルになるように書き直す。中身をサブルーチンに追い出して、
ループ構造と脱出が一目でわかるようにしても良い。
ifのネストも同様に、細部の条件を洗い出してパラメータを変えて呼び出すだけで動くようにする。
そうすればif文を見なくていいしそれぞれ1行で呼び出せる。
とにかくできるだけ構造がシンプルでわかりやすくなるように工夫することだよ。
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況