2015-10-21 33 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

谢谢阿维拉!啊啊 –