2015-10-21 32 views
1

您剛剛開始學習程序集的課程,我們在16位處理器中添加了2個32位數的問題。這是我們的代碼:在程序集中添加2個數字

   ORIG 8000h 
Num1   STR  8091h, 1201h 
Num2   STR  8061h, 4f01h 
Soma   TAB  2 

       ORIG 0000h 

       MOV  R1, Num1 
       MOV  R2, Num2 
       MOV  R3, Soma 
       MOV  R4, M[R1] 
       ADD  R4, M[R2] 
       MOV  M[R3], R4 
       INC  R1 
       INC  R2 
       INC  R3 
       MOV  R4, M[R1] 
       ADDC R4, M[R2] 
       MOV  M[R3], R4 

Fim:   BR  Fim 

我們的問題是,從第一次加入心不是進位被添加到第二,我們不知道爲什麼。

+0

出於好奇,什麼機器架構,這是什麼? – Kenney

+0

P3處理器,我們使用它的模擬器。它使用16位 –

+0

Pentium 3?它看起來像英特爾的語法,但它不是真的..在任何情況下,'INC'都會影響標誌,所以在到達'ADDC'時,您將從'ADD'中取出Carry位。 – Kenney

回答

1

進位位於標誌寄存器,受許多操作影響,通常包括INC

您有幾種選擇要保留來自ADD產生進位標誌:

  • 保存標誌寄存器的ADD後,它的ADDC之前恢復。在Intel上,這是通過pushfpopf指令完成的。

  • 將進位保存在寄存器中。在英特爾,這是通過setc [8-bit-register]完成的。或者,您可以使用條件跳轉。 (在intel上這將是jc,繼續進行;這可能是模擬器中的BRC)。第三種方法是MOV R4, 0; ADC R4, R4

  • 重新排序或重寫代碼,以便在ADDADDC之間沒有標誌變更指令。這是首選解決方案,我將繼續基於此選項。

首先,我會告訴你它是如何在英特爾完成的:

; 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], R4MOV 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 

乾杯!

+0

非常感謝您的詳細解答!我會嘗試你所說的一切,希望它能奏效!這非常有幫助!歡呼聲 –

1

可以增加值之前簡單地添加進:

   ORIG 8000h 
Num1   STR  8091h, 1201h 
Num2   STR  8061h, 4f01h 
Soma   TAB  2 

       ORIG 0000h 

       MOV  R1, Num1 
       MOV  R2, Num2 
       MOV  R3, Soma 
       MOV  R4, M[R1] 
       ADD  R4, M[R2] 
       MOV  M[R3], R4 
       MOV  R4, R0 
       ADDC R4, R0 
       INC  R1 
       INC  R2 
       INC  R3 
       ADD  R4, M[R1] 
       ADD  R4, M[R2] 
       MOV  M[R3], R4 

Fim:   BR  Fim 
+0

謝謝阿維拉!啊啊 –