我正在查看伪代码:BCD 指令的隐藏力量。以下是网站内容的片段:
那么,让我们来看看AAA是做什么的。这是等效的伪代码(来自英特尔):
IF ((AL AND 0FH) > 9) OR (AF = 1)
THEN
AL = (AL + 6) AND 0FH;
AH = (AH + 1);
AF = 1;
CF = 1;
ELSE
AF = 0;
CF = 0;
FI;enter code here
对于像这样的典型英特尔文档兼容使用,情况确实如此:
mov al,6
add al,9 ;al=15=0Fh
aaa ;al=21=15h => it's in decimal!
上面的算法似乎没有给出代码中注释的结果,所以我假设这里省略了一些步骤。评论声明如下:“al=21=15h => 它是十进制的!”。
我对代码的解释如下:
- 在加法指令之后,存储在 AL 寄存器中的值将是 15 (0Fh)。
- 由于它大于 10,因此将向该值添加 6 并与 0Fh 进行与运算,这将导致 1s 值存储在 AL 寄存器中(“AL = (AL + 6) AND 0FH;”)。AL 寄存器的值现在应该是 05h。
- 该算法将 1 添加到 AH 寄存器,我假设这是结转,因为我们对 AL 寄存器的 4 位进行了与运算和归零(“AH = (AH + 1);”)。
但是,没有提及在运行“AH = (AH + 1);”行之前存储在 AH 寄存器中的值。如果它被初始化为零,它只适用于 20 以下的数字。现在假设它被初始化为零,我希望结果存储为 AH=1 和 AL=5,但注释说“;al =21=15h => 是十进制的!”。似乎在执行这段代码之前和之后做了其他事情。
你能向我解释一下我在这里缺少什么吗?
另外,这里如何使用 CF/AF 标志?
- 我知道当第 3 位有进位时设置了 AF 标志。这是否用于调整 AL 寄存器以使其存储评论中提到的 15h 值?如前所述,该算法似乎确实表明十位值存储在 AH 寄存器中,而个位值存储在 AL 寄存器中。
- 为什么在这里设置CF?这是从 MSB 结转的,但我在这个特定的添加/转换中看不到任何结转。我希望在溢出之类的情况下设置它。