gpt4 book ai didi

assembly - 对多个位进行高效的 assembly 检查

转载 作者:行者123 更新时间:2023-12-02 19:03:41 26 4
gpt4 key购买 nike

我在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com