Я пытаюсь адаптировать программу, которая подсчитывает вхождения символа в файле, для хранения списка шестнадцатеричных адресов, где совпадения произошли в удаленной области памяти. Код:
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 одной инструкцией? Даже два было бы лучше, чем то, что у меня есть сейчас.