进位位于标志寄存器,受许多操作影响,通常包括INC
。
您有几种选择要保留来自ADD
产生进位标志:
保存标志寄存器的ADD
后,它的ADDC
之前恢复。在Intel上,这是通过pushf
和popf
指令完成的。
将进位保存在寄存器中。在英特尔,这是通过setc [8-bit-register]
完成的。或者,您可以使用条件跳转。 (在intel上这将是jc
,继续进行;这可能是模拟器中的BRC
)。第三种方法是MOV R4, 0; ADC R4, R4
。
重新排序或重写代码,以便在ADD
和ADDC
之间没有标志变更指令。这是首选解决方案,我将继续基于此选项。
首先,我会告诉你它是如何在英特尔完成的:
; add the low words
mov ax, [Num1]
add ax, [Num2]
mov [Soma], ax
; Add the high words and the Carry bit
mov ax, [Num1 + 2]
addc ax, [Num2 + 2]
mov [Soma +_2], ax
现在的模拟器装配。 (我假设MOV R4, M[R1]
意味着将内存地址R1
中的值放入R4
)。
如果仿真器支持的操作数的语法像M[R1 + 1]
,则需要增加寄存器消失:
MOV R1, Num1
MOV R2, Num2
MOV R3, Soma
MOV R4, M[R1]
ADD R4, M[R2]
MOV M[R3], R4
MOV R4, M[R1+2]
ADDC R4, M[R2+2]
MOV M[R3+2], R4
此外,你也许可以摆脱使用R1, R3, R3
产品总数如果模拟器支持M[Num1]
语法。
请注意,我添加了2
而不是1
,因为您要添加长度为2个字节的单词。 您的INC
可能需要加倍(模拟CPU可以以字节偏移访问内存,不是吗?)。例如在INC R1
将成为:
INC R1
INC R1
这相当于
ADD R1, 2
,这显示了进位标志被清楚如何覆盖。
如果模拟器不支持M[register + constant]
语法,我们可以解决,通过使用R4
寄存器,这是MOV M[R3], R4
和MOV R4, M[R1]
之间未使用:
MOV R1, Num1
MOV R2, Num2
MOV R3, Soma
MOV R4, M[R1]
ADD R4, M[R2]
MOV M[R3], R4
MOV R4, 0
ADC R4, R4 ; R4 now contains the carry flag.
INC R1 ; Note you probably need to change
INC R2 ; these to ADD R?, 2
INC R3
ADD R4, M[R1]
ADD R4, M[R2]
MOV M[R3], R4
干杯!
出于好奇,什么机器架构,这是什么? – Kenney
P3处理器,我们使用它的模拟器。它使用16位 –
Pentium 3?它看起来像英特尔的语法,但它不是真的..在任何情况下,'INC'都会影响标志,所以在到达'ADDC'时,您将从'ADD'中取出Carry位。 – Kenney