计算机接口与通信作业(汇编)
原文刊登在 https://github.com/rsy56640/Assignment-in-WHUISS/blob/master/Other/Asm-AS/README.md
访问 github 时请在 url 后加上
?ts=4
使得 tab 表示 4 个空格。
1. 求100以内所有质数
注意到若 n n n 不是质数,则 ∃ q ≤ n , s . t . q ∣ n \exist q\le \sqrt{n},\quad s.t.\ q|n ∃q≤n,s.t. q∣n,所以写了一个简易的计算 i n t ( n ) int(\sqrt{n}) int(n) 的函数。
2. 计算前30位斐波那契数(使用16位寄存器,注意溢出,每次输出一位数字)
基本计算方法: ( a , b ) = ( b , a + b ) (a,b) = (b, a+b) (a,b)=(b,a+b),不断迭代(交换 a , b a,b a,b 时采用3次异或运算)
a
,
b
a,b
a,b 均使用2个16位寄存器拼成32位寄存器模拟加法,每一轮都将
a
a
a 的低16位和高16位送去 print_fib PROC
打印。
x
,
y
x,y
x,y 分别表示高16位和低16位,将其表示为十进制:(注意到
0
≤
x
,
y
≤
65535
0 \le x,y \le 65535
0≤x,y≤65535)
x
=
x
4
∗
1
0
4
+
x
3
∗
1
0
3
+
x
2
∗
1
0
2
+
x
1
∗
1
0
1
+
x
0
∗
1
0
0
y
=
y
4
∗
1
0
4
+
y
3
∗
1
0
3
+
y
2
∗
1
0
2
+
y
1
∗
1
0
1
+
y
0
∗
1
0
0
r
e
s
u
l
t
=
x
⋅
2
16
+
y
=
65536
x
+
y
\begin{aligned} & x = x_4*10^4 + x_3*10^3 + x_2*10^2 + x_1*10^1 + x_0*10^0 \\ & y = y_4*10^4 + y_3*10^3 + y_2*10^2 + y_1*10^1 + y_0*10^0 \\ & result = x \cdot 2^{16} + y = 65536x + y \\ \end{aligned}
x=x4∗104+x3∗103+x2∗102+x1∗101+x0∗100y=y4∗104+y3∗103+y2∗102+y1∗101+y0∗100result=x⋅216+y=65536x+y
将表达式展开得:
exponent | coefficient |
---|---|
1 0 8 10^8 108 | 6 x 4 6x_4 6x4 |
1 0 7 10^7 107 | 5 x 4 + 6 x 3 5x_4+6x_3 5x4+6x3 |
1 0 6 10^6 106 | 5 x 4 + 5 x 3 + 6 x 2 5x_4+5x_3+6x_2 5x4+5x3+6x2 |
1 0 5 10^5 105 | 3 x 4 + 5 x 3 + 5 x 2 + 6 x 1 3x_4+5x_3+5x_2+6x_1 3x4+5x3+5x2+6x1 |
1 0 4 10^4 104 | 6 x 4 + 3 x 3 + 5 x 2 + 5 x 1 + 6 x 0 + y 4 6x_4+3x_3+5x_2+5x_1+6x_0+y_4 6x4+3x3+5x2+5x1+6x0+y4 |
1 0 3 10^3 103 | 6 x 3 + 3 x 2 + 5 x 1 + 5 x 0 + y 3 6x_3+3x_2+5x_1+5x_0+y_3 6x3+3x2+5x1+5x0+y3 |
1 0 2 10^2 102 | 6 x 2 + 3 x 1 + 5 x 0 + y 2 6x_2+3x_1+5x_0+y_2 6x2+3x1+5x0+y2 |
1 0 1 10^1 101 | 6 x 1 + 3 x 0 + y 1 6x_1+3x_0+y_1 6x1+3x0+y1 |
1 0 0 10^0 100 | 6 x 0 + y 0 6x_0+y_0 6x0+y0 |
这样我们直接计算每一位的值,与此同时维护2个进位器(因为有可能进不止1位)
为了加速计算过程,使用了4个临时变量来储存中间结果:
var | value |
---|---|
temp0 | 3 x 0 , 5 x 0 , 3 x 4 , 5 x 4 3x_0,\ 5x_0,\ 3x_4,\ 5x_4 3x0, 5x0, 3x4, 5x4 |
temp1 | 3 x 1 , 5 x 1 3x_1,\ 5x_1 3x1, 5x1 |
temp2 | 3 x 2 , 5 x 2 3x_2,\ 5x_2 3x2, 5x2 |
temp3 | 3 x 3 , 5 x 3 3x_3, 5x_3 3x3,5x3 |
value 的变化表示在不同时期缓存的不同值。
红色圈表示在计算这个值的过程中将其缓存,缓存的取值为红笔标注的值。
打印时先找到第一个非0数字,然后依次打印每一个数字即可。
3. 八皇后
基本思路:用一个长度为8的一维数组来表示位置,即 queen[i]
表示第i列的皇后位于第几行。递归地尝试每一个可能值,注意递归时要记录之前的状态。