嘿,我知道我问了很多问题..但是谷歌上没有太多关于这方面的资源,所以希望这能帮助 future 尝试做类似项目的人,我也总是谷歌解决方案,但我从来没有搜索过第一页。
我看了亚历克斯发布的英特尔手册,对我来说似乎很陌生 http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-vol-2a-2b-instruction-set-a-z-manual.html
所以我想我知道一个简单的DIV
操作码是如何工作的。因为它毕竟只是除
。
我毫无困难地添加了 ADD
、SUB
,当然 IMUL
遇到了问题,你们帮我解决了这个问题。就难度而言,DIV
似乎与 IMUL
属于同一类别。
不用使用手册,只需使用 OllyDbg 进行自调试测试即可。
我发现除法的答案总是存储在EAX
中。谁知道剩下的部分也被保存在 EDX
中。
从研究这个算法来看,这是非常重要的,谁知道,有人会使用随机数除法的余数来生成 0-10 的切换,非常聪明。.但仍然是我的问题。
这已经很奇怪了,我从来没有想过除以十六进制数会有余数小数点甚至不属于其中。
DIV ECX
就像
regs.d.eax /= regs.d.ecx;
regs.d.edx = regs.d.eax % regs.d.ecx;
我在想也许先得到余数..会让事情变得简单。
regs.d.edx = regs.d.eax % regs.d.ecx;
regs.d.eax /= regs.d.ecx;
好吧,我很少使用数学编程,所以这对我来说有点困惑。我更像是一个将结果存储在字符串中然后按小数点分割的人,这就是我得到余数的方法是的,我知道它很慢并且它采取了简单的路径..我自己反对使用字符串数学代码中的运算。
好吧..看看我放在那里的C代码..可能必须在临时变量中发生除法之前存储EAX
和ECX
..或者执行以下操作首先是余数代码,然后是除法代码。我不知道。
好吧,我会看看也许你们可以为我提供一个更好的答案,也许它不能在一行中完成,但也许我犯了一些错误..由于很多原因,我无法真正测试我现在所做的事情在编译软件之前我还必须解决其他问题。
最佳答案
这些手册确实不容易阅读,但它们包含了您问题的所有答案(嗯,其中大多数,文档中偶尔会有遗漏和错误)。
您在猜测的算法中遗漏的一件事是,DIV 通常将 2N 位除以 N 位,也就是说,当您执行 DIV ECX
时,您会除 EDX 中包含的 64 位无符号值:EAX 为 ECX 中的 32 位无符号值。然后商存储在 EAX 中,余数存储在 EDX 中。
您还应该记住除法溢出的可能性(在这种情况下 EDX>=ECX 是其条件)以及指令在 EFLAGS 寄存器中修改的标志。
关于c - 汇编 如何将操作码 DIV 转换为 C 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7766137/