热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

装配x86中的模数

如何解决《装配x86中的模数》经验,为你挑选了1个好方法。

我的教授给了我一个转换,将这个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?

PS:我还没学会如何在循环中做条件,所以iftrue/ifwrong部分只是我的快速即兴创作,我不知道它是否有效.那部分可以以更好的形式完成吗?



1> Mike Nakis..:

教授通常不会提供涉及您尚未学习的内容的作业.对于外部观察者(例如任何阅读此问题的人),大多数机会是你没有注意到,或者你没有意识到正在解释的是实现模数运算的一种方法.

x86组件中的模数可以通过除以两个数来获得.你把divident放在某个寄存器中,你执行一些提供除数的指令,并且在指令执行后,一些寄存器接收商,另一个寄存器接收余数.但那是无关紧要的,因为你可能还没有学过分裂操作,这没关系,因为我们打算使用除法.

在x86程序集中(以及任何其他程序集中),您可以非常轻松地计算除法的余数除以2的幂,而无需使用除法运算.2是2的幂.(2的1次方)

实际上,在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, CX并且SUB AX, CX,您想要ADD AX, MMSUB AX, MM,MMCX模数2 在哪里,以及您仍在计算如何计算的过程中.

另请注意,我没有担心CMP CX, 99后面JL Loop1是否正确,你没有问过这个,你可能会在以后遇到它,但它应该很容易弄明白.


`SHR MM,1`是一种方法,但是你会暂时需要一个额外的寄存器(比方说,DX),因为你不想转移CX,因为你不想破坏它的价值.Aki Suihkonen建议的"TEST CX,1"指令是一个更好的选择,因为它在不改变任何东西的情况下测试第0位.`MOV MM,CX`不起作用,因为`MOV`指令不修改标志寄存器,因此不会设置奇偶校验标志.
推荐阅读
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • 使用圣杯布局模式实现网站首页的内容布局
    本文介绍了使用圣杯布局模式实现网站首页的内容布局的方法,包括HTML部分代码和实例。同时还提供了公司新闻、最新产品、关于我们、联系我们等页面的布局示例。商品展示区包括了车里子和农家生态土鸡蛋等产品的价格信息。 ... [详细]
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
  • 本文介绍了在go语言中利用(*interface{})(nil)传递参数类型的原理及应用。通过分析Martini框架中的injector类型的声明,解释了values映射表的作用以及parent Injector的含义。同时,讨论了该技术在实际开发中的应用场景。 ... [详细]
  • 本文整理了Java中org.gwtbootstrap3.client.ui.Icon.addDomHandler()方法的一些代码示例,展示了Icon.ad ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • 本文整理了Java中com.evernote.android.job.JobRequest.getTransientExtras()方法的一些代码示例,展示了 ... [详细]
author-avatar
手机用户2502873837
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有