我在理论上在高中学习 ASM 8086。(这意味着我在笔记本上学习 ASM 8086,而从未在计算机上运行它)。
而且我不明白 - 如果我这样做会发生什么:
MOV AL, F2h
ADD AL, 20h
电脑会做什么?(AL、AX、CF、ZF 的值是多少?)
如果我这样做会发生什么:
MOV AH,F2h
ADD AH,20h
谢谢 !!
MOV AL, F2h
将值 0xF2 放入 AL(累加器)寄存器。
ADD AL, 20h
将值 0x20 添加到 AL 寄存器中包含的值。
AL 将是 0xF2 + 0x20。但是 AL 是一个 8 位寄存器,所以值是 0x12,而不是 0x112。
AH 也是一样,因为它也是一个 8 位寄存器。
要获得完整的值,您需要使用 16 位的 AX 寄存器。
AX 由 AH(高)和 AL(低)组成,因此您可以单独访问高和低部分。
----------------EAX ----------------
------- AX --------
|----------------|--------|--------|
| | AH | AL |
|----------------|--------|--------|
16 bits 8 bits 8 bits
我还建议使用D86(A86 附带),因为它可以让您以交互方式输入 8086 指令,这样您就可以看到每条指令之后所有寄存器和标志会发生什么。
这段代码(正如其他人指出的那样):
MOV AL, F2h
ADD AL, 20h
只会影响标志和 AL 寄存器。不会影响其他 8 位寄存器(甚至 AH)。AX 会改变,因为它是由 AH 和 AL 组成的,所以如果 AH 是 42h:
Code AL AH AX
MOV AL,F2h F2 42 42f2
ADD AL,20h 12 42 4212
该特定操作的结果将设置进位标志和奇偶校验标志并清除溢出、零、符号和辅助进位标志。
您可能认为应该设置溢出标志,但溢出标志将值视为有符号值(在本例中为 -14 和 32),并且加法不超过最大有符号值(127)。进位标志将这些值视为无符号值(242 和 32),并且加法超过了最大无符号值:242 + 32 = 274,它大于 255,因此设置了进位。
当我在学校学习 ASM 时,我使用了这个程序。它对我调试简单的 asm 程序有很大帮助。您只需将源代码放入编辑器,单击调试并逐步观察寄存器发生的情况
我的 asm 有点生锈了.. 但我认为在你的第一个例子中,AL 会保持 12h,进位会使 AH 增加一个。
下载这个模拟器,它可以让你一步一步地观察代码的执行,检查寄存器的值等等。比纸笔画有趣多了。