📜  8086程序生成斐波那契数列

📅  最后修改于: 2021-06-28 14:41:26             🧑  作者: Mango

问题–编写8086装配级程序以生成斐波那契数列。序列的长度存储在偏移量为0的数据段中。我们将从偏移量500开始将生成的序列存储在数据段中。
注意:生成的数字和存储位置以其十六进制十进制格式表示。

例子:
输入:

输出:

算法:
通过将第(i)个元素和第(i-1)个元素相加并将其存储到第(i + 1)个位置来生成斐波那契数列。鉴于第一和第二位置分别用0和1初始化,这保持了良好的效果。需要遵循以下步骤,才能使用汇编级指令执行该过程。

  1. 将存储在偏移量00H处的值移至CX(将用作计数器),并将其递减2(因为我们需要显式加载序列的前2个元素)
  2. 将00H移至AL
  3. 将500移至SI
  4. 将AL移至[SI]
  5. 将AL和SI都加1,并将AL的值存储在[SI]中(通过此操作,我们已将序列的前2个元素加载到了内存中)
  6. 将第[SI-1]个值移到AL中
  7. 将第[SI]个值移至AH
  8. 将00H移至BH
  9. 添加BH和AH(结果存储在BH中)
  10. 再次用AL添加BH
  11. SI递增1
  12. 将BH存储到[SI]
  13. 循环回到第6步,直到计数器变为0
  14. 停止

程序:

Memory Address Instruction/Mnemonic Explanation/Comment
2000 MOV AL, 00H AL <- 00
2002 MOV SI, 500H SI <- 500
2005 MOV [SI], AL [SI] <- 00
2007 ADD SI, 01H SI <- SI + 01
200A ADD AL, 01H AL <- AL + 01
200C MOV [SI], AL SI <- AL
200E MOV CX, [0000H] CX <- 0000
2012 SUB CX, 0002H CX <- CX – 02
~2015 L1: LABEL
2015 MOV AL, [SI-1] AL <- [SI – 01]
2018 ADD AL, [SI] AL <- AL + [SI]
201A ADD SI, 01H SI <- SI + 01
201D MOV [SI], AL [SI] <- AL
201F LOOP L1 LOOP L1 CX TIMES
2021 HLT END

解释:

  1. MOV AL,00H: AL现在具有序列中的第一个数字
  2. MOV SI,500H:使SI指向输出位置
  3. MOV [SI],AL:将0移到第一个位置
  4. 添加SI,1:递增SI指向下一个存储位置
  5. 添加AL,1:现在,AL具有序列的第二个元素
  6. MOV [SI],AL:将01H移至第二位置
  7. MOV CX,[0000H]:将以偏移量0存储的值移动到CX(计数器)中
  8. SUB CX,02H:由于我们已经初始化了序列的前2个元素,因此我们需要将计数器递减2
  9. L1:定义循环的开始(创建标签)
  10. MOV AL,[SI-1]:将第(i-1)位的元素移动到AL中
  11. 添加AL,[SI]:将第(i)个元素与AL中已经存在的第(i-1)个元素一起移动
  12. 添加SI,1:递增SI指向下一个位置
  13. MOV [SI],AL:将总和存储在新位置
  14. LOOP L1:标签L1和此LOOP指令之间的指令执行“ CX”次
  15. HLT:结束程序

实际输出:

带圆圈的存储位置(0000)包含序列的长度。对于此程序,它是8。

高亮显示的值是斐波那契数列的元素(以十六进制表示。因此13表示为0D)

参考:8085生成斐波那契数列的程序

享受编码!