转跳到内容

又来问作业了(计算机相关)


TXPH

推荐贴

其实是汇编语言相关来着

题目是 输入一个数字n, 让n除q,q=2,如果有余数,则q+1,直到没有余数为止,提取q。

问题是现在就学了一小部分,很多东西都还不会(也不让用),就想不出来:NEKOMIMI_PARADISE_27: 图是目前为止可用的指令。

594822b419a4d439.png

,由TXPH修改
链接到点评

我记得没错的话计算机中的乘除法实际上很多都是通过位运算来执行的,也就是mod2的各种次冥

比如:

x*4=x*2² 将x执行向左两位的运算

 

复杂一些的用分配率拆开后计算,比如:

x*233=x*128+x*64+x*32+x*8+x 将各部分做位运算后相加

 

 

所以说这个问题也许可以反过来,通过乘以各种位置的猛1浮点小数来实现位运算即除法的运算?

但取余我就不知道怎么处理了,汇编是有条件码的,但这个和位运算都不能用,再加上都是象牙塔里学的早忘光光了,寄了:mx059:

,由leideniyifan修改
注释
Eternalcycle Eternalcycle 30.00节操 带动讨论
链接到点评

IF条件只有等于零,没有大于/小于零?貌似只能一个个数~

a=input()
assert(a>=2)
b=2
i=1

while true:
   if a - i * b == 0: # 能整除,当前的b即为所求的q
      return b
   for j in range(1,b):
      if a - i * b - j == 0: # 不能整除, 检查下一个b值
         b++
         i=0
         break
   else: # i不够大,除法没模拟完
  	  i++ 
,由jas修改
链接到点评
  • 管理员
2 小时前, jas 说道:

IF条件只有等于零,没有大于/小于零?貌似只能一个个数~

a=input()
assert(a>=2)
b=2
i=1

while true:
   if a - i * b == 0: # 能整除,当前的b即为所求的q
      return b
   for j in range(1,b):
      if a - i * b - j == 0: # 不能整除, 检查下一个b值
         b++
         i=0
         continue
   else: # i不够大,除法没模拟完
  	  i++ 

有点乱。。。基本就一个if和一个循环不就够了么。。。

链接到点评

贴主是汇编啊,三楼python跑题了啊:mx051:

话说贴主这给的指令也太少了,一堆没用的读写指令,运算就加减乘,这是让学生自己搭建数学大厦吗:YangTuo_u:

另外就个人经验而言“不让用”这种都只是幌子,你真的把命令都查一遍学会了,用DIV或者IDIV做出来老师也不会说啥吧:mx014:

链接到点评

假设数字n的地址是[N]

假设MOVE RA RB的意思为将RB的值对滴RA

假设SUB/MUL/ADD RA RB的意思是计算相应的四则运算,并将结果存放在RB中

 

    1. MoveA [N] //将地址n对应的数字移动到寄存器A。 也可以用 MOVE %rdx, [N]代替

    2. MOVEB 2 //将寄存器B的值设置为2(p)。 也可以用 MOVE %rax, 2代替(这样假设了存放返回值的寄存器为%rax)

3. .ADDP //设置跳转标记,这是外层循环,累加p,之后跳转到这里(理解为循环吧)

    4. INCREAMENT %rax // ++p

    5. MOVE %rsi %rax //int i = p

    6. SUB %rdx %rsi // i -= n

    7. JUMPIFZERO .RET //如果p == n,说明n为质数

8. .SETMUL //设置内层循环,累乘

    9. MOVE %rcx 1 //将寄存器%rcx的值设为1,用于存放乘积(int mul = 1;)

    10. MOVE %rdi 0 //int sub = 0,用%rdi存放n - i * p(最后的余数)

11. .MULIP

    12. MUL %rax %rcx //mul *= p,这里假设了乘积会存放在第二个寄存器(%rcx)中

    13. MOVE %rdi %rdx // sub = n,将%rdx的值更新为n

    14. SUB %rcx %rdi // sub -= mul,这里同样假设了减法结果会存放在第二个寄存器(%rdi)中

    15. JL .ADDP //若差小于0,则++p 这里用了你没给到的指令

    16. JUMPIFZERO .RET //若差为0,则说明找到了p

17. .RET

     18. RET //返回。 p存放在%rax中 这个指令你表里也没有,不过没有这个的话,你怎么退出指令的? 

,由921836774修改

921836774水回不料路遇小白,被乱刀砍死.-4节操

注释
Eternalcycle Eternalcycle 40.00节操 带动讨论
链接到点评
3 分钟前, GMRK 说道:

贴主是汇编啊,三楼python跑题了啊:mx051:

话说贴主这给的指令也太少了,一堆没用的读写指令,运算就加减乘,这是让学生自己搭建数学大厦吗:YangTuo_u:

另外就个人经验而言“不让用”这种都只是幌子,你真的把命令都查一遍学会了,用DIV或者IDIV做出来老师也不会说啥吧:mx014:

只有加减乘,连JL都没有,真的能算出来最小因子吗……

链接到点评
  • 管理员
1 小时前, 921836774 说道:

假设数字n的地址是[N]

假设MOVE RA RB的意思为将RB的值对滴RA

假设SUB/MUL/ADD RA RB的意思是计算相应的四则运算,并将结果存放在RB中

他这只是学习用的假设指令。。寄存器只有A和B

没有任何其他质量因为指望直接用JUMPIFZERO. 而JUMPIFZERO只检查上个+-*的结果是不是0, 没有任何其他东西了.

k是行数,估计把output放最后一行就到那结束

链接到点评
3 小时前, 萨卡 说道:

他这只是学习用的假设指令。。寄存器只有A和B

没有任何其他质量因为指望直接用JUMPIFZERO. 而JUMPIFZERO只检查上个+-*的结果是不是0, 没有任何其他东西了.

k是行数,估计把output放最后一行就到那结束

他是有MOVE指令的 没说只有AB两个寄存器吧 然后只有+-* ,能求出最小因子吗

链接到点评

试着用题目指令写了下,假设输入位于地址N,输出保存到地址RESULT

地址Q、TEMP_IQ、INC_Q等大概要换成100、101、200这样的数字

也许可行的优化:如果 q - j == 0 ,就认定n是质数,提前输出n自己

line		op		(num ,)address	comments
						
INIT		WRITE		2,Q		初始化
		WRITE		1,I		
		WRITE		0,J				
						
START		MOVEA		I		以下:检查n - i * q + j == 0 是否成立
		MOVEB		Q		
		MULT				
		SAVE		TEMP_IQ		
						
		MOVEA		N		
		MOVEB		TEMP_IQ		
		SUB				
		JUMPIFZERO	FINISH		n - i * q == 0成立,程序结束
		SAVE		TEMP_N-IQ		
						
		MOVEA		J		以下:对j属于[1-q,-1],检查n - i * q + j == 0 能否成立
		MOVEB		Q		
		SUB				
		SAVE		J		
						
		MOVEA		J		
INC_J		INC				
		JUMPIFZERO	INC_I		j遍历结束
		SAVE		J		
						
		MOVEA		J		
		MOVEB		TEMP_N-IQ		
		ADD				
		JUMPIFZERO	INC_Q		n - i * q + j == 0 成立,检查下一个q
		JUMP		INC_J		继续遍历j
						
						
INC_Q		MOVEA		Q		
		INC				
		SAVE		Q		
		WRITE		1,I		
		JUMP		START		
						

INC_I		MOVEA		I		
		INC				
		SAVE		I		
		JUMP		START		
						
						
FINISH		MOVE		Q,RESULT		存入地址RESULT

 

,由jas修改
注释
Eternalcycle Eternalcycle 40.00节操
链接到点评
  • 管理员
1 小时前, 921836774 说道:

他是有MOVE指令的 没说只有AB两个寄存器吧 然后只有+-* ,能求出最小因子吗

因为只有MOVEA和MOVEB是写入寄存器AB的,MOVE只是复制内存位置的值不是寄存器。

没除法所以只能通过n-i*q==0了,前面算后如果是0 JUMPIFZERO就会转跳。。基本就这样了

链接到点评
15 小时前, GMRK 说道:

贴主是汇编啊,三楼python跑题了啊:mx051:

话说贴主这给的指令也太少了,一堆没用的读写指令,运算就加减乘,这是让学生自己搭建数学大厦吗:YangTuo_u:

另外就个人经验而言“不让用”这种都只是幌子,你真的把命令都查一遍学会了,用DIV或者IDIV做出来老师也不会说啥吧:mx014:

就,如果有DIV的会简单很多,但就只给了这么一张表:NEKOMIMI_PARADISE_27:

链接到点评
19 小时前, jas 说道:

IF条件只有等于零,没有大于/小于零?貌似只能一个个数~

a=input()
assert(a>=2)
b=2
i=1

while true:
   if a - i * b == 0: # 能整除,当前的b即为所求的q
      return b
   for j in range(1,b):
      if a - i * b - j == 0: # 不能整除, 检查下一个b值
         b++
         i=0
         break
   else: # i不够大,除法没模拟完
  	  i++ 

这边都不让用呀,其实另一节课都学了,这些都会的,但这节课没学那么多,就只让用手写一步一步列出来:mx040:

 

大概就是WRITE 0 A

              MOVE A 0

              MOVE B 1

              ADD

              SAVE 3

              OUTPUT 3 

这个样子的。。

链接到点评
2 小时前, TXPH 说道:

这边都不让用呀,其实另一节课都学了,这些都会的,但这节课没学那么多,就只让用手写一步一步列出来:mx040:

 

大概就是WRITE 0 A

              MOVE A 0

              MOVE B 1

              ADD

              SAVE 3

              OUTPUT 3 

这个样子的。。

3l只是我的思路,简单起见就用python描述了。10l有翻译成题目给的指令

链接到点评
  • 骚男锁定了本主题
游客
此主题已关闭。
×
×
  • 新建...

重要消息

为使您更好地使用该站点,请仔细阅读以下内容: 使用条款