8085程序实现以下函数:(a*b) + (c*d)
在这里,我们将了解如何使用8085实现数学函数。
问题陈述
编写一个程序来实现以下函数 (a*b) + (c*d),并将结果存储在内存位置8204和8205中。使用子程序执行乘法运算。这里a、b、c和d数字分别存储在内存位置8200H、8201H、8202H和8203H中。
讨论
8085中没有乘法指令。因此,我们必须使用子程序来执行乘法。在这个子程序中,它从HL对指向的内存中获取数字,并将结果返回到DE寄存器对。在将两个部分相乘后,存储中间结果,然后将它们相加以获得最终结果。
输入
地址 | 数据 |
---|---|
… | … |
8200 | 02 |
8201 | 03 |
8202 | 04 |
8203 | 05 |
… | … |
地址 | 数据 |
---|---|
… | … |
8200 | CA |
8201 | C6 |
8202 | C8 |
8203 | 64 |
… | … |
流程图
程序
地址 | 十六进制代码 | 标签 | 助记符 | 注释 |
---|---|---|---|---|
8000 | 31, 00, 83 | START | LXI SP, 8300 H | 初始化堆栈指针SP = 8300 H |
8003 | 21, 00, 82 | | LXI H, 8200 H | 初始化内存指针HL = 8200 H,它是起始数据块地址 |
8006 | CD, 19, 80 | | CALL MULTI | 调用子程序Multi..它将HL作为源数据块指针,并将结果返回到DE寄存器对 |
8009 | D5 | | PUSH D | 存储结果1,即a * b |
800A | 23 | | INX H | 指向下一对数据 |
800B | CD, 19, 80 | | CALL MULTI | 调用子程序Multi..它将HL作为源数据块指针,并将结果返回到DE寄存器对 |
800E | C1 | | POP B | 获取位于顶部的BC中的结果1 |
800F | E5 | | PUSH H | 存储指针 |
8010 | EB | | XCHG | 获取HL中的结果2,即c * d |
8011 | 9 | | DAD B | HL= HL+BC(结果1+结果2:乘积之和)。因此HL = a * b + c * d |
8012 | EB | | XCHG | 将结果存储在DE中,HL将是目标指针 |
8013 | E1 | | POP H | 恢复内存指针 |
8014 | 23 | | INX H | 指向目标地址 |
8015 | 73 | | MOV M, E | 存储在HL中,结果的LSB(HL)= E |
8016 | 23 | | INX H | 指向下一个位置 |
8017 | 72 | | MOV M, D | 存储在HL中,结果的MSB(HL)=D |
8018 | 76 | | HLT | 停止 |
8019 | 4E | MULTI | MOV C, M | C = no1 |
801A | 23 | | INX H | HL= HL+1;指向下一个数字 |
801B | 46 | | MOV B, M | B = no2 |
801C | E5 | | PUSH H | 保存HL寄存器对 |
801D | 26, 00 | | MVI H, 00 H | H = 00;跟踪进位(进位寄存器:将包含结果的MSB) |
801F | 3E, 00 | | MVI A, 00 H | A = 00(和寄存器) |
8021 | 80 | UP | ADD B | A = A + B |
8022 | D2, 26, 80 | | JNC LOOP | 进位= 1?如果不是,则转到循环 |
8025 | 24 | | INR H | H = H + 1 |
8026 | 0D | LOOP | DCR C | C = C – 1 |
8027 | C2, 21, 80 | | JNZ UP | Z = 0?如果不是,则转到up |
802A | 6F | | MOV L, A | 从A获取L中的和(结果的LSB) |
802B | EB | | XCHG | 从HL获取DE中的结果 |
802C | E1 | | POP H | 恢复HL寄存器对 |
802D | C9 | | RET | 返回主程序 |
输出
地址 | 数据 |
---|---|
… | … |
8204 | 1A |
8205 | 00 |
… | … |
地址 | 数据 |
---|---|
… | … |
8204 | 5C |
8205 | EA |
… | … |
广告