Как реализовать цикл, который будет добавлять push все регистры в стек - PullRequest
0 голосов
/ 08 апреля 2019

Я пытаюсь написать цикл в сборке 8051, который будет проходить через все регистры в четырех банках регистров (ячейки памяти: 0x00 - 0x1F) и проталкивать их через стек.

IЯ пытался написать цикл, который будет увеличивать значение, чтобы указать места памяти 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 Ответ

2 голосов
/ 09 апреля 2019

Для косвенного обращения вы можете использовать только @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
...