Как перевести сборку в двоичную?

Например:

        .text
        .align 2
        .global main
        .equ val,0x4712         # 16-bit binary code for 0x4712: 0100 0111 0001 0010
                                # Program code starts now
main:                           # This label must be main:, not MAIN: 
        movi r16,val            # WHAT WOULD THIS LINE BE IN BINARY?
        movi r17,0
loop:   addi r17,r17,1
        subi r16,r16,1 
        bne  r16,r0,loop
stop:   br   stop
.end 

Ответ 1

Вы имеете в виду, вручную?

Рукой, вы берете лист набора инструкций для своего микропроцессора, понимаете режимы адресации и другие проблемы с представлением данных, а затем преобразуете их в что-то удобное, например шестнадцатеричное обозначение.

Затем вам нужно будет получить эту информацию в памяти устройств, используя какой-то конкретный процесс (файл с диска, файл из последовательной линии, с ключом с передней панели с пучком переключателей).

Очевидно, что могут возникать всевозможные проблемы с цепочкой инструментов, которые вам нужно выяснить, чтобы получить ваш двоичный файл в машине. Если вы просто делаете это для смеха, шестнадцатеричного, карандаша и легальной площадки подходят многим годам.

Изменить -

Вам нужно знать несколько вещей.

Во-первых, операционные коды, а также коды op, вам нужно знать режимы адресации.

Рассмотрим этот 6502:

LDA #$00
LDA $00
LDA $1234

Это три разные инструкции на 6502.

Первая загружает Аккумулятор (A) с $00, 0 в шестнадцатеричном формате. Символ # указывает ассемблеру, что вы используете режим "немедленной" адресации (6502 имеет 13 режимов общей адресации).

Вторая загрузка Аккумулятора со значением ячейки памяти, расположенной по адресу $0000. На 6502 он имеет режим "нулевой страницы", поэтому он может более легко получить доступ к памяти с первой страницы памяти (адреса $0000- $00FF).

Третий загружает Аккумулятор со значением ячейки памяти, расположенной по адресу $1234. Это абсолютная адресация, просто указывая фактический адрес интересующей вас памяти.

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

Теперь, если вы посмотрите на руководство по указанию для 6502 и посмотрите инструкцию LDA, вы увидите разные двоичные значения для каждой команды.

Итак, в этом случае вы получите:

$A9 $00
$A5 $00
$AD $12 $34

Это двоичное (в шестнадцатеричном) представлении этих 3 инструкций.

Первый, $A9, предназначен для "немедленного" режима адресации, второй - $A5, для нулевой адресации страницы и, наконец, $AD для Absolute.

Также обратите внимание, что следующие операнды являются аргументами. Для 6502 они просто следуют в потоке байтов. Различные процессоры делают разные вещи. Обратите внимание, что для Absolute у нас есть 2 байта, 12 и 34 доллара, каждый из которых составляет половину общего 16-разрядного адреса. Я считаю, что это правильно, что самый важный байт адреса на первом месте, но он может быть отменен ($ A9 $34 $12).

Итак, это основа сборки вручную.

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

В 6502:

label:  LDA #$00
        JMP label

Если ваша сборка начинается с адреса $1000, это будет собрано в:

$A9 $00
$4C $10 $00

Если ваша сборка начинается с адреса $5555, то:

$A9 $00
$4C $55 $55

См. в инструкции JMP (Jump) ($ 4C) требуется адрес для перехода, а метка в вашей сборке относится к ее местоположению в программе. Удобно, в этом случае ярлык находится в самом начале. Но вы можете видеть, как адрес закодирован в конечный машинный код.

6502 EASY (действительно простая) сборка. Современных процессоров, ну, нет. Современные сборщики выполняют для вас много работы, и у вас более сложные процессоры с большими наборами инструкций, и такие вещи, как проблемы с выравниванием - все это отсутствует на 6502. Но, как ручной сборщик, вы несете ответственность за все эти нюансы.

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

Не обязательно хотите удержать вас от этого, но имейте в виду, что это может быть много работы.

Но в этом суть того, что вам нужно делать.

Ответ 2

Все ассемблеры, с которыми я работал, имели возможность включать двоичный файл в выходной список рядом с кодом при выполнении сборки.