Следующие позиции памяти в ассемблерном коде - PullRequest
1 голос
/ 15 июня 2019

Мне нужно выяснить, для чего предназначен этот код, и как я могу понять, каково значение позиций памяти?

Я получил несколько строк, так как потом потерял

MOVLW     3             ; W = 3
MOVWF     0x05, A       ; (0x05) = 3
MOVLW     1             ; W = 1
MOVWF     0X10, A       ; (0x10) = 1

ORG 0X000
GOTO      MAIN
MAIN: 
CLRF      TRISC, A
MOVLW     3
MOVWF     0x05, A
MOVLW     1
MOVWF     0X10, A

B1: 
MULLW     2
MOVF      PRODL, 0, A
MOVWF     LATC, A
MOVWF     0X10, A
DECFSZ    0X05, 1, A
BRA       B1

FIN:
BRA       FIN
END

1 Ответ

1 голос
/ 16 июня 2019
MOVLW 3         ; W = 3
MOVWF 0x05, A       ; (0x05) = 3
MOVLW 1         ; W = 1
MOVWF 0X10, A       ; (0x10) = 1

Как вы уже расшифровали:)

ORG 0X000
GOTO MAIN

Предположительно, артефакт разборки? Они пропускают вектор сброса. Вы можете игнорировать эти строки и не нужно использовать их в любом коде, который вы пишете.

MAIN: CLRF TRISC, A

ГЛАВНАЯ метка не имеет синтаксического значения. CLRF TRISC очищает буфер с тремя состояниями для порта C, устанавливая все выводы C в качестве выходных.

MOVLW 3
MOVWF 0x05, A
MOVLW 1
MOVWF 0X10, A

0x05 = 3 и 0x10 = 1

B1: MULLW 2
MOVF PRODL, 0, A
MOVWF LATC, A
MOVWF 0X10, A
DECFSZ 0X05, 1, A
BRA B1

Этот раздел представляет собой цикл. На каждой итерации мы удваиваем регистр W (умножаем его на 2). Результат сохраняется в регистрах PRODL и PRODH, и мы перемещаем содержимое PRODL (младший байт результата) обратно в W.

Затем мы копируем это в LATC (выход порта C) и 0x10.

После этого мы вычитаем 1 из 0x05.

BRA B1 возвращает нас к началу цикла.

FIN: BRA FIN
END

Они никогда не будут достигнуты, поэтому ничего не делайте.

...