進位位於標誌寄存器,受許多操作影響,通常包括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