问题–编写一个程序,查找一个序列的总和,其中序列从3001存储器地址开始,序列数在3000存储器地址处,给定程序的起始地址为2000,将结果存储到4000存储器地址中。
例子 –
算法 –
- 立即将00移到寄存器B进行进位
- 立即将存储器[3000]的数据加载到H中
- 将存储器的值移到寄存器C中
- 将C减1
- HL对增加1
- 将存储器的值移到累加器中
- HL对增加1
- 用累加器增加存储器的价值
- 如果没有进位则跳转到步骤11
- 将寄存器B的值增加一
- 将寄存器C减1
- 如果不为零,则跳至步骤7
- 将累加器的内容存储到内存[4000]中(结果)
- 将寄存器B的内容移入累加器
- 将累加器的内容存储到内存[4001]中(进位)
- 停止
程序 –
Memory | Mnemonics | Operands | Comment |
---|---|---|---|
2000 | MVI | B, 00 | [B] <- 00 |
2002 | LXI | H, [3000] | [H-L] <- [3000] |
2005 | MOV | C, M | [C] <- [M] |
2006 | DCR | C | [C] <- [C] – 1 |
2007 | INX | H | [H-L] <- [H-L] + 1 |
2008 | MOV | A, M | [A] <- [M] |
2009 | INX | H | [H-L] <- [H-L] + 1 |
200A | ADD | M | [A] <- [A] + [M] |
200B | JNC | 200F | jump if no carry |
200E | INR | B | [B] <- [B] + 1 |
200F | DCR | C | [C] <- [C] – 1 |
2010 | JNZ | 2009 | jump if not zero |
2013 | STA | [4000] | result |
2016 | MOV | A, B | [A] <- [B] |
2017 | STA | [4001] | carry |
201A | HLT | Stop |
说明–寄存器A,B,C,H用于一般用途。
- MVI用于立即加载8位给定寄存器(2字节指令)
- LXI用于立即使用16位地址(3字节指令)加载寄存器对
- MOV用于将数据从累加器传输到寄存器(任意)或将寄存器(任何)传输到累加器(1字节)
- RAR用于带进位的“ A”右移(1字节指令)
- STA用于使用16位地址(3字节指令)将数据从累加器直接存储到存储器中
- INR用于将给定寄存器增加1(1字节指令)
- 如果没有进位(3字节指令),则使用JNC跳转到给定的步骤
- 如果JNZ不为零,则使用JNZ跳至给定步骤(3字节指令)
- DCR用于将给定寄存器减1(1字节指令)
- INX用于将寄存器对增加1(1字节指令)
- ADD用于将累加器的值与给定值相加(1字节指令)
- HLT用于暂停程序