Меня просят создать программу на LC3, которая распознает максимальную длину возрастающей подпоследовательности в последовательности чисел.
Ex. {1,2,3,5,2,2,4,5,6,8,3,4}
решение: максимальная возрастающая подпоследовательность: {2,2,4,5,6,8} , максимальная длина возрастающей подпоследовательности: 6
Для этого меня попросили создать подпрограмму с именем MAX_LEN, которая вычисляет max(x,y) двух чисел x,y и имеет входные данные x,y в R2,R5 и должна выдавать результат: max(x,y) в Р5. Также я должен использовать другой INC_SUB_LEN, который вычисляет длину первой возрастающей подпоследовательности с заданного адреса. Входной адрес — R0, а выходная длина должна быть в R2. Максимальная длина пока в R5. Я также должен использовать подпрограмму MAX_LEN. Большая последовательность, из которой мы будем находить подпоследовательности, хранится в адресе DATA, а ее длина — в адресе LENGTH. Мне также даются команды в конце LENGTH .FILL x5000 и DATA .FILL x5001.
Я новичок в программировании LC3, поэтому я написал свою программу на бумаге. Может ли кто-нибудь найти какие-либо ошибки в моем решении? если да, то как я могу их исправить??
Мое решение:
.ORIG x3000
LD R0,DATA
LD R1,DATA
LOOP1 JSR INC_SUB_LEN
ADD R1,R1,#1
LD R4,LENGTH
NOT R4,R4
ADD R4,R4,#1
ADD R3,R1,R4
BRn LOOP1
INC_SUB_LEN
LOOP ADD R2,R2,#1
ADD R4,R0,#0
LDR R6,R0,#1
LDR R0,R0,#1
NOT R6,R6
ADD R6,R6,#1
ADD R7,R4,R6
BRnz LOOP
JSR MAX_LEN
RET
MAX_LEN
NOT R5, R5
ADD R5, R5, #1
ADD R3,R2,R5
BRnz ELSE
ADD R5,R2,#0
NOT R5,R5
ADD R5,R5,#1
ELSE NOT R5,R5
ADD R5,R5,#1
RET
LENGTH .FILL x5000
DATA .FILL x5001
.END
-O3 -fno-delayed-branch
, чтобы ориентироваться на простую ISA с простыми режимами адресации, такими как LC3. Или, может быть, MSP430, 16-битный ISA. Кроме того, код в вашем вопросе довольно легкий для комментариев. Обычно вы хотите хотя бы описать, для чего используется каждый регистр. - person Peter Cordes   schedule 21.08.2018.fill
. Я не знаю, можете ли вы написать.fill 1, 2, 3
... или вам придется использовать отдельный.fill
для каждой записи массива, например.fill 1
/.fill 2
/.fill 3
в отдельных строках. (Возможно, вы захотите использовать имя метки, отличное отdata
, для начала массива, если это специально для LC3, например, раздел данных или что-то в этом роде.) - person Peter Cordes   schedule 21.08.2018my_array:
, чтобы вы могли ссылаться на это место с помощью символического имени, а не по адресу. Насколько я знаю, вы можете размещать данные где угодно, они не обязательно должны начинаться с.org 0x5001
. Данные и код — всего лишь байты в памяти. Что-то вродеmy_array .FILL #1
, затем на следующей строке.fill #2
. (вам может понадобиться#
перед числовыми литералами, которые я пропустил. Во всяком случае, это то, что показал первый поиск в Google. Я не знаю всех деталей синтаксиса LC3; это всего лишь одна из многих архитектур, о которых я смутно знаю. Это лучше, чем большинство игрушечных арок. - person Peter Cordes   schedule 21.08.2018