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

Я пытаюсь адаптировать программу, которая подсчитывает вхождения символа в файле, для хранения списка шестнадцатеричных адресов, где совпадения произошли в удаленной области памяти. Код:

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 (ниже инструкции «увеличить R2»). Проблема в том, что я хочу начать список с x3500 и не знаю «эффективного» способа добраться туда.

Мой первоначальный план состоял в том, чтобы использовать инструкцию Load Indirect (LDI), но из-за расширения знака 9-битное смещение допускает смещение не более счетчик увеличен) до x310B.

Единственный реальный «обходной путь», который я придумал, — это использовать инструкции Load Effective Address (LEA) для сохранения адреса x310B в регистре (скажем, R5), затем сохранить значение x00FF в R6 и многократно добавлять R6 к R5. пока я не доберусь до x3408 (для этого потребовалось бы 3 инструкции ADD), после чего я бы сохранил значение x0092 в R6, добавил бы его к R5, и НАКОНЕЦ получил бы x3500 в R5.

В этот момент все остальное тривиально (сохраните R3 в (R5 + счетчик), что поместит адрес текущего совпадения в соответствующее «место» в списке)

На самом деле я этого еще не делал, потому что весь описанный выше метод перехода на x3500 кажется очень громоздким и неуклюжим. Меня не покидает ощущение, что должен быть лучший и более быстрый способ одновременного перемещения такого количества адресов памяти.

Можно ли перейти с x300C на x3500 одной инструкцией? Даже два было бы лучше, чем то, что у меня есть сейчас.


person enharmonics    schedule 18.11.2017    source источник


Ответы (1)


Вы бы не хотели этого делать, это возможно, но более простым методом было бы использовать для этого LD (код операции 0010) и LDR (код операции 0110). Не нужно, чтобы ПК переходил на x3500 (что могло бы начать выполнение данных в вашем массиве, что плохо)

Если адрес содержит биты 0011 0101 0000 0000, код операции 0010 позволит вам вывести x3500 в регистр. Затем код операции 0110 позволит вам загрузить значения из вашего массива.

person Brandon    schedule 19.11.2017