AS86 Установить исходный адрес (сборка x86) - PullRequest
0 голосов
/ 01 февраля 2020

Кто-нибудь знает, как установить исходный адрес, используя синтаксис AS86?

В NASM вы, например, добавили бы (в загрузчике B IOS): ORG 0x7c00.

Кто-нибудь знает, что такое эквивалент AS86? Или какой функциональный эквивалент был бы?

Я использую AS86, потому что я компилирую программы с выводом 16-битной сборки из B CC (компилятор Брюса C). Если кто-нибудь знает настоящий 16-битный C компилятор, который будет производить NASM-совместимую сборку, это также решило бы мою проблему (поскольку, в отличие от AS86, у меня не было проблем с получением необработанных двоичных файлов NASM для работы с использованием определенной памяти смещения адреса).

2/1 Редактировать с примером кода AS86:

ORG 0x7c00

USE16

mov ah, 0x0e
mov al, 0x61
xor bx, bx
int 0x10

ORG 0x7DFE
.word 0xAA55

Файл сгенерированного символа (кажется правильным):

+ 00007C00 ----- $start
+ 00007E00 ----- $end

И сгенерированный двоичный файл 512 байт, что означает (я думаю), что директива ORG в конце дополняет остальную часть файла таким же образом, как это происходит с NASM с использованием директивы times.

Спасибо!

Окончательное редактирование: Итак, это было решено. Исходя из полученной мной помощи, решение проблемы адреса отправителя состояло в том, чтобы поместить адрес отправителя в начале с помощью директивы ORG, а затем также использовать директиву ORG в конце, чтобы указать адрес памяти, по которому программа должна находиться в этот конкретный момент в файле. Затем файл на ассемблере должен быть скомпилирован в as86 с использованием опции -s для генерации файла символов.

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

Итак, после устранения этой проблемы тестовый код запускается при загрузке и печатает символ «a», как и ожидалось.

Еще раз спасибо всем.

1 Ответ

2 голосов
/ 01 февраля 2020

В первой проблеме нужно было использовать -s, как указано в комментарии Джестера.

Как вы заметили, код тогда выглядел правильно, но все равно не работал. Поэтому я собрал ваш код и разобрал вывод, и проблема стала ясной.

as86 использует синтаксис, отличный от nasm и других традиционных ассемблеров в стиле Intel. В частности, такая инструкция, как mov ah, 0x0e, анализируется как то, что вы можете понимать как mov ah, [0x0e]; это движение одного байта от адреса памяти 0x0e. Очевидно, вы намеревались загрузить непосредственное значение 0x0e, поэтому вам нужно написать mov ah, #0x0e.

Кажется, что было бы неплохо внимательно прочитать справочную страницу as86 прежде чем продолжить.

...