page0033
の編集
http://osecpu.osask.jp/wiki/?page0033
[
トップ
] [
編集
|
差分
|
バックアップ
|
添付
|
リロード
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
-- 雛形とするページ --
BracketName
FormattingRules
FrontPage
Fulyn
Fulyn-v2
Fulyn_Samples
Help
InterWiki
InterWikiName
InterWikiSandBox
K
KOR_PIT8254
KWVM.NET
Liva
MANA
MenuBar
OSECPU_FPGA
PG_MANA
PHP
PukiWiki
PukiWiki/1.4
PukiWiki/1.4/Manual
PukiWiki/1.4/Manual/Plugin
PukiWiki/1.4/Manual/Plugin/A-D
PukiWiki/1.4/Manual/Plugin/E-G
PukiWiki/1.4/Manual/Plugin/H-K
PukiWiki/1.4/Manual/Plugin/L-N
PukiWiki/1.4/Manual/Plugin/O-R
PukiWiki/1.4/Manual/Plugin/S-U
PukiWiki/1.4/Manual/Plugin/V-Z
RecentDeleted
SandBox
WikiEngines
WikiName
WikiWikiWeb
YukiWiki
hikalium
hikarupsp
hikarupsp_ELCHNOS
hikarupsp_ELCHNOS_IDE
hikarupsp_FrontEndCode
hikarupsp_WebCPU-VM
hikarupsp_WebCPU-VM_internal
hikarupsp_study_hh4
impressions
impressions0000
jpag0000
jpag0001
jpag0002
jpag0003
jpag0004
jpag0005
lambdalice
mandel59
members
memo0000
memo0001
memo0002
memo0003
memo0004
memo0005
memo0006
memo0007
memo0008
memo0009
memo0010
osask
osecpu4android
page0000
page0001
page0002
page0003
page0004
page0005
page0006
page0007
page0008
page0009
page0010
page0011
page0012
page0013
page0014
page0015
page0016
page0017
page0018
page0019
page0020
page0021
page0022
page0023
page0024
page0025
page0026
page0027
page0028
page0029
page0030
page0031
page0032
page0033
page0034
page0035
page0036
page0037
page0038
page0039
page0040
page0041
page0042
page0043
page0044
page0045
page0046
page0047
page0048
page0049
page0050
page0051
page0052
page0053
page0054
page0055
page0056
page0057
page0058
page0059
page0060
page0061
page0062
page0063
page0064
page0065
page0066
page0067
page0068
page0069
page0070
page0071
page0072
page0073
page0074
page0075
page0076
page0077
page0078
page0079
page0080
page0081
page0082
page0083
page0084
page0085
page0086
page0087
page0088
page0089
page0090
page0091
page0092
page0093
page0094
page0095
page0096
page0097
page0098
page0099
page0100
page0101
page0102
page0103
page0104
page0105
page0106
page0107
page0108
page0109
pagenames
populars
seccamp2013
seccamp2014
seccamp2017
ttwilb
ttwilb-asmi
yao
* OSECPUのアプリはなぜ小さいのか -(by [[K]], 2013.05.15) ** 要点 -OSECPUのアプリが小さいのは、以下の理由によります。 --サポートしている命令数が少ない。 ---命令数が少なければ命令を表現するためのビット数が節約できます。いわゆる2バイト命令とかはありません。 ---これはできることが少ないというよりも、余計なものがないと考えるほうが分かりやすいと思います。基本的な命令を組み合わせてプログラムを書いていくように設計されています。 --基本単位が0.5バイト。 ---1バイト単位で考えていたら、どんなに短くても1命令で1バイトを使ってしまいます。パラメータがあったらそれだけで2バイト以上になってしまいます。 ---1バイトといったら0~255までが表現できるわけですが、正直なところそんなに多くの表現が必要なことは少なく、0~15で済む場合がほとんどです。ということで、基本単位を0.5バイト(4ビット)として、大きな数値を表現するときはそれを複数つないでエンコードしています(x86などでも1バイトに収まらないときは4バイトとかで書くのと同じことです)。 --利用頻度の高い命令は短い。 ---こういう機械語はよく使うと経験的に知っているので、それを生かしてよく使うものは短く書けるように工夫してあります。 --命令長が可変長。 ---OSECPUのコードはJITコンパイラによって翻訳されてから実行されるので、命令長が固定ではなくても全く問題ありません。規則正しければJITコンパイラが複雑になる心配もありません。 ** 例を交えた解説 -R01レジスタに、定数3を代入。 213 : 1.5バイト --2が定数代入命令、1がレジスタ番号、3は定数。 -R01レジスタに、定数0x1234を代入。 21741234 : 4.0バイト --定数部分は741234に変化している。74は後続の4桁が定数フィールドですというマークになっている。したがって定数7は1桁では書かない(書けない)。 --参考: http://osask.net/w/?gg02/p0002 -R11レジスタに、定数0を代入。 2910 : 2.0バイト --0x11というレジスタ番号は当然0.5バイトでは表現できないので、91という1.0バイト表現になっている(1.0バイトの値は0x80を加えて書くことになっている)。 -R02に1を加算する。 9421 : 2.0バイト --94が命令コード(0x14を意味して、ADD命令を指す)。 -[考察] x86の16bitモードと比較すれば、たとえば、レジスタに1を加算するのに2バイトも使うのは明らかに負けている(x86は1バイトで書ける)。2バイトの定数を代入するのに4バイトを必要とするのも明らかに負けている(x86は3バイトで書ける)。 -しかしその一方で、小さな値に限れば1.5バイトで代入できたり、命令長を0.5バイト長くするだけでレジスタを8本以上利用できるようになるなどのメリットもあり、結果的にはそのほうがプラスに働いている。それは結局利用頻度の問題である。プログラムでは0や1の代入は多く発生するが、それに対し0x1234を代入しなければいけないケースはまれである。したがってOSECPUはx86よりも勝つ機会が多く、トータルでも勝つことになる。 ** 拡張性など -OSECPUアプリの実行ファイルは、小さすぎて拡張性がないと思われるかもしれませんが、そんなことはありません。ちゃんと考えてあります。 -まず実行ファイルの最初の2バイトはシグネチャです。これでユーザの誤操作で実行ファイル以外を実行してしまうことを予防します。 -次に3バイト目が以下の値の時には、特別な意味を持たせています。 --0x(NOP):実行ファイルはバックエンドコードで記述されている --87(end-for):拡張ヘッダが後続する --F0(NOPの別表現):tek5圧縮がかかっている --アプリの先頭にどうしてもNOP命令を置きたいときは80で記述することになっています -したがって、87から書き始めれば、スタックサイズやヒープサイズなど、必要な情報はちゃんと記述できます。MS-DOSの.COMファイルとは違うのです。 ** 関連リンク -[[page0031]] フロントエンドバイトコード #0 ** こめんと欄 -このページにこめんと欄はありません。このページの内容にコメントしたいときは[[impressions]]にお願いします。
タイムスタンプを変更しない
* OSECPUのアプリはなぜ小さいのか -(by [[K]], 2013.05.15) ** 要点 -OSECPUのアプリが小さいのは、以下の理由によります。 --サポートしている命令数が少ない。 ---命令数が少なければ命令を表現するためのビット数が節約できます。いわゆる2バイト命令とかはありません。 ---これはできることが少ないというよりも、余計なものがないと考えるほうが分かりやすいと思います。基本的な命令を組み合わせてプログラムを書いていくように設計されています。 --基本単位が0.5バイト。 ---1バイト単位で考えていたら、どんなに短くても1命令で1バイトを使ってしまいます。パラメータがあったらそれだけで2バイト以上になってしまいます。 ---1バイトといったら0~255までが表現できるわけですが、正直なところそんなに多くの表現が必要なことは少なく、0~15で済む場合がほとんどです。ということで、基本単位を0.5バイト(4ビット)として、大きな数値を表現するときはそれを複数つないでエンコードしています(x86などでも1バイトに収まらないときは4バイトとかで書くのと同じことです)。 --利用頻度の高い命令は短い。 ---こういう機械語はよく使うと経験的に知っているので、それを生かしてよく使うものは短く書けるように工夫してあります。 --命令長が可変長。 ---OSECPUのコードはJITコンパイラによって翻訳されてから実行されるので、命令長が固定ではなくても全く問題ありません。規則正しければJITコンパイラが複雑になる心配もありません。 ** 例を交えた解説 -R01レジスタに、定数3を代入。 213 : 1.5バイト --2が定数代入命令、1がレジスタ番号、3は定数。 -R01レジスタに、定数0x1234を代入。 21741234 : 4.0バイト --定数部分は741234に変化している。74は後続の4桁が定数フィールドですというマークになっている。したがって定数7は1桁では書かない(書けない)。 --参考: http://osask.net/w/?gg02/p0002 -R11レジスタに、定数0を代入。 2910 : 2.0バイト --0x11というレジスタ番号は当然0.5バイトでは表現できないので、91という1.0バイト表現になっている(1.0バイトの値は0x80を加えて書くことになっている)。 -R02に1を加算する。 9421 : 2.0バイト --94が命令コード(0x14を意味して、ADD命令を指す)。 -[考察] x86の16bitモードと比較すれば、たとえば、レジスタに1を加算するのに2バイトも使うのは明らかに負けている(x86は1バイトで書ける)。2バイトの定数を代入するのに4バイトを必要とするのも明らかに負けている(x86は3バイトで書ける)。 -しかしその一方で、小さな値に限れば1.5バイトで代入できたり、命令長を0.5バイト長くするだけでレジスタを8本以上利用できるようになるなどのメリットもあり、結果的にはそのほうがプラスに働いている。それは結局利用頻度の問題である。プログラムでは0や1の代入は多く発生するが、それに対し0x1234を代入しなければいけないケースはまれである。したがってOSECPUはx86よりも勝つ機会が多く、トータルでも勝つことになる。 ** 拡張性など -OSECPUアプリの実行ファイルは、小さすぎて拡張性がないと思われるかもしれませんが、そんなことはありません。ちゃんと考えてあります。 -まず実行ファイルの最初の2バイトはシグネチャです。これでユーザの誤操作で実行ファイル以外を実行してしまうことを予防します。 -次に3バイト目が以下の値の時には、特別な意味を持たせています。 --0x(NOP):実行ファイルはバックエンドコードで記述されている --87(end-for):拡張ヘッダが後続する --F0(NOPの別表現):tek5圧縮がかかっている --アプリの先頭にどうしてもNOP命令を置きたいときは80で記述することになっています -したがって、87から書き始めれば、スタックサイズやヒープサイズなど、必要な情報はちゃんと記述できます。MS-DOSの.COMファイルとは違うのです。 ** 関連リンク -[[page0031]] フロントエンドバイトコード #0 ** こめんと欄 -このページにこめんと欄はありません。このページの内容にコメントしたいときは[[impressions]]にお願いします。
テキスト整形のルールを表示する