-1

为 Intel 8085 微处理器编写一个汇编语言程序,计算 N 个自然数之和,即 ΣN = 1+2+3+ … +(N-1)+N。

尽可能多地满足约束:

  1. 不使用 N*(N+1) / 2 的公式
  2. 不使用任何递增和递减指令,如 INR、DCR、INX 和 DCX
  3. 不使用内存地址读取数据和写入输出结果(假设累加器寄存器相同)

我的代码是:

START: LDA 3000H
MOV B, A
INR A
MOV C, A
MVI A, 00H

LOOP1: ADD B
DCR C
JNZ LOOP1

MVI C, 02H
MVI B, 00H

LOOP2: INR B
SUB C
JNZ LOOP2

MOV A,B
STA 3001H
HLT

我已经尝试并制作了该程序,但使用了所有这些约束,而问题要求不要使用它们。所以我怀疑是否可以不使用这些来制作程序。

4

2 回答 2

2

我认为以下代码满足所有条件:

START:LDA 3000H
MVI B, 00H
MVI C, 00H
MVI L, 01H

LOOP:MOV H, A
MOV A, C
ADD L
MOV C, A
MOV A, B
ADD C
MOV B, A
MOV A, H
SUB L
JNZ LOOP

MOV A, B
HLT

它不使用 guass 公式,而是一一相加,而不是使用递增递减指令,而是使用 add 和 sub 指令。结果存储在累加器寄存器中。

于 2020-04-16T17:27:59.517 回答
2

问题标题为 sum upto 100or 0x64,这将导致100*(100+1)/2 = 5050or0x13BA无法存储在 8 位累加器中。在这种情况下,我们可以将结果保存在一个寄存器对中HL

      MVI A,64H    ; A <- n
      MVI C,01H
      MVI D,00H
      MVI E,00H
      MVI H,00H
      MVI L,00H

LOOP: MOV E,A      ; E <- n
      DAD D        ; HL <- HL + n
      SUB C        ; n <- n-1
      JNZ LOOP

      HLT

开始时的初始化指令是MVI为了更清晰而编写的,并且可以很容易地转换为有效的指令。

于 2021-06-24T11:48:54.177 回答