Можно ли сразу переместить счетчик программ на удаленный адрес памяти?
Я пытаюсь адаптировать программу, которая считает количество символов в файле, для хранения списка шестнадцатеричных адресов, по которым совпадения произошли, в удаленной ячейке памяти. Код:
011 0000 0000 0000 ;Codes x3000 as Load-address of program
0101 010 010 1 00000 ;R2 <- 0
0010 011 000010000 ;R3 <- M[x3012]
1111 0000 0010 0011 ;TRAP x23 (Loads INPUT into R0)
0110 001 011 000000 ;R1 <- M[R3]
;LOOP BEGINS HERE
0001 100 001 1 11100 ;R4 <- R1 - EOT
0000 010 000001000 ;If above = 0, exit loop
1001 001 001 111111 ;R1 <- NOT R1
0001 001 001 1 00001 ;R1 <- R1 + 1
0001 001 001 0 00 000 ;R1 <- R1 + R0
0000 101 000000001 ;If above != 0, do NOT increment counter
0001 010 010 1 00001 ;R2 <- R2 + 1 (increment counter)
0001 011 011 1 00001 ;R3 <- R3 + 1 (increments pointer to next char in file)
0110 001 011 000000 ;R1 <- M[R3] (loads next char into R1)
0000 111 111110110 ;BRnzp x3004 (unconditionally RETURN to loop start)
;LOOP ENDS HERE
0010 000 000000100 ;R0 <- M[x3013]
0001 000 000 0 00 010 ;R0 <- R0 + R2
1111 0000 0010 0001 ;TRAP x21 (OUTPUT)
1111 0000 0010 0101 ;TRAP x25 (HALT)
0011 0001 0000 0000 ;Codes x3100 for the starting address of the file
0000 000 000110000 ;ASCII template
Итак, моя программа начинается с адреса памяти x3000. Я хочу начать набор инструкций, которые будут обрабатывать список на x300B (ниже инструкции "increment R2"). Проблема в том, что я хочу начать список с x3500, и я не знаю "эффективного" способа добраться до него.
Мой первоначальный план состоял в том, чтобы использовать инструкцию Load Indirect (LDI), но из-за расширения знака 9-разрядное смещение допускает смещение не более x00FF = 0000 0000 1111 1111, что приводит меня только к x300C (x300B с программой). счетчик увеличен) до x310B.
Единственный реальный "обходной путь", который я нашел, - это использовать инструкции Load Effective Address (LEA) для сохранения адреса x310B в регистре (скажем, R5), затем сохранить значение x00FF в R6 и многократно добавлять R6 в R5. пока я не доберусь до x3408 (это заняло бы 3 инструкции ADD), после чего я сохраню значение x0092 в R6, добавлю его к R5, и, наконец, получу x3500 в R5.
В этот момент все остальное тривиально (сохраните R3 в (R5 + счетчик), что поместит адрес текущего совпадения в соответствующее "место" в списке).
На самом деле я этого еще не сделал, потому что весь метод перехода на x3500, который я описал выше, кажется действительно громоздким и неуклюжим. Я не могу избавиться от ощущения, что должен быть лучший, более быстрый способ переместить столько адресов памяти одновременно.
Можно ли перейти с x300C на x3500 за одну инструкцию? Даже два будут лучше, чем у меня сейчас.
1 ответ
Вы не захотите этого делать, это возможно, но более простой способ - использовать LD (код операции 0010) и LDR (код операции 0110). Нет необходимости заставлять ПК переходить на x3500 (что приведет к запуску данных в вашем массиве, что плохо)
У адреса есть биты 0011 0101 0000 0000 Код операции 0010 позволит вам вставить x3500 в регистр. Затем код операции 0110 позволит вам загрузить значения из вашего массива.