2012-04-05 1 views
7

Согласно DCPU specification, единственный раз, когда инструкция SET терпит неудачу, - это значение a является литералом.Можете ли вы написать на [ПК]?

Так будет ли следующая работа?

SET [PC],0x1000 

Более полезный вариант будет установка смещение PC, поэтому довольно странно, бесконечный цикл будет:

SET [PC+0x2],0x89C3 ; = SUB PC,0x2 
+0

Что такое "Спецификация DCPU"? Если есть, укажите ссылку. –

+1

@AaronDigulla, http://0x10c.com/doc/dcpu-16.txt – Matt

+1

+1 О, как я люблю воображаемые вычисления :) –

ответ

7

Возможно (= я думаю, что это должно работать, но я не пробовал) ,

Это называется «самомодифицирующимся» кодом и довольно распространен в 8-разрядной эре из-за ограниченности ОЗУ и б) ограниченного размера кода. Такой код очень мощный, но подвержен ошибкам. Если ваша база кода растет, это может быстро стать кошмаром для обслуживания.

Известные случаи использования:

  1. Windows 95 используется такой код для создания графики рендеринга кода в стеке.
  2. Вирусы и трояны используют это в качестве вектора атаки (кода записи в стеке или манипулировать адреса возврата к simluate JMP)
  3. SIMULATE заявления переключателя на C64
+0

Единственная разница, Я вижу, что вы не можете выполнять код в стеке с помощью DCPU, так как значения 'PC' находятся в совершенно другом пространстве памяти для стека/ram, поэтому' SET PC, ### 'не может быть сделано для перехода на стек. – Matt

+0

@Mat - Вы можете выполнить код в стеке с помощью DCPU. Взгляните на самую нижнюю часть спецификации DCPU. Дамп памяти этого кода. – flumpb

+0

@kisplit, вы можете поместить код в стек, но как вы к нему прыгаете? Этот дамп - это всего лишь исполняемый код. – Matt

4

Там нет никакого значения для [PC] поэтому я предполагаю, что вам нужно сделать это кругом, сохранив компьютер в том, что вы можете использовать в качестве указателя (реестра или памяти).

 
     SET A , PC 
     SET [A+3], 0x8dc3 ; SUB PC, 3 (if A can't be changed from outside SUB PC,2 works too.) 
+0

Этот код не работает, так как раздел кода использует те же номера, что и ram/stack.'A' после того, как этот оператор будет оценивать число, а затем' [A + 3] 'будет ссылаться на эту позицию в памяти, а не на секцию кода. – Matt

+1

@Mat - отдельных разделов нет. Вы можете написать код самообновления с помощью DCPU. – flumpb

 Смежные вопросы

  • Нет связанных вопросов^_^