【发布时间】:2010-05-05 09:20:08
【问题描述】:
我在高中理论上学习 ASM 8086。 (这意味着我在笔记本上学习 ASM 8086,而从未在计算机上运行过)。
我不明白 - 如果我这样做会发生什么:
MOV AL, F2h
ADD AL, 20h
计算机会做什么? (AL,AX,CF,ZF的值是多少?)
如果我这样做会发生什么:
MOV AH,F2h
ADD AH,20h
谢谢!!
【问题讨论】:
我在高中理论上学习 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 (which comes with 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 时,我使用了 this program. 它对调试简单的 asm 程序帮助很大。您只需将源代码放入编辑器,单击调试并逐步观察寄存器发生的情况
【讨论】:
我的 asm 有点生锈了.. 但我认为在你的第一个实例中,AL 会保持 12h,进位会使 AH 增加 1。
下载this模拟器,它可以让你一步步地观察代码的执行,检查寄存器的值等等。比纸笔画有趣多了。
【讨论】: