assembly - assembly 模数 x86

标签 assembly x86 modulus

我的教授给我布置了一个作业,将这个 C 代码转换成汇编代码

int k = 0, S = 0;
for (k=0; k<100; k++)
{
if (k%2 == 0)
S += k;
else
S -= k;
}

汇编只是我类(class)的一小部分,所以我们没有涉及很多技术部分。我唯一的问题是模数部分,我们只学过除法,从来没有学会如何使用模数。 这是我工作的全部内容

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 部分只是我的一个快速即兴创作,我不知道它是否有效。这部分能否以更好的形式完成?

最佳答案

教授通常不会布置涉及您尚未学过的东西的作业。对于外部观察者(例如阅读此问题的任何人),大多数可能是您没有注意,或者您没有意识到所解释的是实现模运算的一种方法。

x86 汇编中的模数可以通过两个数相除得到。你把被除数放在某个寄存器中,你执行一些提供除数的指令,在指令执行后某个寄存器接收商,另一个寄存器接收余数。但这无关紧要,因为您可能还没有学习除法运算,没关系,因为我们不会使用除法。

在 x86 汇编(以及与此相关的任何其他汇编)中,您可以很容易地计算除法的余数除以 2 的幂,而无需使用除法运算。 And 2 is a power of 2. (The 1st powder of 2.)

实际上,对于 2,事情变得更加简单,因为我希望您同意,除以 2 的余数只有两种可能的结果是不言而喻的:1 或 0。

您可能还记得,二进制数字看起来像这样:0011101010 最左边的位是最高有效位,最右边的位是最低有效位。表示数字的二进制系统的一个基本属性是,数字的最低有效位始终表示将该数字除以 2 后得到的余数。 (就像在十进制系统中一样,最右边的数字代表该数字除以 10 后的余数。)

因此,您需要做的就是从数字中分离出最低有效位。这将是 0 或 1,表示数字除以 2 的余数。

“具体如何实现这一点留给学生作为练习。”

(试一试,如果做不到,请发布另一个 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, CXSUB AX, CX,您需要 ADD AX, MMSUB AX, MM,其中 MM 是 CX 模数 2,您仍在研究如何计算它。

另请注意,我不保证 CMP CX, 99 后接 JL Loop1 是否正确,您没有问过,您可能会遇到它稍后,但应该很容易弄清楚。

关于assembly - assembly 模数 x86,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43954294/

相关文章:

java - 组合的模

assembly - 使用 ".intel_syntax noprefix"如何获取标签的内存地址?

assembly - 汇编器是否应该不满足我对 ret imm16 的请求?

assembly - 无法在 FASM 或 NASM 中使用 wprintf 打印 Unicode 字符串

assembly - 汇编语言中的大于、小于或等于?

java - Java中使用数组反转数字

java - 为什么 anyValue 是 double 值时 Sonar 中的 anyValue % 1 "silly math"?

assembly - 为什么要使用 “movl $1, %eax”而不是 “movb $1, %eax”

macos - 用户输入和输出在我的汇编代码中不起作用

xcode - 如何在 Mac 框架中调用 cpuid 指令?