问题–编写8086装配级程序以生成斐波那契数列。序列的长度存储在偏移量为0的数据段中。我们将从偏移量500开始将生成的序列存储在数据段中。
注意:生成的数字和存储位置以其十六进制十进制格式表示。
例子:
输入:
输出:
算法:
通过将第(i)个元素和第(i-1)个元素相加并将其存储到第(i + 1)个位置来生成斐波那契数列。鉴于第一和第二位置分别用0和1初始化,这保持了良好的效果。需要遵循以下步骤,才能使用汇编级指令执行该过程。
- 将存储在偏移量00H处的值移至CX(将用作计数器),并将其递减2(因为我们需要显式加载序列的前2个元素)
- 将00H移至AL
- 将500移至SI
- 将AL移至[SI]
- 将AL和SI都加1,并将AL的值存储在[SI]中(通过此操作,我们已将序列的前2个元素加载到了内存中)
- 将第[SI-1]个值移到AL中
- 将第[SI]个值移至AH
- 将00H移至BH
- 添加BH和AH(结果存储在BH中)
- 再次用AL添加BH
- SI递增1
- 将BH存储到[SI]
- 循环回到第6步,直到计数器变为0
- 停止
程序:
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 |
解释:
- MOV AL,00H: AL现在具有序列中的第一个数字
- MOV SI,500H:使SI指向输出位置
- MOV [SI],AL:将0移到第一个位置
- 添加SI,1:递增SI指向下一个存储位置
- 添加AL,1:现在,AL具有序列的第二个元素
- MOV [SI],AL:将01H移至第二位置
- MOV CX,[0000H]:将以偏移量0存储的值移动到CX(计数器)中
- SUB CX,02H:由于我们已经初始化了序列的前2个元素,因此我们需要将计数器递减2
- L1:定义循环的开始(创建标签)
- MOV AL,[SI-1]:将第(i-1)位的元素移动到AL中
- 添加AL,[SI]:将第(i)个元素与AL中已经存在的第(i-1)个元素一起移动
- 添加SI,1:递增SI指向下一个位置
- MOV [SI],AL:将总和存储在新位置
- LOOP L1:标签L1和此LOOP指令之间的指令执行“ CX”次
- HLT:结束程序
实际输出:
带圆圈的存储位置(0000)包含序列的长度。对于此程序,它是8。
高亮显示的值是斐波那契数列的元素(以十六进制表示。因此13表示为0D)
参考:8085生成斐波那契数列的程序
享受编码!