初心者OK!質問大歓迎!のアセンブラのスレッドです。
基本情報の勉強中の人、PICやH8を勉強中の学生などなど…
前スレ
アセンブラ初心者スレッド
http://echo.2ch.net/test/read.cgi/tech/1314502612/
関連スレ
アセンブラ 13
http://echo.2ch.net/test/read.cgi/tech/1314512680/
探検
アセンブラ初心者スレッド 2©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
2017/04/13(木) 17:35:55.70ID:1WMn3pSz
489デフォルトの名無しさん
2019/11/02(土) 22:41:38.43ID:dJ3V2vrm >>488
実際のCASL IIがそう書けるかどうかはともかくとして、
数学記号と同様の感覚で記号の対応関係や「類推(推論)」で考えれば、
ADDA GR0,#0045
と書くと、アドレス #0045 番地のメモリーに入っている内容を読み出した値を
GR0に足す、という意味になります。# は以後の数値が16進数である事を表す
記号です。初めに言ったようにこの書き方がCASL II 言語で実際に出来るか
どうかは分かりませんが、意味で考えるとそういう意味になるでしょう。一方、
ADDA GR0,=#0045
は、>>488 に書いたように、0045 という16進数の値を入れた領域を
自動的に確保して、そのアドレスを xxx とすると、自動的にその場所を
ADDA GR0,xxx
という命令に置き換えるという意味です。
かなり違う意味です。ですから、覚える覚えないの話では無い事が分かります。
実際のCASL IIがそう書けるかどうかはともかくとして、
数学記号と同様の感覚で記号の対応関係や「類推(推論)」で考えれば、
ADDA GR0,#0045
と書くと、アドレス #0045 番地のメモリーに入っている内容を読み出した値を
GR0に足す、という意味になります。# は以後の数値が16進数である事を表す
記号です。初めに言ったようにこの書き方がCASL II 言語で実際に出来るか
どうかは分かりませんが、意味で考えるとそういう意味になるでしょう。一方、
ADDA GR0,=#0045
は、>>488 に書いたように、0045 という16進数の値を入れた領域を
自動的に確保して、そのアドレスを xxx とすると、自動的にその場所を
ADDA GR0,xxx
という命令に置き換えるという意味です。
かなり違う意味です。ですから、覚える覚えないの話では無い事が分かります。
490デフォルトの名無しさん
2019/11/02(土) 22:47:11.43ID:dJ3V2vrm >>489
x86アセンブラを知っている人ならば、
ADDA GR0,GR1 ---> mov GR0,dword ptr [GR1]
ADDA GR0,#0045 ---> mov GR0,dword ptr [0045h]
ADDA GR0,=#0045 ---> mov GR0,0045h
また、C言語を知っている人ならば、
ADDA GR0,GR1 ---> GR0 += *(DWORD *)GR1;
ADDA GR0,#0045 ---> GR0 += *(DWORD *)0x0045;
ADDA GR0,=#0045 ---> GR0 += 0x0045;
となります。
対応関係は、第二オペランドに X を書くと、[X] や、*X の意味になり、
=X と書くと、X の意味になります。
x86アセンブラを知っている人ならば、
ADDA GR0,GR1 ---> mov GR0,dword ptr [GR1]
ADDA GR0,#0045 ---> mov GR0,dword ptr [0045h]
ADDA GR0,=#0045 ---> mov GR0,0045h
また、C言語を知っている人ならば、
ADDA GR0,GR1 ---> GR0 += *(DWORD *)GR1;
ADDA GR0,#0045 ---> GR0 += *(DWORD *)0x0045;
ADDA GR0,=#0045 ---> GR0 += 0x0045;
となります。
対応関係は、第二オペランドに X を書くと、[X] や、*X の意味になり、
=X と書くと、X の意味になります。
491デフォルトの名無しさん
2019/11/02(土) 22:48:31.37ID:dJ3V2vrm >>490
すみません、movとaddを書き間違えました。正しくはこうです。:
x86アセンブラを知っている人ならば、
ADDA GR0,GR1 ---> add GR0,dword ptr [GR1]
ADDA GR0,#0045 ---> add GR0,dword ptr [0045h]
ADDA GR0,=#0045 ---> add GR0,0045h
すみません、movとaddを書き間違えました。正しくはこうです。:
x86アセンブラを知っている人ならば、
ADDA GR0,GR1 ---> add GR0,dword ptr [GR1]
ADDA GR0,#0045 ---> add GR0,dword ptr [0045h]
ADDA GR0,=#0045 ---> add GR0,0045h
493デフォルトの名無しさん
2019/11/12(火) 18:31:03.25ID:m5a+lCw/ マイコン用のアセンブラコードジェネレータを作りたいんだけどどんな感じにするのが良いんだろうか
if文で条件分岐させていくとコード生成部が条件分岐だらけになって訳が判らなくなる
組み込み用なのでパイプラインのストールを引き起こすようなコードはなるべく生成したくない
if文で条件分岐させていくとコード生成部が条件分岐だらけになって訳が判らなくなる
組み込み用なのでパイプラインのストールを引き起こすようなコードはなるべく生成したくない
494デフォルトの名無しさん
2019/11/12(火) 18:53:07.41ID:I0vQskxn bison+flex+LLVM
495デフォルトの名無しさん
2019/11/12(火) 23:09:55.20ID:We/BiDY5 >>493
テーブル参照して引っ張ってくるのが一番楽かと
テーブル参照して引っ張ってくるのが一番楽かと
496デフォルトの名無しさん
2019/11/13(水) 01:29:11.05ID:6OGWlygT やる気だけでは進まない
497493
2019/11/13(水) 08:08:30.10ID:HNnV6bHC ありがとう
>>494
判りにくくてスマン。ガチの処理系を作りたいわけではないんだ
チップメーカーが出しているGUIでパラメータをポチポチ設定してGeneratボタンをクリックすると
設定に従ったライブラリコードを自動生成してくれるみたいな奴を作りたい
というかLLVMとかは自分の手におえそうにない
>>495
ハッシュテーブルみたいな感じ?パターンは結構ある
今考えているパラメータだけでも
書き込み先アドレスが〜30種程度と〜10種類程度×2
処理の選択にbool値が5個くらい、サイクル数指定が3種
サイクル数を指定できる区間は重なっているし結構ややこしい
ちょっと前から作り始めているけどすでにぐちゃぐちゃ・・・
>>494
判りにくくてスマン。ガチの処理系を作りたいわけではないんだ
チップメーカーが出しているGUIでパラメータをポチポチ設定してGeneratボタンをクリックすると
設定に従ったライブラリコードを自動生成してくれるみたいな奴を作りたい
というかLLVMとかは自分の手におえそうにない
>>495
ハッシュテーブルみたいな感じ?パターンは結構ある
今考えているパラメータだけでも
書き込み先アドレスが〜30種程度と〜10種類程度×2
処理の選択にbool値が5個くらい、サイクル数指定が3種
サイクル数を指定できる区間は重なっているし結構ややこしい
ちょっと前から作り始めているけどすでにぐちゃぐちゃ・・・
498デフォルトの名無しさん
2019/11/21(木) 00:03:41.36ID:Sj//p0Te 初歩的な質問です
8086とZ80だったらどっちを勉強した方が良いですか?
8086とZ80だったらどっちを勉強した方が良いですか?
499デフォルトの名無しさん
2019/11/21(木) 01:21:24.28ID:FiaSI4dm 8086
500デフォルトの名無しさん
2019/11/21(木) 01:21:54.93ID:FiaSI4dm x64じゃいかんの?
501デフォルトの名無しさん
2019/11/21(木) 02:11:07.86ID:dnQ3Bqh9 z80だろ
502デフォルトの名無しさん
2019/11/21(木) 02:13:40.22ID:dnQ3Bqh9 >>498
やっぱ両方いらん
やっぱ両方いらん
503デフォルトの名無しさん
2019/11/21(木) 05:15:38.34ID:1McLuuYz すでに何かのアセンブラ理解してるなら両方勉強しても数日で理解できるだろう。
はじめてアセンブラ勉強するならそりゃシンプルな8bitCPUで圧倒的に情報が多いZ80だろうな。
はじめてアセンブラ勉強するならそりゃシンプルな8bitCPUで圧倒的に情報が多いZ80だろうな。
504498
2019/11/22(金) 00:24:30.25ID:I5J2JfnT 返信が遅くなってすいません
答えて頂いた方、ありがとうございました
答えて頂いた方、ありがとうございました
505デフォルトの名無しさん
2019/11/22(金) 13:34:09.59ID:zKQgPoBc マジレスするとアセンブラを使う目的次第
PICやRL78みたいな小規模でCPUや電子回路を学ぶ
x64で高速化やSIMDを試す
ラズベリーパイやスマホのARMで遊んでみる
DSPで信号処理やフィードバック制御を学ぶ
など
PICやRL78みたいな小規模でCPUや電子回路を学ぶ
x64で高速化やSIMDを試す
ラズベリーパイやスマホのARMで遊んでみる
DSPで信号処理やフィードバック制御を学ぶ
など
506デフォルトの名無しさん
2019/11/22(金) 15:29:17.71ID:gUUFthXr >>498
6809
6809
507デフォルトの名無しさん
2019/11/22(金) 16:26:18.45ID:2jFqraTL508デフォルトの名無しさん
2019/11/22(金) 16:34:56.93ID:2jFqraTL >>507
ちなみに、CPUとしては両者は親戚みたいなもので、Z80を学んだ後から、
8086へ進んでも文化に共通点が多いので理解し易い。
たとえば、条件分岐は、cmpなどの比較命令を実行して
zero flag や carry flag などに影響を与えた後に、Jcc 命令を使う点や、
cmp以外にsubやaddでも全く同様に zero flag, carry flag などに影響を
与えると言う点が両者で共通している。
他のCPUでは全く違うやり方をとるものも多い。
ところが、Z80は8BIT CPU としてはとても上手くできていた方だが、
8086は、16BIT CPU としては残念な方であった。一つの理由は、
当時は低価格で理想的な16BIT CPUを作るためには、ICにおけるトランジスタの
集積度が不足していたが、8BIT CPUを作るには十分であったためらしい。
なので、8BIT CPUは使い易いものが作れたが、16BIT CPU は使いにくいもの
しか作れなかった、と考えることが出来る。
ちなみに、CPUとしては両者は親戚みたいなもので、Z80を学んだ後から、
8086へ進んでも文化に共通点が多いので理解し易い。
たとえば、条件分岐は、cmpなどの比較命令を実行して
zero flag や carry flag などに影響を与えた後に、Jcc 命令を使う点や、
cmp以外にsubやaddでも全く同様に zero flag, carry flag などに影響を
与えると言う点が両者で共通している。
他のCPUでは全く違うやり方をとるものも多い。
ところが、Z80は8BIT CPU としてはとても上手くできていた方だが、
8086は、16BIT CPU としては残念な方であった。一つの理由は、
当時は低価格で理想的な16BIT CPUを作るためには、ICにおけるトランジスタの
集積度が不足していたが、8BIT CPUを作るには十分であったためらしい。
なので、8BIT CPUは使い易いものが作れたが、16BIT CPU は使いにくいもの
しか作れなかった、と考えることが出来る。
509デフォルトの名無しさん
2019/11/22(金) 16:45:49.82ID:gUUFthXr 80186 で恥の上塗りですね判ります
510デフォルトの名無しさん
2019/11/22(金) 16:56:01.19ID:2jFqraTL >>508
他にも、
1. 両者とも、アラインの揃ってないアドレスからでも16BIT以上のデータを
読み出せると言う特徴がある。これが出来ないCPUも多く、Apple系は昔そういう
CPUを使っていたと聞いている。今でもC言語の構造体などで align が細々と
決まっているのは、後者の文化圏の人達が主導しているのかも知れない。
2. carry flag(8086 では「borrow flag」という名前になっている)を使うと、
多倍長の加減算が容易に出来るのも両社に共通している。この特徴は、
他のCPUには無いことが多いらしい。だから、LLVMなどには adc や sbc(sbb)
相当の命令が無いし、carry flag を捕捉する命令も定義されていない。
3. LLVM では、単純な引き算の延長線上にある cmp 命令でフラグを作った後、
条件の種類によっていろいろな種類のJcc で条件分岐するという流儀をとっておらず、
条件の種類によって比較命令自体を変えてしまって、結果は常に 1BIT の
BOOL値とし。逆に Jcc 命令は原則一種類となっている。これは、LLVMが
Z80や8086とは異なる文化圏の人が作ったものであるのではないかと推定される。
4.アカデミカルな世界では、CPUとして、業界事実標準の Z80 や 8086 系統ではなく、
どうも違う文化のものを想定していることが多い気がする。
色々な言葉が、Z80 や 8086 ではかなり多く共通しているが、LLVMとは全く
違う。
他にも、
1. 両者とも、アラインの揃ってないアドレスからでも16BIT以上のデータを
読み出せると言う特徴がある。これが出来ないCPUも多く、Apple系は昔そういう
CPUを使っていたと聞いている。今でもC言語の構造体などで align が細々と
決まっているのは、後者の文化圏の人達が主導しているのかも知れない。
2. carry flag(8086 では「borrow flag」という名前になっている)を使うと、
多倍長の加減算が容易に出来るのも両社に共通している。この特徴は、
他のCPUには無いことが多いらしい。だから、LLVMなどには adc や sbc(sbb)
相当の命令が無いし、carry flag を捕捉する命令も定義されていない。
3. LLVM では、単純な引き算の延長線上にある cmp 命令でフラグを作った後、
条件の種類によっていろいろな種類のJcc で条件分岐するという流儀をとっておらず、
条件の種類によって比較命令自体を変えてしまって、結果は常に 1BIT の
BOOL値とし。逆に Jcc 命令は原則一種類となっている。これは、LLVMが
Z80や8086とは異なる文化圏の人が作ったものであるのではないかと推定される。
4.アカデミカルな世界では、CPUとして、業界事実標準の Z80 や 8086 系統ではなく、
どうも違う文化のものを想定していることが多い気がする。
色々な言葉が、Z80 や 8086 ではかなり多く共通しているが、LLVMとは全く
違う。
511デフォルトの名無しさん
2019/11/22(金) 17:05:38.22ID:zKQgPoBc まあ普通にx64かARMかMIPS
ARMやMIPSはもともとRISCなので非常にきれいでシンプル
x64はAVXなどのリッチな命令を楽しめるし
環境もPCにVisual Studioを入れるだけ
ARMやMIPSはもともとRISCなので非常にきれいでシンプル
x64はAVXなどのリッチな命令を楽しめるし
環境もPCにVisual Studioを入れるだけ
512デフォルトの名無しさん
2019/11/22(金) 17:09:00.41ID:zKQgPoBc 80186(改)は実はわりと最近まで製品で使ってましたよ
大きなLSIの中に、制御用にコアだけ入ってるやつ
セグメントレジスタが4シフトではなく8シフト
大きなLSIの中に、制御用にコアだけ入ってるやつ
セグメントレジスタが4シフトではなく8シフト
513デフォルトの名無しさん
2019/11/22(金) 17:10:09.89ID:omZwaM5I >>510
シッタカで出鱈目書くなよ糞が
シッタカで出鱈目書くなよ糞が
514デフォルトの名無しさん
2019/11/22(金) 17:11:44.26ID:zKQgPoBc すいません
515デフォルトの名無しさん
2019/11/22(金) 17:11:56.78ID:zKQgPoBc おれじゃなかった
516デフォルトの名無しさん
2019/11/22(金) 17:54:18.76ID:UNbCtceI517デフォルトの名無しさん
2019/11/22(金) 18:28:01.42ID:hDmJhEnO >>510じゃないけど
1.性能上(もしくはアトミック性)の理由でアラインメントを揃える
2.8086でもキャリーフラグという名前
もちろんボローの意味でも使う
フラグはOut Of Orderの妨げになりやすく
シンプルな設計を目指したRISC系では使わないし
当然SIMDでも使わない
ただし、命令を組み合わせて同じことが出来る
多倍長の加減算は(乗算他に比べて)速いので
それが性能に影響することは少ないし
64bit CPUではそもそも64bitを越えた演算をすることも非常に少ない
1.性能上(もしくはアトミック性)の理由でアラインメントを揃える
2.8086でもキャリーフラグという名前
もちろんボローの意味でも使う
フラグはOut Of Orderの妨げになりやすく
シンプルな設計を目指したRISC系では使わないし
当然SIMDでも使わない
ただし、命令を組み合わせて同じことが出来る
多倍長の加減算は(乗算他に比べて)速いので
それが性能に影響することは少ないし
64bit CPUではそもそも64bitを越えた演算をすることも非常に少ない
518デフォルトの名無しさん
2019/11/22(金) 18:29:07.76ID:hDmJhEnO519デフォルトの名無しさん
2019/11/22(金) 18:33:09.28ID:hDmJhEnO 4.z80はまったく業界標準ではないですね
数量から言えばARMとx86系が圧倒的
MIPSは教育現場では使われるけど
数量はARMやx86系に比べたら少ない
x86も16bit命令で組む事はほぼない
32bitか64bitがほとんど
数量から言えばARMとx86系が圧倒的
MIPSは教育現場では使われるけど
数量はARMやx86系に比べたら少ない
x86も16bit命令で組む事はほぼない
32bitか64bitがほとんど
520デフォルトの名無しさん
2019/11/22(金) 18:35:52.35ID:hDmJhEnO あとは教育だとRISC-Vとか
521デフォルトの名無しさん
2019/11/22(金) 18:35:58.82ID:z6OUhbA9 ARM系の条件分岐ってフラグベースじゃね?
522デフォルトの名無しさん
2019/11/22(金) 18:43:24.01ID:LRWcxGhp いまどき初心者がZ80に興味持つはずないだろ
こいつが御高説を垂れたいがために質問を自演してるんだろ
情けない奴
こいつが御高説を垂れたいがために質問を自演してるんだろ
情けない奴
523デフォルトの名無しさん
2019/11/22(金) 19:07:15.94ID:sA8M4Dff Z80そのものが使われる機会は減っていてもZ80の流れを汲むアーキテクチャはまだまだある
IA32/AMD64はもちろん、ちょっと上であがっているRL78もだ
IA32/AMD64はもちろん、ちょっと上であがっているRL78もだ
524デフォルトの名無しさん
2019/11/22(金) 19:10:46.49ID:hDmJhEnO525デフォルトの名無しさん
2019/11/22(金) 19:26:38.06ID:sA8M4Dff 組み込み系でも8bitだと桁上がり演算でキャリーをよく使うけど32bitだと出番は激減する
32bitあれば12bitADCの変換値を10回足し込むくらいじゃ余裕
一部のアーキテクチャは特殊演算用に64bitを超えるレジスタを持っていたりするし
なおさら桁あふれしにくい
32bitあれば12bitADCの変換値を10回足し込むくらいじゃ余裕
一部のアーキテクチャは特殊演算用に64bitを超えるレジスタを持っていたりするし
なおさら桁あふれしにくい
526デフォルトの名無しさん
2019/11/22(金) 20:20:02.18ID:LRWcxGhp >>523
ID変えて否定に回ったのが自演の証拠w
ID変えて否定に回ったのが自演の証拠w
527デフォルトの名無しさん
2019/11/22(金) 21:52:14.02ID:DXtwsE0I Intel系のCPUは元々4bitの4004から来ている。4004は主に電卓で使われた。4bitレジスタで演算するとき
桁あふれが頻繁に起こるのがわかっていたのでキャリーフラグがあると便利だろうということで入れたんだと思う。
それが8bitの8008以降も継承されて現在に至る。だから64bitでキャリーフラグが使われないのも当然。
桁あふれが頻繁に起こるのがわかっていたのでキャリーフラグがあると便利だろうということで入れたんだと思う。
それが8bitの8008以降も継承されて現在に至る。だから64bitでキャリーフラグが使われないのも当然。
528デフォルトの名無しさん
2019/11/22(金) 22:00:58.35ID:uBbdr9rC 最後の「だから」がなぜ「だから」なのかわからない
529デフォルトの名無しさん
2019/11/22(金) 22:22:56.50ID:2jFqraTL >>517
>ただし、命令を組み合わせて同じことが出来る
一年ほど前に調べていたら、x+y に対するキャリーフラグをC言語を使って
作り出すようなことを書いているコードを見つけた。
普通に考えればx,yの最上位ビットに着目すればいいんだけど、
最初に思いつくコードよりかなり短いコードだった。
x,yが8BITの場合、x+yに対するキャリーフラグをcfとすると、
意味的には、
cf = 0;
if ( (x & 0x80) != 0 && (y & 0x80) != 0 ) {
cf = 1;
}
でいいはずだけど、
cf = (x & y) >> 7;
かな。でも、もっとエレガントなコードだったような気がする。
何か知っていれば教えて欲しい。
>ただし、命令を組み合わせて同じことが出来る
一年ほど前に調べていたら、x+y に対するキャリーフラグをC言語を使って
作り出すようなことを書いているコードを見つけた。
普通に考えればx,yの最上位ビットに着目すればいいんだけど、
最初に思いつくコードよりかなり短いコードだった。
x,yが8BITの場合、x+yに対するキャリーフラグをcfとすると、
意味的には、
cf = 0;
if ( (x & 0x80) != 0 && (y & 0x80) != 0 ) {
cf = 1;
}
でいいはずだけど、
cf = (x & y) >> 7;
かな。でも、もっとエレガントなコードだったような気がする。
何か知っていれば教えて欲しい。
530デフォルトの名無しさん
2019/11/22(金) 22:28:55.69ID:2jFqraTL さらに、x, y が符号なし8BIT整数の場合の x - y に対する carry flag については、
cf = 0;
if ( x < y ) cf = 1;
で一応求まるんだと思う。
また、sf(sign flag) に関しては、
sf = 演算結果 >> 7;
でいいと思われる。
cf = 0;
if ( x < y ) cf = 1;
で一応求まるんだと思う。
また、sf(sign flag) に関しては、
sf = 演算結果 >> 7;
でいいと思われる。
531デフォルトの名無しさん
2019/11/22(金) 22:33:04.48ID:2jFqraTL532デフォルトの名無しさん
2019/11/22(金) 22:40:25.25ID:2jFqraTL533デフォルトの名無しさん
2019/11/22(金) 22:46:49.23ID:2jFqraTL >>532
すまん。後半部は間違いらしい。
すまん。後半部は間違いらしい。
534デフォルトの名無しさん
2019/11/22(金) 23:19:09.49ID:2jFqraTL535デフォルトの名無しさん
2019/11/23(土) 00:09:22.51ID:zs0Ad1fs >>528
64bitレジスタでは4bitレジスタに比べて桁あふれが起きにくいから使用頻度が少なくなる。
64bitレジスタでは4bitレジスタに比べて桁あふれが起きにくいから使用頻度が少なくなる。
536デフォルトの名無しさん
2019/11/23(土) 02:42:52.78ID:eMnkZzKn 足し算
z0 = x0+y0;
z1 = x1+y1+(z0<x0);
引き算
z0 = x0-y0;
z1 = x1-y1-(z0>x0);
z0 = x0+y0;
z1 = x1+y1+(z0<x0);
引き算
z0 = x0-y0;
z1 = x1-y1-(z0>x0);
537デフォルトの名無しさん
2019/11/23(土) 03:01:11.70ID:eMnkZzKn carry = 0;
for (i=0 ; i < n ; i++){
. . if (carry){
. . . . z[i] = x[i] + y[i];
. . . . carry = z[i] < x[i];
. . }
. . else {
. . . . z[i] = x[i] + y[i] + 1;
. . . . carry = z[i] <= x[i];
. . }
}
for (i=0 ; i < n ; i++){
. . if (carry){
. . . . z[i] = x[i] + y[i];
. . . . carry = z[i] < x[i];
. . }
. . else {
. . . . z[i] = x[i] + y[i] + 1;
. . . . carry = z[i] <= x[i];
. . }
}
538デフォルトの名無しさん
2019/11/23(土) 03:03:32.41ID:eMnkZzKn borrow = 0;
for (i=0 ; i < n ; i++){
. . if (carry){
. . . . z[i] = x[i] - y[i];
. . . . borrow = z[i] > x[i];
. . }
. . else {
. . . . z[i] = x[i] - y[i] - 1;
. . . . borrow = z[i] >= x[i];
. . }
}
for (i=0 ; i < n ; i++){
. . if (carry){
. . . . z[i] = x[i] - y[i];
. . . . borrow = z[i] > x[i];
. . }
. . else {
. . . . z[i] = x[i] - y[i] - 1;
. . . . borrow = z[i] >= x[i];
. . }
}
539529
2019/11/23(土) 11:50:40.96ID:U8iKLMmJ 自己訂正です。
実は、色々と間違いがあり、次のようになっています:
>>529 : 間違い。
530 : 正しい。
531 : 正しい。
>>532 の前半 : 正しい。
>>532 の後半 : 間違い。
改めて、>>529 の根本的な間違いとして、carry flag は、演算前の最上位ビットだけでは決まる、
というのが大間違いでした。下位ビットからの桁上がりがあるためです。
まとめると、x, y が符号なし整数の場合、
1. a = x - y に対する carry flag :
cf = (x < y);
または。
cf = (a > x);
2. a = x + y に対する carry flag :
cf = (x < (-y));
または。
cf = (a < x);
です。上記の「または」以後のやり方は、>>536 537 538 で思い出させていただきました。
一年ほど前に見たやり方がそれだったと思います。とてもエレガントですね。
実は、色々と間違いがあり、次のようになっています:
>>529 : 間違い。
530 : 正しい。
531 : 正しい。
>>532 の前半 : 正しい。
>>532 の後半 : 間違い。
改めて、>>529 の根本的な間違いとして、carry flag は、演算前の最上位ビットだけでは決まる、
というのが大間違いでした。下位ビットからの桁上がりがあるためです。
まとめると、x, y が符号なし整数の場合、
1. a = x - y に対する carry flag :
cf = (x < y);
または。
cf = (a > x);
2. a = x + y に対する carry flag :
cf = (x < (-y));
または。
cf = (a < x);
です。上記の「または」以後のやり方は、>>536 537 538 で思い出させていただきました。
一年ほど前に見たやり方がそれだったと思います。とてもエレガントですね。
540デフォルトの名無しさん
2019/11/25(月) 14:32:25.64ID:1+9AnSdf MIPS64やRISC-VのRV64Iで128bit加算減算のアセンブラ出力してみると
おなじようなことやってるね
mips64 128bit加算 $4:$2 ← $5:$4 + $7:$6
daddu $2,$4,$6
sltu $8,$2,$4
dext $8,$8,0,32
daddu $3,$5,$7
daddu $4,$8,$3
mips64 128bit減算 $4:$2 ← $5:$4 - $7:$6
dsubu $2,$4,$6
sltu $8,$4,$2
dext $8,$8,0,32
dsubu $3,$5,$7
dsubu $4,$3,$8
risc-v RV64I 128bit加算 a6:a7 ← a1:a0 + a3:a2
add a7,a0,a2
sltu a6,a7,a0
add t1,a1,a3
add a6,a6,t1
risc-v RV64I 128bit減算 a1:a2 ← a1:a0 - a3:a2
sub a2,a0,a2
sgtu a0,a2,a0
sub a1,a1,a3
sub a1,a1,a0
おなじようなことやってるね
mips64 128bit加算 $4:$2 ← $5:$4 + $7:$6
daddu $2,$4,$6
sltu $8,$2,$4
dext $8,$8,0,32
daddu $3,$5,$7
daddu $4,$8,$3
mips64 128bit減算 $4:$2 ← $5:$4 - $7:$6
dsubu $2,$4,$6
sltu $8,$4,$2
dext $8,$8,0,32
dsubu $3,$5,$7
dsubu $4,$3,$8
risc-v RV64I 128bit加算 a6:a7 ← a1:a0 + a3:a2
add a7,a0,a2
sltu a6,a7,a0
add t1,a1,a3
add a6,a6,t1
risc-v RV64I 128bit減算 a1:a2 ← a1:a0 - a3:a2
sub a2,a0,a2
sgtu a0,a2,a0
sub a1,a1,a3
sub a1,a1,a0
541デフォルトの名無しさん
2019/11/25(月) 18:08:28.75ID:FcoOoav6 だろうね
542デフォルトの名無しさん
2019/11/28(木) 08:12:36.09ID:xy0IaHJE543デフォルトの名無しさん
2019/11/28(木) 08:14:06.75ID:xy0IaHJE MIPS以降の多くのRISCベースのCPUはすべてキャリーフラグがある。
とても効率的で不可欠だからだ。
とても効率的で不可欠だからだ。
544デフォルトの名無しさん
2019/11/28(木) 19:38:36.20ID:jGkkl6Qu545デフォルトの名無しさん
2019/11/28(木) 19:56:47.34ID:PoPpbfsh フラグはアウトオブオーダーの妨げになるし
並列化も出来ないから
高速化に対してはイマイチ
並列化も出来ないから
高速化に対してはイマイチ
546デフォルトの名無しさん
2019/11/28(木) 20:01:39.23ID:aqT8+si8547デフォルトの名無しさん
2019/11/28(木) 20:15:33.90ID:jGkkl6Qu >>546
それって一々フラグを意識しないだろ。
それって一々フラグを意識しないだろ。
548デフォルトの名無しさん
2019/11/28(木) 20:34:30.59ID:d3vL2dOV 話にならねえな
549デフォルトの名無しさん
2019/11/28(木) 21:08:35.99ID:jGkkl6Qu じゃあ止めよう
550デフォルトの名無しさん
2019/11/28(木) 21:56:14.84ID:aqT8+si8 jbという条件ジャンプ命令は使っているけど
jcという条件ジャンプ命令は使っていないので、キャリーフラグを使うことはない
アホくさ
jcという条件ジャンプ命令は使っていないので、キャリーフラグを使うことはない
アホくさ
551デフォルトの名無しさん
2019/11/28(木) 23:10:51.33ID:xy0IaHJE552デフォルトの名無しさん
2019/11/29(金) 01:09:48.76ID:IDh/GqUP 条件分岐でキャリーフラグの使い方が分からない、使ったことがない、使われることを知らなかった、という人はなんだろう。
6502、Z80、6809、AVR、8086、68K、ARMとメジャーなCPUどれから始めてもマニュアル、入門書には書いてると思う。
6502、Z80、6809、AVR、8086、68K、ARMとメジャーなCPUどれから始めてもマニュアル、入門書には書いてると思う。
553デフォルトの名無しさん
2019/11/29(金) 14:38:26.36ID:I3FFiKl3 JA、JB命令などは普通に使ってもJCを使うことはあまりない
554デフォルトの名無しさん
2019/11/29(金) 15:12:01.44ID:YkvT9y9m >>551
x86なんかキャリーフラグじゃない別のフラグを使った加算とか
歪んだ方向に行ってる
SIMDによる並列化プログラムも
フラグは単なるループ条件くらいにしか使わん
maskレジスタがその役目を継ぐ
x86なんかキャリーフラグじゃない別のフラグを使った加算とか
歪んだ方向に行ってる
SIMDによる並列化プログラムも
フラグは単なるループ条件くらいにしか使わん
maskレジスタがその役目を継ぐ
555デフォルトの名無しさん
2019/11/29(金) 16:58:01.66ID:kFqrise0 555
556デフォルトの名無しさん
2019/11/29(金) 18:54:08.05ID:9qxidx0X キャリーフラグを持たないアーキテクチャ・・・
MIPS?PPC?IA-64?死屍累々じゃねーかw
MIPS?PPC?IA-64?死屍累々じゃねーかw
557デフォルトの名無しさん
2019/11/29(金) 19:13:07.84ID:K9qn0Fk+ >>545
>フラグはアウトオブオーダーの妨げになるし
>並列化も出来ないから
また嘘書いてやがる
Core iプロセッサはフラグがあってもアウトオブオーダーしまくりですが?
アウトオブオーダーを正しく理解してたら絶対にこんなことは書かない
分岐も、投機実行で大凡はカバーされるということになっている
フラグの問題は、元の機械語の並べ方に制約が生じるだけで、アウトオブオーダー実行には関係ない
アウトオブオーダーを妨げるケースでも、元のCISCの挙動に合わせるためで、アウトオブオーダーが
関係しているのではない
>SIMDによる並列化プログラムも
>フラグは単なるループ条件くらいにしか使わん
>maskレジスタがその役目を継ぐ
これもまともに理解してないからこそ書ける内容だな
Pen Proになってアウトオブオーダーが使えるようになった時にcmovが導入されたし、
「単なるループ条件」でも投機実行が必要なんだが?
ここまで酷いとお前に語る資格はないよ
>フラグはアウトオブオーダーの妨げになるし
>並列化も出来ないから
また嘘書いてやがる
Core iプロセッサはフラグがあってもアウトオブオーダーしまくりですが?
アウトオブオーダーを正しく理解してたら絶対にこんなことは書かない
分岐も、投機実行で大凡はカバーされるということになっている
フラグの問題は、元の機械語の並べ方に制約が生じるだけで、アウトオブオーダー実行には関係ない
アウトオブオーダーを妨げるケースでも、元のCISCの挙動に合わせるためで、アウトオブオーダーが
関係しているのではない
>SIMDによる並列化プログラムも
>フラグは単なるループ条件くらいにしか使わん
>maskレジスタがその役目を継ぐ
これもまともに理解してないからこそ書ける内容だな
Pen Proになってアウトオブオーダーが使えるようになった時にcmovが導入されたし、
「単なるループ条件」でも投機実行が必要なんだが?
ここまで酷いとお前に語る資格はないよ
558デフォルトの名無しさん
2019/11/29(金) 19:39:22.16ID:4DEcYZGM アウトオブオーダーの妨げの意味がわからんのだね
なんでx86に変な命令があるのか考えてみ
なんでx86に変な命令があるのか考えてみ
559デフォルトの名無しさん
2019/11/29(金) 19:42:57.97ID:4DEcYZGM フラグは本来依存性の無い処理まで依存性が出てくる
フラグが共通だから
レジスタのようにフラグが複数セットあって指定出来ないとダメ
そらがmaskレジスタであったりx86の変な命令であったり
フラグが共通だから
レジスタのようにフラグが複数セットあって指定出来ないとダメ
そらがmaskレジスタであったりx86の変な命令であったり
560デフォルトの名無しさん
2019/11/29(金) 20:21:52.83ID:K9qn0Fk+ >>548,549
ID:YkvT9y9mがID変えたのか、別人なのかどっちだ?
アウトオブオーダーってのは、真の依存関係にない部分を抽出して同時に実行するっていう
アーキテクチャーだ
ループの2周目以降は前の分岐に依存しているから、本来は順番にしか実行できない
しかし、分岐は数値演算と違って結果のパターンが極めて限定されているので、
決め打ちで一時的に依存関係を無視して処理を進めるのが投機実行だ
アウトオブオーダー実行にはフラグレジスタの存在など関係なく、結果に依存関係が
あるかどうかが問題なんだよ
そんなことも理解せずに語ってたのかって言ってんだよ
ID:YkvT9y9mがID変えたのか、別人なのかどっちだ?
アウトオブオーダーってのは、真の依存関係にない部分を抽出して同時に実行するっていう
アーキテクチャーだ
ループの2周目以降は前の分岐に依存しているから、本来は順番にしか実行できない
しかし、分岐は数値演算と違って結果のパターンが極めて限定されているので、
決め打ちで一時的に依存関係を無視して処理を進めるのが投機実行だ
アウトオブオーダー実行にはフラグレジスタの存在など関係なく、結果に依存関係が
あるかどうかが問題なんだよ
そんなことも理解せずに語ってたのかって言ってんだよ
561デフォルトの名無しさん
2019/11/29(金) 20:34:10.69ID:4DEcYZGM フラグを使う演算だと依存関係が出るって言ってんの
関係ない演算でもフラグのせいで依存関係が出る
同じフラグを使うから
関係ない演算でもフラグのせいで依存関係が出る
同じフラグを使うから
562デフォルトの名無しさん
2019/11/29(金) 20:35:56.20ID:4DEcYZGM これで3回目だが...
x86の変なフラグを使う歪んだ命令は何のため?
x86の変なフラグを使う歪んだ命令は何のため?
563デフォルトの名無しさん
2019/11/29(金) 20:58:00.49ID:K9qn0Fk+ jaもjbもキャリーやゼロや符号の論理演算で表現されるのに、どうしてキャリーフラグが
どうのって話になってんの?
>>561
お前がアウトオブオーダーを理解できてないのはわかった
>フラグを使う演算だと依存関係が出るって言ってんの
>関係ない演算でもフラグのせいで依存関係が出る
>同じフラグを使うから
やはり論理レジスタと物理レジスタの理解も出来てないな
フラグを格納できるレジスタが複数あろうがなかろうが、それは命令アーキテクチャの問題であって
アウトオブオーダーの問題ではない
これでどうしてアウトオブオーダーの妨げになるんだよ?
>x86の変なフラグを使う歪んだ命令は何のため?
その変な命令って何だよ?
どうのって話になってんの?
>>561
お前がアウトオブオーダーを理解できてないのはわかった
>フラグを使う演算だと依存関係が出るって言ってんの
>関係ない演算でもフラグのせいで依存関係が出る
>同じフラグを使うから
やはり論理レジスタと物理レジスタの理解も出来てないな
フラグを格納できるレジスタが複数あろうがなかろうが、それは命令アーキテクチャの問題であって
アウトオブオーダーの問題ではない
これでどうしてアウトオブオーダーの妨げになるんだよ?
>x86の変なフラグを使う歪んだ命令は何のため?
その変な命令って何だよ?
564デフォルトの名無しさん
2019/11/29(金) 21:18:44.73ID:4DEcYZGM 命令を調べて出直しておいで
565デフォルトの名無しさん
2019/11/29(金) 21:30:22.27ID:Mi7N2zYE >>552
なんか勘違いしてる。CYの使い方がわからないのではなく、使う場面が少ないからあまり意識しないんじゃないかということ。
なんか勘違いしてる。CYの使い方がわからないのではなく、使う場面が少ないからあまり意識しないんじゃないかということ。
566デフォルトの名無しさん
2019/11/29(金) 21:44:01.72ID:IDh/GqUP >>564
mips64
daddu $2,$4,$6 1clock目
sltu $8,$2,$4 1clock目
dext $8,$8,0,32 2clock目
daddu $3,$5,$7 1clock目
daddu $4,$8,$3 3clock目
3clock 演算回数 計5回 (加算3回、減算1回、シフト1回)
risc-v
add a7,a0,a2 1clock目
sltu a6,a7,a0 1clock目
add t1,a1,a3 1clock目
add a6,a6,t1 2clock目
2clock 演算回数 4回 (加算3回、減算1回)
amd64
add 1clock目
adc 2clock目
2clock 演算回数 2回(加算2回)
mips、risc-vは必死に並列化してるのに速くならない。
むしろキャリーがあったほうが無駄な演算回数が減り消費電力も減り、
演算器に空きができ、他の計算の余力を得ることになり、並列処理能力は上がることが分かる。
キミのいう依存関係が出てmipsのほうが速い例を挙げてほしい。
mips64
daddu $2,$4,$6 1clock目
sltu $8,$2,$4 1clock目
dext $8,$8,0,32 2clock目
daddu $3,$5,$7 1clock目
daddu $4,$8,$3 3clock目
3clock 演算回数 計5回 (加算3回、減算1回、シフト1回)
risc-v
add a7,a0,a2 1clock目
sltu a6,a7,a0 1clock目
add t1,a1,a3 1clock目
add a6,a6,t1 2clock目
2clock 演算回数 4回 (加算3回、減算1回)
amd64
add 1clock目
adc 2clock目
2clock 演算回数 2回(加算2回)
mips、risc-vは必死に並列化してるのに速くならない。
むしろキャリーがあったほうが無駄な演算回数が減り消費電力も減り、
演算器に空きができ、他の計算の余力を得ることになり、並列処理能力は上がることが分かる。
キミのいう依存関係が出てmipsのほうが速い例を挙げてほしい。
567デフォルトの名無しさん
2019/11/29(金) 21:59:54.67ID:/ptQUX0m568デフォルトの名無しさん
2019/11/30(土) 07:32:32.63ID:zk5zlAHc569デフォルトの名無しさん
2019/11/30(土) 07:35:49.37ID:zk5zlAHc MIPSの話が出るとすぐにキャリーフラグを連呼する例の人かな
彼は8bitCPUの話が好きみたいだが
もう、既に死んでる6502、Z80、6809、68Kあたりを挙げてるからすぐにわかる
彼は8bitCPUの話が好きみたいだが
もう、既に死んでる6502、Z80、6809、68Kあたりを挙げてるからすぐにわかる
570デフォルトの名無しさん
2019/11/30(土) 07:38:44.36ID:zk5zlAHc 8bitCPUなら多倍長演算はよく使うだろうが64bitCPUではほぼ出番がない
571デフォルトの名無しさん
2019/11/30(土) 07:45:40.61ID:xhEM6aVw572デフォルトの名無しさん
2019/11/30(土) 07:55:34.04ID:zk5zlAHc RISC-VならARMのCortex-A72より早いコアができたってさ
このクラスの性能のCPUはx86、POWER、ARM以外にないだろうに
SiFive readies U8-Series RISC-V core designs to compete with ARM's Cortex-A72 models
https://www.notebookcheck.net/SiFive-readies-U8-Series-RISC-V-core-designs-to-compete-with-ARM-s-Cortex-A72-models.440633.0.html
このクラスの性能のCPUはx86、POWER、ARM以外にないだろうに
SiFive readies U8-Series RISC-V core designs to compete with ARM's Cortex-A72 models
https://www.notebookcheck.net/SiFive-readies-U8-Series-RISC-V-core-designs-to-compete-with-ARM-s-Cortex-A72-models.440633.0.html
573デフォルトの名無しさん
2019/11/30(土) 08:04:40.62ID:zk5zlAHc >>571
別人の発言なのに敵視した人は誰でも同一人物だと思っちゃう人?
別人の発言なのに敵視した人は誰でも同一人物だと思っちゃう人?
574デフォルトの名無しさん
2019/11/30(土) 08:05:52.96ID:xhEM6aVw575デフォルトの名無しさん
2019/11/30(土) 08:10:23.93ID:zk5zlAHc RISC-Vの中国製チップを使ったマイコンボード手に入れたが、
普通にCortex-A7クラスのIPCがあってびっくりした
ARMと違ってRISC-Vなのでおそらく中国の半導体メーカーがコアの設計までしたんだろうな
RISC-Vならオープンソースのコアがあるから
中国の半導体メーカーでもそれを参考にして設計できるんだろうね
RISC-Vは中国やインドで推進してるから今後普及していくだろうね
普通にCortex-A7クラスのIPCがあってびっくりした
ARMと違ってRISC-Vなのでおそらく中国の半導体メーカーがコアの設計までしたんだろうな
RISC-Vならオープンソースのコアがあるから
中国の半導体メーカーでもそれを参考にして設計できるんだろうね
RISC-Vは中国やインドで推進してるから今後普及していくだろうね
576デフォルトの名無しさん
2019/11/30(土) 08:12:36.49ID:WebQyLi7 SIMD命令にキャリーフラグやADC/SBB/RCR/RCL命令が無いのが
演算としては使わないっていう証拠
こういった命令は昔のチープな環境のなごり
演算としては使わないっていう証拠
こういった命令は昔のチープな環境のなごり
577デフォルトの名無しさん
2019/11/30(土) 08:14:24.92ID:zk5zlAHc >>574
たとえば、
CMP EAX,10
JB hogehoge
こんなコードだと比較命令でフラグレジスタが変わるが
次の命令ですぐにフラグレジスタを参照してるってことじゃないの?
俺が発言したわけじゃないから知らんけど
たとえば、
CMP EAX,10
JB hogehoge
こんなコードだと比較命令でフラグレジスタが変わるが
次の命令ですぐにフラグレジスタを参照してるってことじゃないの?
俺が発言したわけじゃないから知らんけど
578デフォルトの名無しさん
2019/11/30(土) 08:25:28.29ID:xhEM6aVw579デフォルトの名無しさん
2019/11/30(土) 08:30:24.01ID:zk5zlAHc580デフォルトの名無しさん
2019/11/30(土) 08:33:19.07ID:zk5zlAHc そもそもキャリーフラグが有用なのは2進バイナリの多倍長演算の時だけ
64bitCPUではほぼ出番がない
64bitCPUではほぼ出番がない
581デフォルトの名無しさん
2019/11/30(土) 08:45:13.32ID:xhEM6aVw 挟むめないって挟む理由あるアルゴリズムなんて存在するか?
そんなコード書ける高級言語はないし。キミは一体RISCで何を計算したいんだ?
そんなコード書ける高級言語はないし。キミは一体RISCで何を計算したいんだ?
582デフォルトの名無しさん
2019/11/30(土) 09:00:24.68ID:zk5zlAHc アセンブラの話してるのになんで高級言語の話になるのかな?
MIPSならslt $2, $3, 11とジャンプ命令の間にほかの命令を挟めるってこと
MIPSならslt $2, $3, 11とジャンプ命令の間にほかの命令を挟めるってこと
583デフォルトの名無しさん
2019/11/30(土) 09:22:02.63ID:xhEM6aVw >>582
そうではない。挟まなきゃならない理由を聞いている。
それで並列化できなかったものが並列化可能なら例になるがそうではない。判定の前に命令書いても依存関係がなければ並列化される。
キミの例は可読性が悪くなる書き方ができるというだけで並列化できる例ではない。むしろMPSの欠点だ。
> フラグはアウトオブオーダーの妨げになるし並列化も出来ないから
の例を聞いてるんだよ。ひとつも例が出せてないじゃないか。
そうではない。挟まなきゃならない理由を聞いている。
それで並列化できなかったものが並列化可能なら例になるがそうではない。判定の前に命令書いても依存関係がなければ並列化される。
キミの例は可読性が悪くなる書き方ができるというだけで並列化できる例ではない。むしろMPSの欠点だ。
> フラグはアウトオブオーダーの妨げになるし並列化も出来ないから
の例を聞いてるんだよ。ひとつも例が出せてないじゃないか。
584デフォルトの名無しさん
2019/11/30(土) 09:40:23.31ID:zk5zlAHc 演算のたびにフラグレジスタが変化するのは無駄だとは思うけどね
特にアドレス計算のたびにフラグレジスタが変化するのはうっとうしい
ARMだと加算減算命令はフラグレジスタが変化するものと変化しないのと2種類用意されてるね
特にアドレス計算のたびにフラグレジスタが変化するのはうっとうしい
ARMだと加算減算命令はフラグレジスタが変化するものと変化しないのと2種類用意されてるね
585デフォルトの名無しさん
2019/11/30(土) 09:43:31.34ID:zk5zlAHc しかし、キャリーフラグの話題でここまでスレ伸ばすのはすごいね
8bitのAVR信者っぽいんだけど
8bitだとキャリーフラグがないと何もできないからね
8bitのAVR信者っぽいんだけど
8bitだとキャリーフラグがないと何もできないからね
586デフォルトの名無しさん
2019/11/30(土) 09:53:10.63ID:xhEM6aVw 結局、自分から言い出しといて挟まなきゃならない理由も説明してくれないのか。
まだほとんどコード書いたことない初心者なんだね^^
まだほとんどコード書いたことない初心者なんだね^^
587デフォルトの名無しさん
2019/11/30(土) 11:02:33.57ID:WebQyLi7 間に挟みたい場面なんていくらでもあるだろうに
少しは考えたら?
少しは考えたら?
588デフォルトの名無しさん
2019/11/30(土) 11:06:05.90ID:xhEM6aVw■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 「おこめ券は米以外の食品も買える。効果的な活用を」 地元で農水相 [山形県] [少考さん★]
- 【速報】「女芸人No.1決定戦 THE W」9代目女王にニッチェ! 7年ぶり3度目で悲願の優勝 [牛丼★]
- 高市首相の答弁書に「台湾有事答えない」と明記 存立危機発言当時 ★11 [蚤の市★]
- 【芸能】『女芸人No.1決定戦THE W』 粗品が最後にバッサリ「優勝賞金1000万円にしてはレベル低い大会」 [冬月記者★]
- 今年の流行語大賞 『働いて働いて働いてまいります』が受賞で不快感… 過労自殺の遺族らが会見「家族にむち打つような行為だ」 [冬月記者★]
- 【沖縄】開業4ヵ月でこれは…“国民の税金”投入の『ジャングリア沖縄』で見た衝撃的な光景と、モチベーションが低い一部スタッフの現状 [ぐれ★]
- クズ「勉強頑張らなかった奴は一生DQNと一緒に肉体労働しろ」☚勉強頑張れるのも環境と巡り合わせなんだが? [783475554]
- 人生つらいけどココアちゃんがいるからなんとか生きてる
- インド料理屋に抗議に行った
- 【正論】検察「山上よ、どんな事情があろうと暴力が許されない」 [442080748]
- 熱はないけど倦怠感があるんやが
- スマホゲ問い合わせ俺「ここでこんなことしたらバグった!」返答「アカウント情報と画面のスクショと操作手順をメールで送って」
