如何实现一个循环,该循环将添加所有寄存器到堆栈

时间:2019-04-08 20:58:10

标签: assembly 8051

我正在尝试在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

但是,我收到一个错误消息:`未知标签-@ R0``

1 个答案:

答案 0 :(得分:2)

对于间接,您只能使用@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