我的教授给了我一个转换,将这个C代码转换为汇编代码
int k = 0, S = 0;
for (k=0; k<100; k++)
{
if (k%2 == 0)
S += k;
else
S -= k;
}
装配只是我课程的一小部分,所以我们没有涉及很多技术部分。我唯一的问题是模数部分,我们只采用了除法,从未学过如何使用模数。 这是我进入我的工作
MOV CX, 0; counter
MOV AX, 0; This represents S, we haven't learned how to declare variables in assembly, so we use registers instead)
Loop1:
CMP [Haven't done the modulus condition]
JE iftrue
JNE ifwrong
iftrue:
ADD AX, CX
INC CX
CMP CX, 99
JL Loop1
ifwrong:
SUB AX, CX
INC CX
CMP CX, 99
JL Loop1
你能帮助我填写第一个条件吗?如何在比较中使用模数并检查余数是否为0?
P.S。:我还没学会如何在循环中做条件,所以iftrue / ifwrong部分只是我的快速即兴创作,我不知道它是否有效。这部分能以更好的形式完成吗?
答案 0 :(得分:5)
教授通常不会提供涉及您尚未学习的内容的作业。对于外部观察者(例如任何阅读此问题的人),大多数机会是你没有注意,或者你没有意识到正在解释的是实现模数运算的方法。
x86汇编中的模数可以通过除以两个数来获得。你把divident放在某个寄存器中,你执行一些提供除数的指令,并且在指令执行后,一些寄存器接收商,另一个寄存器接收余数。但那是无关紧要的,因为你可能还没有学过除法运算,这没关系,因为我们 不 会使用除法。
在x86程序集中(以及任何其他程序集中),您可以非常轻松地计算除法的余数 2的幂,而无需使用除法运算。 2是2的幂。(2的第1次幂。)
实际上,在2的情况下事情变得更加简单,因为我希望你同意,除以2的其余部分只有两种可能的结果:1或0是不言自明的。
您可能还记得,二进制数字看起来像这样:0011101010
最左边的位是最重要的位,最右边的位是最低位。并且,表示数字的二进制系统的基本属性是,如果将该数字除以2,则数字的最低有效位始终表示您将接收的余数。 (正如在十进制系统中一样,最右边的数字表示如果将该数字除以10,您将收到的余数。)
因此,您需要做的就是将最低有效位与数字隔离开来。这将是0或1,它将代表数字除法的剩余部分。
“确切地说,如何实现这一目标只是为学生留下的练习。”
(试一试,如果你不能这样做,请发布另一个stackoverflow问题。)
关于JE / JNE部分,它实际上是错误的,因为当CX不再小于99时,JL Loop1
指令将落到ifwrong:
标签,这不是你想要的。你应该按如下方式重写它:
JE iftrue
ifwrong: ;unnecessary label, for illustration purposes only
SUB AX, CX
JMP after
iftrue:
ADD AX, CX
JMP after ;unnecessary instruction, for illustration purposes only.
after:
INC CX
CMP CX, 99
JL Loop1
请注意,您并不想要ADD AX, CX
和SUB AX, CX
,您需要ADD AX, MM
和SUB AX, MM
,其中MM
是CX模数2,以及您仍然在弄清楚如何计算。
另请注意,我并未保证CMP CX, 99
后跟JL Loop1
是否正确,您没有问过这个问题,您可能会在以后遇到它,但应该很容易弄清楚
答案 1 :(得分:2)
library(networkD3)
library(htmltools)
browsable(
tagList(
tags$head(
tags$style('
body{background-color: #DAE3F9 !important}
.nodetext{fill: #000000}
.legend text{fill: #FF0000}
')
),
forceNetwork(Links = MisLinks, Nodes = MisNodes,
Source = "source", Target = "target",
Value = "value", NodeID = "name",
Group = "group", opacityNoHover = 1,
fontSize = 12, legend = T, zoom = T)
)
)
根据CX的最后一位设置零标志。在这种情况下,Equal或JZ对应于cx%2 == 0.使用x-1屏蔽是获取模数的特殊情况,仅当x是2的幂时才适用。