93
解答略 @kaitou_ryaku
これはハードウェア記述言語あるあるだと思うのですが、initial文でROMを記述する際に、とりあえず動かすために(アセンブラ等を使わず)メモリの配列に直接16進数を書き込む作業を何度も繰り返す内に、どんどん脳内でアセンブラ⇔機械語の変換ができるようになって、ハンドアセンブル人間に成長してゆく pic.twitter.com/W0FXk5jBM6
拡大
解答略 @kaitou_ryaku
この作業、時代を35年ほど錯誤してる気がするな

2019/07/25 怒涛の進捗。わずか3日間のうちに、サポートする命令がADD(0x00, 0x01)の1個から、48個に爆増した。要はADD命令を徹底的に作りこめば、それを雛形にして他の命令を量産できるのだ。ADD命令(とMOV命令)がややこしいので、そこを最初に片付ける作戦が奏功した。

解答略 @kaitou_ryaku
最近FPGAで自作してるx86 (IA-32)のCPU、文字列操作と浮動小数以外の命令はほぼ全て実装できた気がする。あとはchipsetの内側の割り込みコントローラを書けば、だいぶ本物のコンピュータに近づく。でもこの辺難しいしややこしいんだよなぁ。CPU側の割り込み回路はIF見るだけで、大して難しくないのにな
解答略 @kaitou_ryaku
x86の割り込み命令はinterruptの略称の「int」で、割り込みフラグは「if」なわけだが、もうこれ各方面を疲弊させるためにワザと付けた名前やろ。大抵のプログラミング言語でintやifは予約語だし、思いっきり名前が被るし、仕方ないからintrとintrfにしようと思ったら、今度はinterfaceと被るしあばばば
解答略 @kaitou_ryaku
ここ1ヶ月ほど取り組んでいる自作コンピュータ(ただし回路から全て自分で設計する)の進捗ですが、割とできてきた。命令セット表のピンクの部分は実装済み。青は実装中。水色は面倒くさいやつ。灰色はx64で削除された命令なのでサポートしない。これならx86のサブセットと主張しても怒られない気がする pic.twitter.com/ZSVy6ag0gK
拡大

2019/07/27 シフトローテートの設計に悩む。悩みをツイートしてたら閃いて自己解決した

解答略 @kaitou_ryaku
代数アルゴリズム得意マンに質問なのですが、2進数で表示された自然数nについて、2^3+1つまり9で割った余りを高速で計算するアルゴリズムって何かありますか?あと2^5+1で割った余りも高速で計算したい これが2^3の剰余であれば、nの下位3bitを見れば済むわけです。そんな感じで2^3+1の剰余を知りたい
解答略 @kaitou_ryaku
(捕捉) 僕はいまバレルシフタ・バレルローテータの設計に苦しんでいます。レジスタのサイズが1byteの場合、キャリーフラグを考えなければ、普通に2^3の剰余つまりnの下位3bitだけシフトすれば済みます。しかしキャリーフラグを考えると、nを2^3+1で割った余りだけずらすことになります。これ本当に困る
解答略 @kaitou_ryaku
ここでいう「簡単に計算できる」の定義は nを32桁の{0,1}で表した二進数配列n[0],...,n[31] から nを9で割った余りdを4桁の{0,1}で表した二進数配列d[0],...,d[3] を構成する論理ゲートf:n→dを、できるだけ少数のand,or,notゲートの組み合わせで構成したい、という意味です
解答略 @kaitou_ryaku
これ思いついた!バイナリの配列n(配列数は8とする)がワンホットな場合の剰余をあらかじめ求めておく。これはたかだか8種類。この8種類の整数に対応する固定長シフタを作っておいて、マルチプレクサで連結すればええんや。。つまりバレルシフタの選択線の各bitを、nの桁に置き換えればいい。俺天才では
解答略 @kaitou_ryaku
我ながら完璧なアイデアや。まぁしかしアルゴリズムに造詣の深い競プロ勢諸氏なら、こういうの5秒ぐらいで思いつきそうやな。こういう能力も鍛えないとなぁ......
解答略 @kaitou_ryaku
これよく考えると、シフト演算の合成には可換群の構造が入るから、分割統治的にシフトを合成することができるな。つまり8個の固定長シフタの合成は、log(8)=3段の計算ステップで実行できる。これぐらいなら充分1クロックに収まるわ。圧倒的勝利すぎる。やはり布団の中でダラダラ考えるのが効率最高やな

2019/08初旬は旅行したり帰省したりで進捗ゼロ

2019/08/13 writeシステムコールを作成し、UARTでHello Worldが動いた

解答略 @kaitou_ryaku
低レイヤー詳しい方に質問なのですが、32bitレジスタにASCII文字を1つ入れてスタックにpushする場合、スタック4byteの下位1byteだけにASCII文字が入って、残りの3byteは無駄になりますよね。では複数文字をスタックにpushする場合は、スタックの4byteに4文字入れますか?1文字だけ入れますか?
解答略 @kaitou_ryaku
メモリの中で、データ領域に含まれる固定文字列は、もちろん無駄なくぎっしりASCII文字が入ってる。一方、スタックメモリに入れる文字列は、適当に実装すると4byteのうちの1byteだけにしかASCII文字が入らない。このような格納形式の不整合があると、writeシステムコール等の実装が困難になる気がする
解答略 @kaitou_ryaku
あ、ツイートしてるうにち自己解決してきたぞ。データ領域の固定文字列をwriteする際は、まずはじめに全文字列をスタックに書き出せば良さそうだ。スタックメモリの使用量はデータ領域の文字列の4倍に膨れるけど、仕方ないな。そのあとwriteシステムコールを発行する仕組みにすれば実装が簡単になるわ
解答略 @kaitou_ryaku
いや、この方式はたしかに実装が簡単になるけど、なんかイマイチすぎる気がするわ。さすがにもっとちゃんと(つまりスタックメモリに文字列をギチギチに詰め込むような)実装すべきだな
解答略 @kaitou_ryaku
ここにきて、そもそもスタック領域に文字列を書き込むことは(C言語的に)想定外なのでは、という抜本的な気づきを得つつある。。よく考えるとC言語の文字列配列は、本質的に全て最大サイズが固定長だし、それはつまりスタックに文字列を載せないという話なのだろうな(本当か?)
解答略 @kaitou_ryaku
うおおお!自作中のCPU (x86 IA-32)で、writeシステムコール(というか割り込みハンドラ的な何か)が動いたぞ!Hello Worldだあああ!!!主要なx86の機械語はほぼ全部サポートしてるから、普通のパソコンの感覚でアセンブラを書けば、そのまま全部動いてくれる。ここまで来たらもう後は何でもできそうや pic.twitter.com/0ana37TLun
拡大
拡大
解答略 @kaitou_ryaku
とはいうもののFPU周りの面倒な命令はサポートしてないし、UARTのレシーバー側もイマイチな感じ(chipset内の割り込みコントローラがひどい実装になってる)し、まだまだ課題はあるけれど、でもまぁまぁのところまで来た感がある。MMUは当然未実装で、リングプロテクションなんて漢は黙ってrwxって感じだ
omni 鳥頭 @kariya_mitsuru
文字列は普通に詰めて乗りますね。 ってそういう話ではないのかな? godbolt.org/z/CNAO1W twitter.com/kaitou_ryaku/s…
解答略 @kaitou_ryaku
@kariya_mitsuru これめっちゃ参考になりました!ありがとうございます。確かに、よく考えるとスタックフレームにローカル変数を確保して、そこに mov BYTE PTR [ebp-15], 1 みたいにBYTEのmov命令を発行すれば、簡単に書き換えられますね。

↑この日はスタックに載せる文字列に関し、ひどく頭の悪い勘違いをしていた。スタックへのpush, popは4byte単位だが、movによる書き換えは1byte単位で可能(でないとchar型が扱えない)ことを完全に失念していた。

コメント

あらP★ @arapix 1日前
歴史的にみてもパイプラインが実装されたのはずいぶん後だから、端から入れようとするのは随分チャレンジングなのでは。
ねるにあ†Ridill @nelnia 1日前
こういう「普段何気なく使っているモノの仕組みを追いかける感じ」好きだわ(*'-')
いぬだわん @InuWang 1日前
Test and Set とか Compare and Swap あたりを作るのが大変そう
PentliumEE@厄いゆとり老害世代 @7GHz 1日前
なぜIA32なんていう魔境を開こうとしたのか。。。
kartis56 @kartis56 1日前
いわゆるマイコンなのではとおもったら、自作してるのCPUのほうか…
mikumiku_aloha @mikumiku_aloha 1日前
こういう事を試すと、何故そんな命令セットになったかがピンと来るようになるのでしょうね。
kata_game @kata_game 21時間前
4040とかZ80実装したらいいのになぜIA32なんて高いハードルを……
akiba @akibaakiba1111 19時間前
PC8801作ってくれないかな
やすだゆういち @forth83 19時間前
arapix パイプライン処理は1960年代に見いだされた技術で、x86に限っても取り入れられたのはi486の時ですよ?チャレンジングには同意です。
みふゆ@でもどり @mifuyu2175204 17時間前
プログラマーってこれ全部理解してプログラム書いてるの?すごくない?
Tadashi @tadashifx 17時間前
テストベンチの重要性には既にお気づきのようだけれど、もうガッツリ趣味になっているようなのでI/O含めた周辺のファンクションモデルを充実させると幸せになれる気がする。
SAKURA87@多摩丙丁督 @Sakura87_net 16時間前
何でこんな面倒くさいCPUがデファクトスタンダードなんだ。
mikumiku_aloha @mikumiku_aloha 13時間前
Sakura87_net たぶん、こういう自作やるとその理由が分かるのだと思いまう。
aitsuki @aitsuki2 8時間前
mifuyu2175204 プログラマーが全てアーキテクチャやってるわけじゃないと思う
Toshiya Utoh @toshi_moon 7時間前
なんか、懐かしなぁ。 CPU自作は無いけど、8086載せたボードは自作してた。 chipsetで丸めてるけど、pioとsioを完全に分けたほうが作りやすそう(内部的にはそうなってるんでしょうけど) ロジアナでちまちまタイミングデバッグしてたのも懐かしい。 このツイ見ると、cpuとか作りたくなってしまう。 その時のバイブルは、intelのシートよりも、丸善の8086解説本。
ネギ@8/16-19帰省 @negi__ 6時間前
mifuyu2175204 むしろ大多数のプログラマが, 機械語なら分かる人, C言語なら分かる人, Pythonでディープラーニングならできる人, みたいに各々の興味ある抽象度で仕事できるのがプログラミングの面白いところ. ただしごく一部のスーパーハカーは全部わかる
ログインして広告を非表示にする
ログインして広告を非表示にする