我正在尝试编写一个程序,它将执行二进制签名的浮点乘法/除法。我需要使用一个特定的算法(从乘数的msb开始并将被乘数移到右边),我不应该使用IMUL或IDIV。我在循环中尝试做的是:
for(i; i<sizeOfY; i++) {
tmp = getBitOfY[i]
if (tmp==1) {
//do something
} else {
do something else
}
}
所以,我想得到每一点,看看它是1还是0并转移到所需的方向,然后添加。那么如何在每一步获得所需的位?或者我的方法是错的?
答案 0 :(得分:2)
当你使用程序集来提高速度时,你也需要快速的位掩码。据我所知,8086没有桶形移位器 - 这意味着,为多个位置移位一点需要每个移位周期的时间,因为这是在微码中完成的。具有桶形移位器的更现代的CPU可以使用相同数量的时钟移动任意数量的位置。因此,您可以更快地创建一个查找表,其中位掩码存储为表元素,使用位号作为表的索引。为了获得该特定数字,您可以使用位数从表中读取位掩码,然后屏蔽您正在测试的值。
如果您不是因为速度而无法隔离位,那么请不要使用程序集。运行循环你也可以使用脚本语言:)
哦,我应该提一下,8086 SHL指令有一个变量,允许按CL寄存器中指定的位置数进行移位。
但是 - 为了你的目的,你不需要以这种方式提取位 - 似乎足以简单地将它们逐个移出,不涉及掩蔽。问题的标题&#34;如何在8086汇编中获取二进制数的特定位?&#34;建议您提出其他问题,而不是您真正想知道的事情: 当它们从寄存器中移出时,只需捕获这些位。如何捕获它们,您可以从SHR指令对条件代码寄存器的影响中获取。查看哪些标志受影响,以及它们如何受到影响。
这里没有代码,因为您接触到的这些人为约束表明您希望自己解决实际的实施问题。
顺便说一下,这个; &#34;从乘数的msb开始,将被乘数移到右边&#34;只有部分意义。从LSB开始,您想要向右移动。从MSB开始时,向左移位,以便在移位时这些位从寄存器中丢失。