【问题标题】:8085 assembly: sign extend 8-bit to 16-bit8085 汇编:符号扩展 8 位到 16 位
【发布时间】:2015-01-14 17:21:04
【问题描述】:

如何签名将一组 8 位数字扩展为 16 位并以小端格式存储它们。例如,我的内存位置中有以下数据。

Address = Value
0001    = 03 [counter]
0002    = 05
0003    = 43
0004    = 8C

结果:

Address = Value
0005    = 05 \ 05 => 00 05
0006    = 00 /
0007    = 43 \ 43 => 00 43
0008    = 00 /
0009    = 8C \ 8C => FF 8C
000A    = FF /

我目前卡在以下代码上:

LXI D,0005H [memory location to store little endian]
LXI H,0001H 
MOV C,M  [initialize counter]
INX H  [increment 1 and point to first data]
MOV A,M
CALL EXPAND
HLT

Expand: PUSH B
PUSH H
checkMSB: ANI 80H  [Check the MSB to determine expand number whether is 00 or FF]
JZ SKIP
..... [still on process]

SKIP: STAX D [stuck at here]
INX H
MOV A,M
DCR C
JNZ checkMSB
POP H
POP B
HLT

【问题讨论】:

  • 您的示例结果中是否缺少 43 的高字节 (00)?
  • @lurker 是的!谢谢提醒。
  • 另外,如果第一个数据位于位置0001H,您将0001H 存储到H 然后INX H递增1 并指向第一个数据 .但是现在不是指向第二个数据字节了吗?
  • @lurker 我的意思是一组数字的第一个数据,基本上0001H 是计数器,0002H 是我要扩展的第一个数字直到0004H

标签: assembly 8085


【解决方案1】:

这也是有可能的:

   LXI  D, 0005H ;; destination
   LXI  H, 0001H ;; source
   MOV  C,M      ;; load counter
; --- only needed if counter may be 0 ---
   MOV  A, C     ;; copy C to A
   ORA  A        ;; check if A is 0
   JZ   done
; --- ---
loop:
   INX  H        ;; inc pointer to next value
   MOV  A,M        ;; read 8-bit value
   STAX  D        ;; write low word
   INX  D        ;; increment pointer
   ADI  80h     ;; this will set CF if HSb is set
   SBB  A        ;; will result in 0FFh if CF set, 0 else
   STAX  D        ;; write high word
   INX  D        ;; increment pointer
   DCR  C        ;; dec counter
   JNZ  loop
done:

【讨论】:

  • LDA 必须像LDA [memory location] 一样使用并更改为MOV A,M。有一些语法错误,更改后效果很好。非常感谢你! =D
【解决方案2】:

做一些类似的事情

LXI D,DOUT;; destination
LXI H,DIN ;; source
MOV C,M ;; load counter
INR C
LOOP:
INX H ;; inc to next number
DCR C ;; dec counter
JZ DONE
;; load and store lo 8 bit
MOV A,M
STAX D
INX D
;; shift upper bit to carry
RAL
;; A <= A - A - CY, i.e. A <= 0x00 or 0xFF depending on CY
SBB A
;; store hi 8 bit
STAX D
INX D
JMP LOOP
DONE:
JMP DONE

DIN:
03 05 43 8C
DOUT:

如果您的要求不是这些地址,您可以使用堆栈。此外,可能会采用一些旋转/移动技巧。我不喜欢语法,所以我可能在某个地方有错字。

【讨论】:

  • 对于 DCR C 之后的循环部分,您没有任何操作员可以更改标志,所以我不知道如何处理 JZ DONE
  • 如果 C 在递减后为​​零,则 DCR 设置零标志。如果 C 为零,则设置 Z 并且 JZ DONE 将跳转到 DONE。否则,将处理另一个元素。
  • 好的,谢谢。而对于 LDA MLDA 只能像 LDA A000H 一样使用,这意味着后面跟着内存地址
  • 也可以压缩MVA,00H; SBI 00H 进入 SBB A,就像 Martin Rosenau 所做的那样。
  • 我这样做并更改为 MOV A,M 并将您的所有 STA D 替换为 STAX D,因为它与 LDA [内存位置] 的概念相同。但是仍然有问题它没有复制地址的内存位置。例如,我移动了 0002 的内容,但它将 00 存储到我的内存位置,而不是 05 的值
猜你喜欢
  • 2021-07-21
  • 1970-01-01
  • 1970-01-01
  • 2017-04-14
  • 2014-01-09
  • 2019-10-24
  • 1970-01-01
  • 2021-12-22
  • 2013-12-20
相关资源
最近更新 更多