假设数字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中 这个指令你表里也没有,不过没有这个的话,你怎么退出指令的?