8085程序如何将两个16位数字相乘?

2021年3月22日15:04:30 发表评论 787 次浏览

问题–在8085微处理器中编写汇编语言程序, 以将两个16位数字相乘

假设–

  • 程序的起始地址:2000
  • 输入存储器位置:2050、2051、2052、2053
  • 输出存储器位置:2054、2055、2056、2057

示例–

INPUT:
       (2050H) = 04H
       (2051H) = 07H 
       (2052H) = 02H 
       (2053H) = 01H
OUTPUT:
        (2054H) = 08H
        (2055H) = 12H
        (2056H) = 01H
        (2057H) = O0H

结果如下:

因此, 我们将两个16位数字相乘。

算法

  1. 加载HL对中的第一个数据。
  2. 将HL对的内容移动到堆栈指针。
  3. 将第二对数据装入HL对并将其移至DE。
  4. 将H寄存器设为00H, 将L寄存器设为00H。
  5. 添加HL对和堆栈指针。
  6. 检查进位是否将进位加1, 否则进入下一步。
  7. 然后将E移至A, 并对累加器和寄存器D执行"或"运算。
  8. 运算的值为零, 然后存储该值, 否则转到步骤3。

程序–

内存地址 记忆 注释
2000 LHLD 2050 用地址2050加载H-L对
2003 SPHL 保存在栈指针中
2004 LHLD 2052 用地址2052加载H-L对
2007 XCHG 交换HL和DE配对内容
2008 LXI H, 0000H H <-00H, L <-00H
200B LXI B, 0000H B <-00H, C <-00H
200E DAD SP
200F JNC 2013 不进位时跳跃
2012 INX B BC增加1
2013 DCX D 递减DE 1
2014 MOV A, E A <-E
2015 ORA D 或累加器和寄存器的内容
2016 JNZ 200E 不为零则跳跃
2019 SHLD 2054 L <-2054, H <-2055
201C MOV L, C L <-C
201D MOV H, B B < H
201E SHLD 2056 L <-2055, H <-2056
2021 HLT 终止程序

说明–寄存器B, C, D, E, H, L和累加器用于通用。

  1. LHLD 2050:用地址2050加载HL对。
  2. SPHL:将HL的内容保存在堆栈指针中。
  3. LHLD 2052:用地址2052加载H-L对。
  4. XCHG:与DE交换HL对的内容。
  5. LXI H, 0000H:将H设为00H, 将L设为00H。
  6. LXI B, 0000H:将B设为00h, 将C设为00H
  7. DAD SP:添加HL对和堆栈指针。
  8. JNC 2013:如果没有进位, 请跳转至地址2013。
  9. INX B:将BC寄存器加1。
  10. DCX D:将DE寄存器对减1。
  11. MOV A, E:将寄存器E的内容移至累加器。
  12. ORA D:或累加器和D寄存器的内容。
  13. JNZ 200E:如果不为零, 则跳转到地址200E。
  14. SHLD 2054:将结果从HL对寄存器存储到内存地址2054和2055。
  15. MOV L, C:将寄存器C的内容移到L。
  16. MOV H, B:将寄存器B的内容移到H。
  17. SHLD 2056:将结果从HL对寄存器存储到内存地址2056和2057。
  18. HLT:终止程序。

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: