【问题标题】:How to implement a loop that will add push all registers to the stack如何实现将所有寄存器推送到堆栈的循环
【发布时间】:2019-04-08 20:58:09
【问题描述】:

我正在尝试在 8051 汇编中编写一个循环,它将遍历四个寄存器组(内存位置:0x00 - 0x1F)中的所有寄存器并将它们推入堆栈。

我试图编写一个循环,将值递增到指向内存位置 0x00 - 0x1F,因为我需要将它们全部推入堆栈,然后我尝试获取该值,将其推入堆栈然后递增该值,同时递减累加器中的限制,最终在循环通过所有寄存器后结束循环

MOV 50H, 0  ;This is our index
MOV A, #1FH ;Move the limit into Acc


LOOP:
    PUSH @50H   
    INC 50H
    DEC A
    JNZ LOOP

我似乎无法使用对内存的直接引用来推送,而且我不确定如何实现它。代码没有汇编。

编辑

我尝试使用以下代码移入寄存器:

LOOP:
   MOV R1, @R0
   INC R0
   DEC A
   JNZ LOOP

但是,我收到一个错误:`Unknown Label - @R0`

【问题讨论】:

  • 对于间接,您只能使用@R0@R1,但不幸的是不能用于PUSH。因此,我建议您将 R0 保存到一个临时变量中,然后使用它来迭代您的内存块,将每个字节移动到另一个临时变量中,您可以 PUSH。最后,找出哪个寄存器组处于活动状态,并将您保存的R0 复制到堆栈上的适当位置。
  • 我已经使用我尝试过的新代码@Jester 在我的帖子中添加了一个编辑,但是我仍然收到一个错误:Unknown Label - @r0

标签: assembly 8051


【解决方案1】:

对于间接,您只能使用@R0@R1,但不幸的是不能用于PUSH。因此,我建议您将R0 保存到一个临时变量中,然后使用R0 来迭代您的内存块,将每个字节移动到另一个临时变量中,您可以使用PUSH。最后,找出哪个寄存器组处于活动状态,并将您保存的R0 复制到堆栈上的适当位置。像这样的东西(除了它组装的事实之外还没有测试过):

    mov B, R0
    mov R0, #0
loop:
    mov A, @R0
    push ACC
    inc R0
    cjne R0, #20h, loop
    ; figure out which register bank is in use from PSW
    ; and write B into the appropriate location for R0
    mov A, PSW
    anl A, #18h  ; this gives 00h, 08h, 10h, 18h
    add A, SP    ; end of save area
    ; clr C      ; not needed as the above addition should never produce carry
    subb A, #20h ; size of save area
    mov R0, A
    mov @R0, B
    mov R0, B    ; restore original R0 if needed

【讨论】:

    猜你喜欢
    • 2020-10-29
    • 2016-12-04
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多