-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathgcd.txt
78 lines (59 loc) · 1.97 KB
/
gcd.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#<python代码:求最大公约数>
# def GCD(x,y):
# if x < y:
# x,y = y,x
# if x%y == 0:
# return (y)
# return GCD(x%y,y)
# a = 48 # 用户自己修改
# b = 20 # 用户自己修改
# print (GCD(a,b))
#主函数有两个局部变量,分别是a = 48, b = 20
#求这两个数的最大公约数,并将结果保存到寄存器R1中
#<汇编代码:Eclid's算法求两个数的最大公约数>
move R15, 10000 #用寄存器R15表示fp,将基地址设为10000
move sp, R15 #设置当前栈顶位置
move R2, 48 # a的初始值为48
move R3, 20 # b的初始值为20
#move R2, 49 # a = 49
#move R3, 59 # b = 59
#move R2, 569
#move R3, 784
push R3 # 传参数b=48
push R2 # 传参数a=20
call Lgcd #调用求最大公约数函数Lgcd
goto Lprint #打印结果
Lgcd: #gcd(x,y),调用时会执行push pc
push R15 #push旧的fp值进入栈空间,函数执行完后再pop出来
move R15,sp # 新的fp等于sp
push R2 #将局部变量R2 push进栈内
push R3 #将局部变量R3 push进栈内
push R4 #将局部变量R4 push进栈内
push R5 #将局部变量R5 push进栈内
load R2, 02(R15) # 设置局部变量值R2 = a
load R3, 03(R15) # 设置局部变量值R3 = b
slt R4,R2,R3 #比较R2与R3的大小,使得R2存大值,R3存小值,R4保存R2与R3比较大小后的结果
beqz R4, Lmod # 如果R4为0,说明R2 >= R3,此时跳转到Lmod函数,求它们的模
load R2, 03(R15) # 如果R4为1,此时顺序执行,交换R2与R3的值,使得R2始终保存大值
load R3, 02(R15) # 交换R2与R3的值,使得R3始终存储小值
Lmod: #求模,将求模的结果保存在R4中
div R5,R2,R3 # R5 = R2//R3
mul R5,R5,R3 # R5 = R5*R3
sub R4,R2,R5 # R2与R3求模之后的结果保存在R4中
beqz R4,L1 #如果R4的值为0,说明已经得到最大公约数,对应Python代码中if x%y == 0: return y,此时跳转到L1将最终的结果保存到R1中
push R3 #如果R4为1,再次调用Lgcd函数,首先应该传递参数
push R4
call Lgcd #再次调用Lgcd函数
goto Lreturn #调用结束后执行return操作
L1: #保存最大公约数
move R1,R3 #将R3的值赋值给R1
Lreturn: # Lgcd函数返回语句应该做的操作
pop R5
pop R4
pop R3
pop R2
move sp,R15 #sp = fp
pop R15 #重设fp的值,成为旧的fp
ret #pop pc
Lprint: #打印输出结果,输出结果保存在R1中
_pr R1