Я читаю и изучаю Элементы вычислительных систем, но я застрял в какой-то момент. Пример главы пропустить следующие 5 инструкций s можно найти здесь.
В любом случае, я пытаюсь реализовать виртуальную машину (или байтовый код для переводчика сборки), но я застрял, чтобы пропустить следующую 5 инструкций на одну точку.
Вы можете найти нотацию сборки здесь.
Цель состоит в том, чтобы внедрить транслятор, который преобразует конкретный байтовый код в этот код сборки.
Пример, который я успешно выполнил для байтового кода
push constant 5
который переводится на:
@5
D=A
@256
M=D
Как я уже сказал, язык ассемблера для Hack находится в ссылке, которую я предоставил, но в основном:
@5 // Load constant 5 to Register A
D=A // Assign the value in Reg A to Reg D
@256// Load constant 256 to Register A
M=D // Store the value found in Register D to Memory Location[A]
Хорошо, это было довольно прямо. По определению ячейка 256 памяти является вершиной стека. Итак,
push constant 5
push constant 98
будет переведен на:
@5
D=A
@256
M=D
@98
D=A
@257
M=D
что все отлично..
Я также хочу привести еще один пример:
push constant 5
push constant 98
add
переводится на:
@5
D=A
@256
M=D
@98
D=A
@257
M=D
@257 // Here starts the translation for 'add' // Load top of stack to A
D=M // D = M[A]
@256 // Load top of stack to A
A=M // A = M[A]
D=D+A
@256
M=D
Я думаю, что это довольно ясно.
Однако я понятия не имею, как я могу перевести байтовый код
eq
к сборке. Определение для eq выглядит следующим образом:
Три команды (eq, gt, lt) возвращают логические значения. ВМ представляет true и false как -1 (минус один, 0xFFFF) и 0 (ноль, 0x0000) соответственно.
Поэтому мне нужно поместить два значения в регистры A и D соответственно, что довольно просто. Но как я должен создать код сборки, который будет проверять значения и нажимать 1, если результат равен true или 0, если результат является ложным?
Код сборки, поддерживаемый для Hack Computer, выглядит следующим образом:
Я могу сделать что-то вроде:
push constant 5
push constant 6
sub
который будет удерживать значение 0, если 2 значения, нажатые в стек, равны или! 0, если нет, но как это помогает? Я попытался использовать D & A или D & M, но это тоже не помогло.
Я также могу ввести условный скачок, но как я должен знать, с какой инструкцией перейти? Код сборки Hack не имеет чего-то вроде "пропустить следующие 5 инструкций" или т.д.
[edit by Spektre] сводка целевой платформы, как я ее вижу
- 16-битная архитектура фон Неймана (адрес - 15 бит с 16-битным доступом к Word)
- Память данных 32KW (чтение/запись)
- Память инструкций (программ) 32KW (только для чтения)
- собственные 16-разрядные регистры A, D
- 16-разрядные регистры общего назначения R0-R15 отображаются в память данных с 0x0000 - 0x000F
- они наиболее вероятно используются также для:
SP(R0),LCL(R1),ARG(R2),This(R3),That(R4)
- Экран отображается в память данных на 0x4000-0x5FFF (512x256 B/W пикселей 8KW)
- Клавиатура сопоставляется с памятью данных на 0x6000 (код ASCII, если последний нажал клавишу?)