前言
CASIO考虑到用户的主要群体,将计算器内部的工作原理包装了起来。为了实现后文中所述的所谓ROP。只是了解CASIO想让我们知道的使用方法显然不够,我们还要探寻习以为常的平常使用下,到底隐藏了什么秘密。大致了解在简单的操作下,计算器到底做了些什么。
基础知识及名词解释
输入区
顾名思义,输入区就是我们当前正在输入的式子的缓存区。当我们在屏幕上打出数字或运算符(统称为符号(Symbol),说明书中称之为字符)时,计算器将这些符号以字节的形式存储在输入区内,按照下表(又称符号表(Symbol Table),建议打印或抄写一份)翻译(适用于991ES PLUS,82ES PLUS A的字符表与之类似,仅有少数不同,已用 / 标出。纵行低位相同,横行高位相同):
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | (NUL) | mᴘ | mₙ | me | mµ | a₀ | h | μɴ | μʙ | ℏ | α | re | λc | γᴘ | λcp | λcn |
1 | Σx² | Σx | n | Σy² | Σy | Σxy | Σx³ | Σx²y | Σx⁴ | minX | maxX | minY | maxY | R∞ | u | μᴘ |
2 | 空格/AtWt | ⎕ | μe | μₙ | μµ | % | F | e | ( | ) | Nᴀ | + | , | — | . | @ |
3 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | : | k | < | = | > | @/RndFix( |
4 | Vm | A | B | C | D | E | F | →A | →B | →C | →D | →M | →X | →Y | × | ÷ |
5 | h | d | o | b | M | ▶a+b𝐢 | ▶r∠θ | ! | X | Y | @/Ref( | [/Rref( | ▫ | ]/Π( | ^( | ÷R |
6 | (-) | Not( | Neg( | Abs( | ẋ₁ | ẋ | ŷ | ẋ₂ | log( | Σ( | ∫( | d/dx( | Pol( | Rec( | and | or |
7 | sinh( | cosh( | tanh( | 𝐞^( | ×⏨ | ² | ³ | ⁻ | R | c₀ | c₁ | {/Int( | @ | }/Intg( | xor | xnor |
8 | 𝐢 | 𝐞 | π | →E | →F | ° | ʳ | ᵍ | Conjg( | ẍ | ȳ | Ans | Ran# | @/Q1 | @/Q3 | @/med |
9 | sinh⁻( | cosh⁻( | tanh⁻( | ⏨^( | ≤ | ≠ | ≥ | @/▶Simp | √( | M+ | ᴀ | ʙ | ᴄ | r | ⋅ | ˣ√( |
A | sin( | cos( | tan( | ln( | @ | ▶Conv | @/GCD( | @/LCM( | ³√( | M— | σx | sx | σy | sy | ⌟ | ∠ |
B | sin⁻( | cos⁻( | tan⁻( | Rnd( | c₂ | σ | ε₀ | μ₀ | 𝐀 | 𝐁 | 𝐂 | 𝐃 | 𝐄 | 𝐅 | 𝐏 | 𝐂 |
C | det( | Trn( | RanInt#( | arg( | ϕ₀ | g | G₀ | Z₀ | MatA | MatB | MatC | MatAns | VctA | VctB | VctC | VctAns |
D | P( | Q( | R( | ▶t | t | G | atm | in▶cm | cm▶in | ft▶m | m▶ft | yd▶m | m▶yd | mile▶km | km▶mile | n mile▶m |
E | m▶n mile | acre▶m² | m²▶acre | gal(US)▶ℓ | ℓ▶gal(US) | gal(UK)▶ℓ | ℓ▶gal(UK) | pc▶km | km▶pc | km/h▶m/s | m/s▶km/h | oz▶g | g▶oz | lb▶kg | kg▶lb | atm▶Pa |
F | Pa▶atm | mmHg▶Pa | Pa▶mmHg | hp▶kW | kW▶hp | kgf/cm²▶Pa | Pa▶kgf/cm² | kgf⋅m▶J | J▶kgf⋅m | lbf/in²▶kPa | kPa▶lbf/in² | °F▶°C | °C▶°F | J▶cal | cal▶J | @ |
当显示模式为LineIO时,输入的式子与内存中十六进制形式严格按照此表对应;MthIO下,若未输入带框的字符(绝对值、根号等),也按照此表对应;若式子中存在带框字符,则情况较为复杂,这里不讨论。
例如这串大家熟知的算式:
在内存中形式如下:
读者可以参照上表进行检查,易发现内存中该式子的存储形式与上表完全一致。
该区域的内容会在按下AC或on、切换模式等诸多情况下清空。
缓存区
该区域存储上一个运算式子(无论有无出现错误),当输入区内容为空时,按下方向键左或右,计算器会将缓存区的内容复制到输入区,以实现运算式子的快速修改。(注意,缓存区与计算历史记录完全不同,不可混为一谈)
计算历史记录
在COMP、CMPLX或BASE-N模式下,计算器会将每一次成功的运算存储到计算历史记录中,在输入区为空的情况下可以进行回溯和调出。具体方式会另行说明,对于我们的目标而言不是必修内容。
字符表(Font Table)
字符表需要与符号表区分开。字符表指的是计算器的字体表。ES PLUS系列计算器的字符表与ASCII码表类似,是ASCII码表的扩充版本。如果有兴趣的话可以在学会ROP后自行提取完整的字符表。对于大多数用途而言,字符表中与ASCII码表中相同的部分已经足够,没有必要提取完整的字符表。
光标位置(Cursor Position)
这同样是一个存在严重歧义的概念。在MthIO或LineIO的插入模式下,光标表现得与记事本中光标类似,看起来好像处于两个符号之间。但是,我们很容易想到,计算器在存储光标位置时,应当存储的是字符的位置,而不是某两个字符之间(内存中不存在两个单元之间的概念)。在LineIO下按下INS(SHIFT+DEL)键,可进入插入模式。此时可以明显发现,光标的实际位置位于原来竖着的光标的后面的符号处,而不是惯常认为的两个字符之间。我们需要统一称呼,当我们说到光标的位置时,我们指的就是闪烁的光标后面的符号的位置。同时,鉴于“光标之后”这一充满歧义的说法已经十分普遍,我们规定所谓“光标之后”,指的就是光标本身所处的位置。例如:
可见光标位于4、5之间,我们命名这个位置为位置4(第一个位置命名为位置0),位置4的符号是5。