как определить разницу между кодами операций lc3 и директивами процессоров lc3 - PullRequest
0 голосов
/ 21 ноября 2018

Я изучаю lc3 и пишу дизассемблер .У меня есть вопрос о том, как при чтении собранного кода lc3 определить разницу между кодом операции и директивой процессора (например, директивой .FILL).

Теперь инструкции LC3 имеют ширину 16 бит.Вот пример:

0000100000000111

Этот пример - инструкция BR (ветвь).Первые 4 цифры слева (0000) указывают на то, что это код операции BR, а 3 цифры после (100) - условия для проверки (отрицательный, нулевой и положительный, в этом порядке. Таким образом, 100 означает проверку только на отрицательный результат).110 будет означать тест на отрицательный или ноль и т. Д.).Если ни один из этих трех битов не установлен, то это фактически не инструкция BR, а директива процессора.Итак, следующее:

0000000001001001

первые 4 из левых чисел - 0000, поэтому обычно это будет инструкция BR, но поскольку ни один из битов Neg, Zero, Pos не установлен, то вместо этогоДиректива процессора .FILL, означающая, что все 16 битов вместо этого вычисляются в одно шестнадцатеричное число, в данном случае 0x0049.

Теперь это только один из 16 кодов операций.Я также случайно узнал, что код операции для команд TRAP (1111) имеет аналогичный особый случай, то есть если задан ЛЮБОЙ из тех же трех битов (плюс еще один справа), то это не инструкция TRAP.Теперь, поскольку опкоды 0000 и опкоды 1111 имеют эти особые случаи, имеет смысл, что промежуточные коды операций также должны иметь такие особые случаи.Но я просмотрел всю документацию, которую смог найти, и нигде, похоже, не упоминает эти случаи (хотя я знаю, что прав, прочитав файлы .lst, созданные ассемблером lc3).Кто-нибудь знает какие-либо документы, которые упоминают об этом?Или кто-нибудь еще знает об этих «особых случаях»?Спасибо

РЕДАКТИРОВАТЬ: Спасибо за ваш ответ, но я все еще не уверен, как я могу определить разницу между инструкцией и данными.Вот несколько строк, которые я только что скопировал из файла .lst:

(305A) 0059  0000000001011001 (  45)                 .FILL x0059
(305B) 0000  0000000000000000 (  45)                 .FILL x0000
(305C) FFD0  1111111111010000 (  46) RESET           .FILL xFFD0
(305D) 0045  0000000001000101 (  47) LINE1           .FILL x0045

Обратите внимание, что первые две строки и последние строки могут быть легко прочитаны как инструкции BR, если бы не тот факт, что ни одна из нихбиты NZP установлены.И то же самое касается 3-й строки и инструкций TRAP.Итак, что по этому поводу:

0101001001100000   ;; or 0x5260

Это инструкция AND или директива .FILL?Как сказать?

1 Ответ

0 голосов
/ 21 ноября 2018

.FILL может выдавать произвольные байты в выходной файл.

Буквально нет никакой разницы в машинном коде между ручным кодированием инструкции и ее выдачей с помощью .fill, в отличие от возможности ассемблера кодироватьэто из мнемоники + операнды .См. Как избежать выполнения переменных в сборке lc3 для примера.

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

Если вы встретите командное слово, которое не является действительной инструкцией LC-3, вы можете просто разобрать его как .fill 0x1234 или что-то еще, а затем перейти к следующему слову.Вот что делают существующие дизассемблеры для ISA, таких как ARM и x86.

...