在没有递增或递减指令的情况下对 1 到 100 的整数求和(并且不使用高斯公式)?

Sum integers from 1 to 100 without increment or decrement instructions (and without using Gauss's formula)?

为 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

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

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

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公式而是一个一个地添加,而不是使用自增自减指令,它使用加减指令。结果存储在累加器寄存器中。

题目说总和为1000x64,这将导致无法存储在8位累加器中的100*(100+1)/2 = 50500x13BA。在那种情况下,我们可以将结果保存在寄存器对中,比如 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 编写的,以便更清晰,并且可以轻松转换为高效指令。