8051 汇编程序将值从一个范围复制到另一个保持奇数值并将偶数值转换为 BCD

问题描述

我需要做这个任务:

在8051汇编程序中编写程序,将内存范围30H – 3FH复制到内存范围40H – 4FH,将奇数值原样复制,偶数值转换为BCD格式。不要使用任何子程序。

现在我有一个程序可以保存奇数但跳过偶数:

MOV  R0,#30H
MOV  R1,#40H
LOOP:
MOV    A,@R0
ANL  A,#00000001B
JZ NOT_INTERESTED 
MOV  A,@R0
MOV  @R1,A
INC  R1
NOT_INTERESTED:
INC  R0
CJNE R0,#40H,LOOP

我有一个将值转换为 BCD 的程序:

MOV    30H,#63
MOV    A,30H
CALL HEX_2_BCD
MOV  31H,A
HEX_2_BCD:
MOV  B,#10
DIV  AB
SWAP A
ADD  A,B
RET

您知道我如何将它们组合起来以获得所需的结果吗?

解决方法

MOV    30H,#63
MOV    A,30H
CALL HEX_2_BCD
MOV  31H,A
HEX_2_BCD:
MOV  B,#10
DIV  AB
SWAP A
ADD  A,B
RET

转换为 BCD 的代码是错误的。从 CALL HEX_2_BCD 返回后,A 寄存器保存 BCD。很好,但是代码不必要地落入了转换代码中。这不是很有示范意义。尽管如此,您可以从中提取执行 BCD 转换的基本指令:

  MOV  B,#10
  DIV  AB
  SWAP A
  ADD  A,B

因为在新程序中,源范围中的每个字节都必须写入目标范围,所以如果我们有条件地跳转到具有奇数值且可以不加修改地写入的字节,将是最简单的。
此外,如果我们稍微修改偶数/奇数的测试,我们就不必重新加载 A 寄存器。请记住,A 寄存器是一个特殊功能寄存器,其位可以位寻址,使用位地址 0E0h 到 0E7h。

  MOV  R0,#30h
  MOV  R1,#40h
Loop:
  MOV  A,@R0         ; Read from source
  JB   0E0h,IsOdd    ; Go write unmodified
IsEven:
 
  ...

IsOdd:
  MOV  @R1,A         ; Write to destination
  INC  R1
  INC  R0
  CJNE R0,#40h,Loop

验证您要转换为 BCD 的数字是否小于 100 可能是个好主意,否则转换后的结果将毫无价值!

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...