クラッシックCPU 1個目

このエントリーをはてなブックマークに追加
952774ワット発電中さん:2012/07/28(土) 14:45:10.94 ID:Bp19gHBm
いまだに、TLCS12Aで生産してる装置がある。
953774ワット発電中さん:2012/07/28(土) 19:01:39.15 ID:RA+uMExi
PL/M 懐かしいなあ。
4004 ってスタック3段とからしいのですぐにオーバーフローしそうだが…
そもそもローカル変数とか使えるんか?
954774ワット発電中さん:2012/07/28(土) 20:04:08.11 ID:H/WMi4Hg
ローカル変数?何それ美味いの?って世界かと。
955774ワット発電中さん:2012/07/28(土) 20:27:35.37 ID:pptiogGW
ローカル変数はCPU関係ないだろ
956774ワット発電中さん:2012/07/28(土) 20:30:54.73 ID:DoEFrwgv
>>955
お馬鹿な発言だな。
957774ワット発電中さん:2012/07/28(土) 20:39:16.58 ID:RA+uMExi
変態 CPU とか触ったことないでしょ。

4004 は、ハードウェアスタックで PC の退避専用だから、ローカル変数サポートしようと
したらスタックとは別にそういう仕組みを用意しないといけない。

そもそも世の中には、汎用機のように (ハードウェアとしての) スタック持ってないマシン
もあったりするし。
958774ワット発電中さん:2012/07/28(土) 21:32:43.09 ID:hQ1mP0Uz
なんでメインフレームってそんな設計にしたんだろうな。
360の時にはしょうがなかったにしても。
959774ワット発電中さん:2012/07/28(土) 21:36:19.86 ID:RA+uMExi
普通に 360 を引きずってるだけだと思うが…
960774ワット発電中さん:2012/07/28(土) 22:14:45.38 ID:slm720vD
>>956
お馬鹿はお前だ。
ローカル変数をスタックフレームに置くかどうかは実装の問題であってハードアーキテクチャとは独立だろ。
961774ワット発電中さん:2012/07/28(土) 22:52:01.42 ID:DoEFrwgv
>>960
再帰を考えなければスタックで実装する必要はないが再帰呼び出しもできないような「何か」なら
その中で使われる一時変数をローカル変数とは普通は言わない。

スタックも論理的には別にHWで実装されている必要はないが、push、popの操作が
アトミックになるように書かなければならず、実用的とは思えん。

まあとにかく、馬鹿が知ったような口を利くなと。
962774ワット発電中さん:2012/07/28(土) 22:58:15.58 ID:RA+uMExi
その実装の話をしてるんだが…

話についてこれないなら、絡んでくるなよ。
963774ワット発電中さん:2012/07/28(土) 23:01:20.31 ID:DoEFrwgv
じゃあHWスタック使わずにどうやってローカル変数を実現するか言ってみろ馬鹿が
964774ワット発電中さん:2012/07/28(土) 23:04:33.31 ID:Y3EJeWj2
>>960
本当の馬鹿だったんだな。
リカーシブに使うからってスタックフレームに置く必然性はないし、仮にそうだとしてもHWの用意したスタックメカニズムを使わなければならないということも無い。
実用的云々はもう笑うしかない。
4004で高級言語の話を始めた時点で実用性は棚に上げた話だということもわからないのか。
おのれの知っている実装方法だけが全てと信じて知ったかぶり全開とはね。
965774ワット発電中さん:2012/07/28(土) 23:06:39.27 ID:DoEFrwgv
>>964
グダグダ言ってねえでスタックを使わずにローカル変数を実装する方法を述べてください。
まあ無理しなくてもいいよ
966774ワット発電中さん:2012/07/28(土) 23:08:40.25 ID:j6hx+79a
>>964
アンカミス
960じゃなく>961な
967774ワット発電中さん:2012/07/28(土) 23:12:01.00 ID:pptiogGW
>>965

簡単じゃないか。
ソフトウェアでなんでもいいからスタック的なものを作れば。
968774ワット発電中さん:2012/07/28(土) 23:12:28.59 ID:RA+uMExi
>>962>>960 宛ね

>>961
> 再帰を考えなければスタックで実装する必要はないが再帰呼び出しもできないような「何か」なら
> その中で使われる一時変数をローカル変数とは普通は言わない。

昔の COBOL や FORTRAN の手続きや関数内で宣言されている変数はなんて言うんだ?

> push、popの操作がアトミックになるように書かなければならず

大抵のマシンの push/pop 操作はアトミックじゃないけど?

馬鹿に突っ込むなら、もう少し勉強してからの方がいいと思うぞ。
969774ワット発電中さん:2012/07/28(土) 23:17:28.32 ID:DoEFrwgv
push/popがアトミックじゃないCPUが一つでもあったら教えて欲しいわw
論外過ぎる
970774ワット発電中さん:2012/07/28(土) 23:33:58.87 ID:hsa7PgME
夏だなぁーと思わせる進行だ。

落ち着けよ。 火病を起こすな。
971774ワット発電中さん:2012/07/28(土) 23:37:07.65 ID:e6DXsQ8x
ARMってpush/popはSTRM/LDRMでやってるんじゃなかったっけ?
972774ワット発電中さん:2012/07/28(土) 23:41:14.79 ID:RA+uMExi
>>969
例えば 6809 で複数レジスタを push/pop したら、メモリーサイクル間に他の CPU やデバイス
(DMA とか) が割り込んでくる。

そもそもローカル変数の確保/解放がアトミックである必然性もないし、今時の CPU でローカル
変数の確保に push/pop なんて使ってる間抜けなコンパイラなんてそうそうないし。
大抵スタックポインタを操作するだけだよ。
973774ワット発電中さん:2012/07/28(土) 23:56:38.35 ID:dnka7s6D
何か知らんが久し振りにレスがあったと思ったらいきなり荒れまくりとはね。
そもそもさすがに4004じゃスタック以外にも限界ありまくりなんだから。
限界や実用性を無視しなきゃ何も話できないし、限界や実用性を無視していいのなら何でもできると言えばできる。
目くじら立てても仕方ないよ。
974774ワット発電中さん:2012/07/29(日) 00:05:33.92 ID:QpYczrDX
4004 だから、実用性無視はみんな合意してると思うよ。

その上でハードスタックとして戻りアドレス専用のスタックしか持たない 4004 でローカル変数実装
しようとしたら、今時の CPU に比べて面倒だから本当に実装してるのか? っていうなかに、
「CPU 関係ないとか」言い出す馬鹿がでてきただけの事。

まあ、荒れてると言っても夏休みだし、ネトウヨがいるわけでもないから、こんなもんでしょ。
975774ワット発電中さん:2012/07/29(日) 00:11:54.20 ID:ue8sPw2s
ちょっと話題が違うよって言えばいいところでいきなり馬鹿とかいうから荒れるんだよ。
ここにいるのは必然的にいい歳した大人のはずなのにな。
976774ワット発電中さん:2012/07/29(日) 00:25:10.42 ID:QpYczrDX
2ch の全盛期を知ってる「いい歳した大人」から見て、とても荒れてるとは思えないんだが…
977774ワット発電中さん:2012/07/29(日) 03:02:00.19 ID:tgx0MXIa
いい歳した大人って全共闘世代だろ
むしろ荒れるのが自然だ
978774ワット発電中さん:2012/07/29(日) 07:43:59.88 ID:NTzc6OLy
おれもpush/popしたい
979774ワット発電中さん:2012/07/29(日) 08:03:15.98 ID:c3Uh7DSW
先入れ中出し、後入れ外出し
980774ワット発電中さん:2012/07/29(日) 08:56:39.40 ID:wbALfngt
4004ってアドレッシングも特殊だし(ROMはともかく、RAMが電卓用の
仮数と指数みたいな変な構成だったはず)さすがに例としてどうかと
思うぞ。
981774ワット発電中さん:2012/07/29(日) 09:30:01.68 ID:BVjYYOfW
PUSH, POP各々の命令単位ではアトミックだけど、PUSH〜POPの命令ペアが
アトミックな動作になるアーキテクチャは、世の中にはないのでは?

ローカル変数の確保は、スタックポインタの演算ないし、x86系みたいに
専用のENTER/LEAVE命令がある。

DMAに関しては、1命令実行中のインストラクションフェッチや、メモリ
バスサイクルの途中に割り込む可能性があるけど、CPUアーキテクチャと
いうより、システムの設計依存な気が。
982774ワット発電中さん:2012/07/29(日) 09:31:46.57 ID:eBVLYUoU
4004のRAMは外部記憶扱いで考えないと。
http://www.intel.com/assets/pdf/datasheet/4004_datasheet.pdf
983774ワット発電中さん:2012/07/29(日) 11:27:40.56 ID:XmEp4M4P
>>982
めちゃ久しぶりに、改めて見るが古臭いながらよく出来たデバイスだね。
984774ワット発電中さん:2012/07/29(日) 12:15:15.21 ID:QpYczrDX
>>981
>PUSH, POP各々の命令単位ではアトミックだけど

だから違うって >>972 に書いてあるんだが。
ひょっとして、割り込みが入らない = アトミック とか言う、シングルコア脳の人なのか?

>DMAに関しては、1命令実行中のインストラクションフェッチや、メモリ
>バスサイクルの途中に割り込む可能性があるけど、CPUアーキテクチャと
>いうより、システムの設計依存な気が。

システム設計にももちろん依存するが、CPU アーキテクチャも必要。
詳しくは compare and swap atomic あたりでググって見てくれ。
985774ワット発電中さん:2012/07/29(日) 16:49:00.38 ID:m58oaPdY
>>965 アトミックという言葉を覚えて嬉しいことはわかるがもう少し勉強したほうがいいよ

//スタックを使わないローカル変数の実装(main関数その他は省略)
*void alloc_pointer=XXXX; //XXXXはハードウェア固有のアドレス値

//ポインタル変数 x,y,z が事実上のローカル変数として使用できる
void local_func(){
static int *x;
static short *y;
static char *z;
x = xmalloc(sizeof(int));
y = xmalloc(sizeof(short));
z = xmalloc(sizeof(char));
//(実際の処理)
z = xmfree(sizeof(char));
y = xmfree(sizeof(short));
x = xmfree(sizeof(int));
}

//メモリ割り当て
void* xmalloc(int x){
static void* t;
t = alloc_pointer;
alioc_pointer += x;
return t;
}

//メモリ開放
void xmfree(int x){
alloc_pointer -= x;
}
986985:2012/07/29(日) 16:50:31.83 ID:m58oaPdY
誤字、脱字はご容赦ください
987774ワット発電中さん:2012/07/29(日) 17:41:14.09 ID:m58oaPdY
良く見たら文法エラーorz、ゴメン今はこれが精一杯
>z = xmfree(sizeof(char));
>y = xmfree(sizeof(short));
>x = xmfree(sizeof(int));
     ↓
xmfree(sizeof(char));
xmfree(sizeof(short));
xmfree(sizeof(int));
988774ワット発電中さん:2012/07/29(日) 17:48:33.18 ID:QpYczrDX
既に >>967 に答え書いてあるし、

*void alloc_pointer=XXXX; とか、
z = xmfree(sizeof(char)); で、void の関数から値取得するとか、馬鹿すぎ。

「アトミックという言葉を覚えて嬉しいことはわかるが」なんて煽り入れるなら、
もう少しちゃんとやれや。
989774ワット発電中さん:2012/07/29(日) 18:35:23.09 ID:m58oaPdY
ソース修正後に「馬鹿すぎ」とか突っ込まれても困りますなw
990774ワット発電中さん:2012/07/29(日) 20:06:26.12 ID:qgsG2/US
>>985
ポインタのビット幅 = アドレスバスのビット幅とコアがネイティブに扱えるデータの
最大幅た一致しないCPUでは

alioc_pointer += x;
はアトミックじゃないから問題がある。
991774ワット発電中さん:2012/07/29(日) 20:16:31.10 ID:PAKG7hM0
985の処理にアトミックとか言ってるところが
例題としては×
992774ワット発電中さん:2012/07/29(日) 20:18:41.86 ID:/wruBxbm
いやそもそも割り込みもない4004でアトミックとか言ってる時点でもう
993.985:2012/07/29(日) 20:39:35.60 ID:m58oaPdY
実際にはアセンブラで書くべきなんだろうね。
とりあえず>>985のソースは参考程度にしておいてください。

>alioc_pointer += x;
>はアトミックじゃないから問題がある。

一応コンパイラも作った経験者ですがその程度ならどうとでもなりますので・・・
994774ワット発電中さん:2012/07/29(日) 20:40:59.97 ID:IyOO/37C
 
995774ワット発電中さん:2012/07/29(日) 20:53:18.08 ID:BVjYYOfW
なんだか、アトミックを理解していない、自称マルチプロセッサ搭載ゆとり脳が
混じっているな。
996774ワット発電中さん:2012/07/29(日) 20:57:27.53 ID:VUvPwTFb
997774ワット発電中さん:2012/07/29(日) 21:20:31.65 ID:XmKCn6Jh
998774ワット発電中さん:2012/07/29(日) 21:45:28.68 ID:vTLQG9/w
誰か知らんが早く埋めてスレ終了にしたがってる奴が居るな
999774ワット発電中さん:2012/07/29(日) 21:55:55.10 ID:IuBAVMMT
>>985
atmic性云々は、無関係。
その記述だと、まったくリエントラントにならない。
なぜなら、func を実行中にもう一個funcのイスンタンスを呼び出そうとしても、
アドレスを保持している x,y,z の実体が一個しかないから。

正しい実装は、
static int *sp; // スタック用メモリーを指すように初期化しておくこと。

void local_func(){
static int x;
static short y;
static char z;
*--sp = x;
*--sp = y;
*--sp = z;
// 実際の処理
z = *sp++;
y = *sp++;
z = *sp++;
}
x = xmalloc(sizeof(int));
y = xmalloc(sizeof(short));
z = xmalloc(sizeof(char));
//(実際の処理)
z = xmfree(sizeof(char));
y = xmfree(sizeof(short));
x = xmfree(sizeof(int));
}



1000774ワット発電中さん:2012/07/29(日) 21:57:21.81 ID:IuBAVMMT
すまん、書き込みミス。
最後から2番目の}以降は不要。

マルチタスク対応するには、一連のpush/popをatomicにする必要がある。
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。