Raspberry Pi Screen04

实验目标

在图形界面上操作文本

背景补充

字符串操作

计算机不能满足于只显示提前准备好的字符串,需要有特定的函数来处理含有变量的字符串,比如说接下来的表格就是C++常见语法。

即使传入的变量相同,但是显示的格式不一样得到的结果也是不同的,比如说如下:

除法

不同于人们运算除法时采用的乘法表的方式,计算机在进行除法运算时,首先将其转换成二进制数字,从被除数最高为开始,选择一个数,非零即一,检查该位上能否减去除数之后余数还大于0。接下来把余数部位,继续完成下一位的运算。重复直到所有被除数的位都被处理既完成。

相比较于其他运算,除法相对来说开销是很大的,一方面他的每一个商实际上都是试验的结果,并不是直接计算能确定的结果;另一方面他的每一次运算都取决于上一次的运算结果,没法通过硬件实现并行计算。所以如果能提升除法的性能是很有意义的。

我们对于一些特殊的除法运算可以进行如下的优化:比如说一些较小的数的计算,1/1 我们就没有必要从最高位开始loop,用clz指令(可以计算前导0的数目),这样我们就可以避开高位为0的情况,提高计算性能。


代码分析

数字串

SignedString

我们处理有符号和无符号数时主要的区别就是在于最高位所代表的含义是不同的,因此对于正有符号数可以直接按照无符号数处理,负有符号数可以用剩余位的数字进行处理然后最后判断符号填在结果前面就好。

UnsignedString

在处理无符号的数时,这里有两句伪代码 rem + '0'rem - 10 + 'a' 就是根据ascii码进行处理的。

格式串

我们之前提到的 %d 就是一种格式化的输出,格式化字符串的精髓就是各种变参(可以参看这篇博客),甚至可以限制长度、精度等。对于不同的函数,我们手首要确定的关键就是参数,这里我们采用栈来存储参数,对于传入的参数反向压栈,然后依次判断每个字符的含义,从而进行字符串的格式化处理。

进制转换

在这一部分我们将10进制数字转换成其它进制的数字。

mov r4,#0
loop$:
ldr r0,=format
mov r1,#formatEnd-format
ldr r2,=formatEnd
lsr r3,r4,#4
push {r3}
push {r3}
push {r3}
push {r3}
bl FormatString
add sp,#16

注意这里push指令先减栈指针再数据入栈(也有说二者顺序颠倒,结果没有差别主要看CPU设计),然后接下来的工作就将数字进行进制转换。


结果展示