如何实现将所有寄存器推送到堆栈的循环
How to implement a loop that will add push all registers to the stack
我正在尝试在 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
我似乎无法使用对内存的直接引用来推送,而且我不确定如何以其他方式实现它。代码没有assemble.
编辑
我尝试使用以下代码转入寄存器:
LOOP:
MOV R1, @R0
INC R0
DEC A
JNZ LOOP
但是,我收到一个错误:`Unknown Label - @R0``
对于间接,您只能使用 @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
我正在尝试在 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
我似乎无法使用对内存的直接引用来推送,而且我不确定如何以其他方式实现它。代码没有assemble.
编辑
我尝试使用以下代码转入寄存器:
LOOP:
MOV R1, @R0
INC R0
DEC A
JNZ LOOP
但是,我收到一个错误:`Unknown Label - @R0``
对于间接,您只能使用 @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