page0078
の編集
http://osecpu.osask.jp/wiki/?page0078
[
トップ
] [
編集
|
差分
|
バックアップ
|
添付
|
リロード
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
-- 雛形とするページ --
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
* 整数レジスタに付随するbitについて -(by [[K]], 2014.05.14) ** (0) はじめに -osecpu-vm.hのOsecpuVmという構造体の中には、bit[]という見慣れぬメンバ変数があります。これについての説明です。 -基本的に以下の話は、VMを改造しようという人だけが気にすればいい話です。アプリを作る人は気にする必要はありません。 ** (1) -bit[]はRxxの有効ビット数を保持しています。これはそのRxxに最後に代入した命令のbitの値がそのまま入っています。 -つまり32bit演算をした結果が入っているのなら32が入っていますし、8bit演算をした結果が入っているのなら8が入っています。 -このbitで表される数字以上の上位のビットについては、どんなゴミデータが入っていようともそれは無視しなければいけません。 ~ -OSECPU-VMではbitの値を超える演算を認めません。たとえばR02のbitが16だったら、R02の値を使ってADD32などはできないのです。なぜなら、そんなことを認めたらゴミデータを参照して誤動作するかもしれないからです。 -R02の値を変更せずにbitだけを上げる方法があって、それはSBX命令です。SBXはbitの値を上げるだけではなく、R02を指定されたビット数で適正な値になるように、ゴミデータを部分を符号拡張によってクリアします。 -ですからSBX命令を使ってbitを上げてやればADD32にも使えるようになります。 -このルールを守らずに演算してしまった場合は、EXEC_BAD_BITSというセキュリティエラーになります。 ~ -このbitの値は0にすることもできます。そうすると該当の整数レジスタの全てのビットがゴミデータということになります。これは未初期化状態として扱われます。そのレジスタの値を参照しようとすれば直ちにエラーになるわけです。 ~ -なお、アプリがbitの値を知る方法はありません。そういう命令は用意しません。これはプログラマの不注意を検出するためだけのもので、それ以外の用途には使わせないためです。 ~ -bitはなんとメモリにもあります。ただしメモリのbitが1だとしても、LMEM32で値をロードできます。LMEMには符号拡張(もしくはゼロ拡張)機能がデフォルトで入っているからです。 -特別なプリフィクスをつけると、メモリのbitの値がそのままレジスタのbitの値になります。これは一時的にレジスタの値をメモリに退避したり戻したりするときに役立ちます。 -メモリのbitがもっとも役に立つのはbitが0のときです。つまりそのメモリは未初期化なので、参照できないということになります。この場合はLMEM32はセキュリティエラーになります。これにより初期化のやり忘れを容易に発見できます。 ~ -ちなみに浮動小数点レジスタFxxにもbitはありますので、これらに対しても不定値を表現できます。 ** (2) -OSECPU-VMはセキュリティチェックが満載ですが、JITC版ではこれらのチェックを性能向上のためにオフにすることができます(もちろんインタプリタ版と同等のチェックをすることもできる)。その場合、bit[]やそれに類するものは用意されず、チェックもしません。つまりレジスタを不定値にする方法もなくなります(bit=0な命令はNOP扱いを受けてコード生成されません)。 ** (3) -メモリやレジスタの値で「不定」を表現できるようになったのは進歩です。今まではこれができなかったために、オブジェクトを生成したらとにかく初期値を入れて、不定値が残らないようにしましょう、とされてきました。というのは不定値に由来するバグが実に厄介だったからです。 -しかしそれはムダになっていることも往々にしてありました。あとから値をセットすると分かっているのに、それでも必要のない初期化をしていたからです。 -OSECPU-VMでは初期化忘れを検出できるので、こんなムダになるかもしれないプログラミングスタイルを強要されません。 ~ -アセンブラのサブルーチンで破壊レジスタがある場合も、破壊したレジスタにLIMM0しておけば、そのレジスタを不用意に参照したときにエラーにできます。そしてセキュリティチェックをOFFにすればこれらの命令は消えますので、速度低下もありません。 * こめんと欄 #comment
タイムスタンプを変更しない
* 整数レジスタに付随するbitについて -(by [[K]], 2014.05.14) ** (0) はじめに -osecpu-vm.hのOsecpuVmという構造体の中には、bit[]という見慣れぬメンバ変数があります。これについての説明です。 -基本的に以下の話は、VMを改造しようという人だけが気にすればいい話です。アプリを作る人は気にする必要はありません。 ** (1) -bit[]はRxxの有効ビット数を保持しています。これはそのRxxに最後に代入した命令のbitの値がそのまま入っています。 -つまり32bit演算をした結果が入っているのなら32が入っていますし、8bit演算をした結果が入っているのなら8が入っています。 -このbitで表される数字以上の上位のビットについては、どんなゴミデータが入っていようともそれは無視しなければいけません。 ~ -OSECPU-VMではbitの値を超える演算を認めません。たとえばR02のbitが16だったら、R02の値を使ってADD32などはできないのです。なぜなら、そんなことを認めたらゴミデータを参照して誤動作するかもしれないからです。 -R02の値を変更せずにbitだけを上げる方法があって、それはSBX命令です。SBXはbitの値を上げるだけではなく、R02を指定されたビット数で適正な値になるように、ゴミデータを部分を符号拡張によってクリアします。 -ですからSBX命令を使ってbitを上げてやればADD32にも使えるようになります。 -このルールを守らずに演算してしまった場合は、EXEC_BAD_BITSというセキュリティエラーになります。 ~ -このbitの値は0にすることもできます。そうすると該当の整数レジスタの全てのビットがゴミデータということになります。これは未初期化状態として扱われます。そのレジスタの値を参照しようとすれば直ちにエラーになるわけです。 ~ -なお、アプリがbitの値を知る方法はありません。そういう命令は用意しません。これはプログラマの不注意を検出するためだけのもので、それ以外の用途には使わせないためです。 ~ -bitはなんとメモリにもあります。ただしメモリのbitが1だとしても、LMEM32で値をロードできます。LMEMには符号拡張(もしくはゼロ拡張)機能がデフォルトで入っているからです。 -特別なプリフィクスをつけると、メモリのbitの値がそのままレジスタのbitの値になります。これは一時的にレジスタの値をメモリに退避したり戻したりするときに役立ちます。 -メモリのbitがもっとも役に立つのはbitが0のときです。つまりそのメモリは未初期化なので、参照できないということになります。この場合はLMEM32はセキュリティエラーになります。これにより初期化のやり忘れを容易に発見できます。 ~ -ちなみに浮動小数点レジスタFxxにもbitはありますので、これらに対しても不定値を表現できます。 ** (2) -OSECPU-VMはセキュリティチェックが満載ですが、JITC版ではこれらのチェックを性能向上のためにオフにすることができます(もちろんインタプリタ版と同等のチェックをすることもできる)。その場合、bit[]やそれに類するものは用意されず、チェックもしません。つまりレジスタを不定値にする方法もなくなります(bit=0な命令はNOP扱いを受けてコード生成されません)。 ** (3) -メモリやレジスタの値で「不定」を表現できるようになったのは進歩です。今まではこれができなかったために、オブジェクトを生成したらとにかく初期値を入れて、不定値が残らないようにしましょう、とされてきました。というのは不定値に由来するバグが実に厄介だったからです。 -しかしそれはムダになっていることも往々にしてありました。あとから値をセットすると分かっているのに、それでも必要のない初期化をしていたからです。 -OSECPU-VMでは初期化忘れを検出できるので、こんなムダになるかもしれないプログラミングスタイルを強要されません。 ~ -アセンブラのサブルーチンで破壊レジスタがある場合も、破壊したレジスタにLIMM0しておけば、そのレジスタを不用意に参照したときにエラーにできます。そしてセキュリティチェックをOFFにすればこれらの命令は消えますので、速度低下もありません。 * こめんと欄 #comment
テキスト整形のルールを表示する