TXPH 发布于十一月 19, 2021 分享 发布于十一月 19, 2021 (已修改) · 只看该作者 其实是汇编语言相关来着 题目是 输入一个数字n, 让n除q,q=2,如果有余数,则q+1,直到没有余数为止,提取q。 问题是现在就学了一小部分,很多东西都还不会(也不让用),就想不出来 图是目前为止可用的指令。 十一月 19, 2021,由TXPH修改 链接到点评
leideniyifan 发布于十一月 19, 2021 分享 发布于十一月 19, 2021 (已修改) · 只看该作者 我记得没错的话计算机中的乘除法实际上很多都是通过位运算来执行的,也就是mod2的各种次冥 比如: x*4=x*2² 将x执行向左两位的运算 复杂一些的用分配率拆开后计算,比如: x*233=x*128+x*64+x*32+x*8+x 将各部分做位运算后相加 所以说这个问题也许可以反过来,通过乘以各种位置的猛1浮点小数来实现位运算即除法的运算? 但取余我就不知道怎么处理了,汇编是有条件码的,但这个和位运算都不能用,再加上都是象牙塔里学的早忘光光了,寄了 十一月 19, 2021,由leideniyifan修改 注释 Eternalcycle 30.00节操 带动讨论 链接到点评
jas 发布于十一月 19, 2021 分享 发布于十一月 19, 2021 (已修改) · 只看该作者 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++ 十一月 20, 2021,由jas修改 链接到点评
管理员 萨卡 发布于十一月 19, 2021 管理员 分享 发布于十一月 19, 2021 · 只看该作者 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和一个循环不就够了么。。。 链接到点评
GMRK 发布于十一月 20, 2021 分享 发布于十一月 20, 2021 · 只看该作者 贴主是汇编啊,三楼python跑题了啊 话说贴主这给的指令也太少了,一堆没用的读写指令,运算就加减乘,这是让学生自己搭建数学大厦吗 另外就个人经验而言“不让用”这种都只是幌子,你真的把命令都查一遍学会了,用DIV或者IDIV做出来老师也不会说啥吧 链接到点评
921836774 发布于十一月 20, 2021 分享 发布于十一月 20, 2021 (已修改) · 只看该作者 假设数字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中 这个指令你表里也没有,不过没有这个的话,你怎么退出指令的? 十一月 20, 2021,由921836774修改 921836774水回不料路遇小白,被乱刀砍死.-4节操 注释 Eternalcycle 40.00节操 带动讨论 链接到点评
921836774 发布于十一月 20, 2021 分享 发布于十一月 20, 2021 · 只看该作者 3 分钟前, GMRK 说道: 贴主是汇编啊,三楼python跑题了啊 话说贴主这给的指令也太少了,一堆没用的读写指令,运算就加减乘,这是让学生自己搭建数学大厦吗 另外就个人经验而言“不让用”这种都只是幌子,你真的把命令都查一遍学会了,用DIV或者IDIV做出来老师也不会说啥吧 只有加减乘,连JL都没有,真的能算出来最小因子吗…… 链接到点评
管理员 萨卡 发布于十一月 20, 2021 管理员 分享 发布于十一月 20, 2021 · 只看该作者 1 小时前, 921836774 说道: 假设数字n的地址是[N] 假设MOVE RA RB的意思为将RB的值对滴RA 假设SUB/MUL/ADD RA RB的意思是计算相应的四则运算,并将结果存放在RB中 他这只是学习用的假设指令。。寄存器只有A和B 没有任何其他质量因为指望直接用JUMPIFZERO. 而JUMPIFZERO只检查上个+-*的结果是不是0, 没有任何其他东西了. k是行数,估计把output放最后一行就到那结束 链接到点评
921836774 发布于十一月 20, 2021 分享 发布于十一月 20, 2021 · 只看该作者 3 小时前, 萨卡 说道: 他这只是学习用的假设指令。。寄存器只有A和B 没有任何其他质量因为指望直接用JUMPIFZERO. 而JUMPIFZERO只检查上个+-*的结果是不是0, 没有任何其他东西了. k是行数,估计把output放最后一行就到那结束 他是有MOVE指令的 没说只有AB两个寄存器吧 然后只有+-* ,能求出最小因子吗 链接到点评
jas 发布于十一月 20, 2021 分享 发布于十一月 20, 2021 (已修改) · 只看该作者 试着用题目指令写了下,假设输入位于地址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 十一月 20, 2021,由jas修改 注释 Eternalcycle 40.00节操 链接到点评
管理员 萨卡 发布于十一月 20, 2021 管理员 分享 发布于十一月 20, 2021 · 只看该作者 1 小时前, 921836774 说道: 他是有MOVE指令的 没说只有AB两个寄存器吧 然后只有+-* ,能求出最小因子吗 因为只有MOVEA和MOVEB是写入寄存器AB的,MOVE只是复制内存位置的值不是寄存器。 没除法所以只能通过n-i*q==0了,前面算后如果是0 JUMPIFZERO就会转跳。。基本就这样了 链接到点评
921836774 发布于十一月 20, 2021 分享 发布于十一月 20, 2021 · 只看该作者 3 小时前, 萨卡 说道: 因为只有MOVEA和MOVEB是写入寄存器AB的,MOVE只是复制内存位置的值不是寄存器。 没除法所以只能通过n-i*q==0了,前面算后如果是0 JUMPIFZERO就会转跳。。基本就这样了 这样怎么判断i*q已经大于n了 链接到点评
jas 发布于十一月 20, 2021 分享 发布于十一月 20, 2021 (已修改) · 只看该作者 3 小时前, 921836774 说道: 这样怎么判断i*q已经大于n了 n-1, n-2, ... n-i*q+1 之一等于零 十一月 20, 2021,由jas修改 链接到点评
TXPH 发布于十一月 20, 2021 作者 分享 发布于十一月 20, 2021 · 只看该作者 15 小时前, GMRK 说道: 贴主是汇编啊,三楼python跑题了啊 话说贴主这给的指令也太少了,一堆没用的读写指令,运算就加减乘,这是让学生自己搭建数学大厦吗 另外就个人经验而言“不让用”这种都只是幌子,你真的把命令都查一遍学会了,用DIV或者IDIV做出来老师也不会说啥吧 就,如果有DIV的会简单很多,但就只给了这么一张表 链接到点评
TXPH 发布于十一月 20, 2021 作者 分享 发布于十一月 20, 2021 · 只看该作者 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++ 这边都不让用呀,其实另一节课都学了,这些都会的,但这节课没学那么多,就只让用手写一步一步列出来 大概就是WRITE 0 A MOVE A 0 MOVE B 1 ADD SAVE 3 OUTPUT 3 这个样子的。。 链接到点评
jas 发布于十一月 20, 2021 分享 发布于十一月 20, 2021 · 只看该作者 2 小时前, TXPH 说道: 这边都不让用呀,其实另一节课都学了,这些都会的,但这节课没学那么多,就只让用手写一步一步列出来 大概就是WRITE 0 A MOVE A 0 MOVE B 1 ADD SAVE 3 OUTPUT 3 这个样子的。。 3l只是我的思路,简单起见就用python描述了。10l有翻译成题目给的指令 链接到点评
921836774 发布于十一月 20, 2021 分享 发布于十一月 20, 2021 · 只看该作者 10 小时前, jas 说道: n-1, n-2, ... n-i*q+1 之一等于零 懂了…… 链接到点评
推荐贴