基于X内容对两个BCD数进行运算的8085程序
现在让我们来看一个Intel 8085微处理器的程序。在这个程序中,我们将看到如何根据选择对BCD数进行不同的运算。
问题陈述:
编写8085汇编语言程序,根据选择对两个8位BCD数执行一些运算。
讨论:
在这个程序中,我们选择一个选项。选项值存储在内存位置8000H(命名为X)。BCD数存储在位置8001H和8002H。我们将结果存储在位置8050H和8051H。
如果选择是00H,则执行加法;对于01H,执行减法;对于02H,执行乘法运算。
输入:
第一个输入
地址 | 数据 |
---|---|
. . . | . . . |
8000 | 00 |
8001 | 97 |
8002 | 88 |
. . . | . . . |
第二个输入
地址 | 数据 |
---|---|
. . . | . . . |
8000 | 01 |
8001 | 97 |
8002 | 88 |
. . . | . . . |
第三个输入
地址 | 数据 |
---|---|
. . . | . . . |
8000 | 02 |
8001 | 05 |
8002 | 04 |
. . . | . . . |
流程图:
程序:
地址 | 十六进制代码 | 标签 | 指令助记符 | 注释 |
---|---|---|---|---|
F000 | 21, 00, 80 | LXI H,8000H | 指向获取选择的地址 | |
F003 | 7E | MOV A,M | 将选择加载到A寄存器 | |
F004 | FE, 00 | CPI 00H | 比较是否为加法 | |
F006 | CA,14, F0 | JZ ADD | 跳转到加法运算 | |
F009 | FE, 01 | CPI 01H | 比较是否为减法 | |
F00B | CA,27, F0 | JZ SUB | 跳转到减法运算 | |
F00E | FE, 02 | CPI 02H | 比较是否为乘法 | |
F010 | CA, 3F, F0 | JZ MUL | 跳转到乘法运算 | |
F013 | 76 | HLT | 终止程序 | |
F014 | 23 | ADD | INX H | 指向第一个操作数 |
F015 | 7E | MOV A,M | 将操作数加载到A寄存器 | |
F016 | 23 | INX H | 指向下一个操作数 | |
F017 | 86 | ADD M | 将M与A相加 | |
F018 | 27 | DAA | 十进制调整 | |
F019 | 6F | MOV L,A | 将A寄存器存储到L寄存器 | |
F01A | D2, 22, F0 | JNC SKP1 | 如果CY=0,跳转到SKP1 | |
F01D | 26, 01 | MVI H,01H | 将01H加载到H寄存器 | |
F01F | C3, 62, F0 | JMP STORE | 存储结果 | |
F022 | 26, 00 | SKP1 | MVI H,00H | 清除HL寄存器 |
F024 | C3, 62, F0 | JMP STORE | 将HL寄存器作为结果存储 | |
F027 | 23 | SUB | INX H | 指向第一个操作数 |
F028 | 46 | MOV B,M | 将操作数加载到B寄存器 | |
F029 | 3E, 99 | MVI A,99H | 将99H加载到A寄存器 | |
F02B | 23 | INX H | 指向下一个操作数 | |
F02C | 96 | SUB M | 从A寄存器减去M | |
F02D | C6, 01 | ADI 01H | 加上01H得到十的补码 | |
F02F | 80 | ADD B | 将B与A相加 | |
F030 | 27 | DAA | 十进制调整 | |
F031 | 6F | MOV L,A | 将A寄存器存储到L寄存器 | |
F032 | DA, 3A, F0 | JC SKP2 | 如果CY=1,跳转到SKP2 | |
F035 | 26, FF | MVI H,FFH | 将FFH加载到H寄存器 | |
F037 | C3, 62, F0 | JMP STORE | 存储结果 | |
F03A | 26, 00 | SKP2 | MVI H,00H | 清除HL寄存器 |
F03C | C3, 62, F0 | JMP STORE | 将HL寄存器作为结果存储 | |
F03F | 23 | MUL | INX H | 指向第一个操作数 |
F040 | 46 | MOV B,M | 将操作数加载到B寄存器 | |
F041 | 23 | INX H | 指向下一个操作数 | |
F042 | 4E | MOV C,M | 加载第二个操作数 | |
F043 | 26, 00 | MVI H,00H | 清除H寄存器 | |
F045 | AF | XRA A | 清除A寄存器 | |
F046 | B9 | CMP C | 将C与A比较 | |
F047 | CA, 5E, F0 | JZ DONE | 如果Z=1,跳转到DONE | |
F04A | 80 | LOOP | ADD B | 将B与A相加 |
F04B | 27 | DAA | 十进制调整 | |
F04C | 57 | MOV D,A | 将A寄存器移动到D寄存器 | |
F04D | D2, 55, F0 | JNC NINC | 如果CY=0,则不增加H | |
F050 | 7C | MOV A,H | 将H寄存器加载到A寄存器 | |
F051 | C6, 01 | ADI 01H | 增加A寄存器 | |
F053 | 27 | DAA | 十进制调整 | |
F054 | 67 | MOV H,A | 将数据返回H寄存器 | |
F055 | 79 | NINC | MOV A,C | 将C寄存器加载到A寄存器 |
F056 | C6, 99 | ADI 99H | 将A与99H相加 | |
F058 | 27 | DAA | 十进制调整 | |
F059 | 4F | MOV C,A | 将A寄存器再次加载到C寄存器 | |
F05A | 7A | MOV A,D | 将D寄存器的数据返回A寄存器 | |
F05B | C2, 4A, F0 | JNZ LOOP | 如果Z=0,跳转到LOOP | |
F05E | 6F | DONE | MOV L,A | 将A寄存器的数据存入L寄存器 |
F05F | C3, 62, F0 | JMP STORE | 将HL寄存器作为结果存储 | |
F062 | 22, 50, 80 | STORE | SHLD 8050H | 从HL寄存器存储结果 |
F065 | 76 | HLT | 终止程序 |
输出:
第一个输出
地址 | 数据 |
---|---|
. . . | . . . |
8050 | 85 |
8051 | 01 |
. . . | . . . |
第二个输出
地址 | 数据 |
---|---|
. . . | . . . |
8050 | 09 |
8051 | 00 |
. . . | . . . |
第三个输出
地址 | 数据 |
---|---|
. . . | . . . |
8050 | 20 |
8051 | 00 |
. . . | . . . |
广告