作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 AX 中有一些值,需要一次检查多个位。假设我想检查第一位和最后一位,其他位是 DC 值。这就是我所做的,但是效率很低,因为我要多次检查不同的值。
AND AX,8001H
CMP AX,8001H
JE
我只考虑过基于奇偶校验的 AND 运算和跳转,但使用 MASM 奇偶校验仅适用于前 8 位,所以...
最佳答案
要测试这两个位是否都已设置,恐怕您总是需要两条指令(不包括条件跳转)。你自己的方法占用6个字节:
25 01 80 AND AX,8001H
3D 01 80 CMP AX,8001H
您可以使用NOT
来保存一个字节;它反转所有位(使得 CMP
不必要),并且它的大小只有 2 个字节。
F7 D0 NOT AX
25 01 80 AND AX,8001H
如果指令在循环中执行多次,并且您有一个空闲寄存器,那么您可以保存另一个字节。代码总量较多,但因为可以将部分代码保留在循环之外,所以速度应该会稍快一些。
BB 01 80 MOV BX,8001H ; keep this outside the loop
... ...
F7 D0 NOT AX
21 D8 AND AX,BX
编辑:最后一种改进的可能性。如果您总是测试一个或多个位的设置,那么您可能希望在整个函数中(甚至可能在整个程序中)翻转零和一的含义。没有法律禁止将零定义为真,将一定义为假。 (在数字电路中,您实际上经常看到这种情况。)然后您可以删除 NOT AX
,从而再节省两个字节。此外,您可以将 AND
替换为非破坏性的 TEST
,从而允许您执行多个测试,而无需保存和恢复 AX
。为了判断这在您的特定情况下是否可行,我必须查看您的更多代码。
关于assembly - 对多个位进行高效的 assembly 检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21340538/
我是一名优秀的程序员,十分优秀!