Мини-ассемблер.
В предыдущей главе мы рассмотрели программку, которая из «промежуточного» текстового файла с машинными командами делает com-файл. Но как получить промежуточный файл? Вручную (со справочным пособием в руках), на самом деле, не хочется транслировать.
Составим свою программу-ассемблер. Но из-за своей лени я возьму не все команды для процессора 8086, а их некоторое подмножество. Синтаксис тоже изменю (по сравнению с ассемблером Tasm или Masm). Слова в новом ассемблере будет разделяться пробелами. Буквы – латинские, большие (в названиях команд и регистров). Первый операнд – приемник.
Попробую перечислить возможные команды. Если в команде на каком-то месте должен стоять только определенный регистр (из-за моей лени, для других просто пока не запрограммировано), то он будет выделен цветом. Если используется двухбайтное число (непосредственный операнд), то сперва указывается старший байт, потом младший (причем оба с префиксом 0x, как в языке Си).
MOV AX 0x0 0x5
MOV AL 0x7
MOV AX [DS,BX]
MOV [DS,BX] CX
MOV AX [DS,BX] 0x5 0xFF
MOV [DS,BX] CX 0x5 0xFF
MOV DS AX
MOV ES AX
MOV AX BX
MOV AX CX
MOV AX DX
ADD AX BX
ADD AX CX
ADD AX DX
SUB AX BX
SUB AX CX
SUB AX DX
CMP AX BX
CMP AX CX
CMP AX DX
PUSH AX
POP AX
INT 0x21
CALL 0xA1 0x0
RET
JMP 0xF 0xf1
JE 0xe
JNGE 0xe
JNG 0xe
JB 0xe
JBE 0xe
JP 0xe
JO 0xe
JS 0xe
JNE 0xe
JNL 0xe
JNLE 0xe
JNB 0xe
JNL 0xe
JNO 0xe
JNS 0xe
Данные же записываются в таком виде (тоже с разделением пробелами):
VAR MES1 3 0x30 0x31 0x24
Причем желательно их записывать в конце программы. Иначе через них придется перепрыгивать!
VAR – это означает, что мы имеем дело с переменной. MES1 – ее название. 3 – количество знаков (включая завершающий знак доллара). Далее – сами знаки в шестнадцатиричной форме. У нас записаны 0,1,$ (выведутся же на экран первые два).
И, наконец, ключевой пункт – вместо
MOV AX 0x0 0x5
можно записать
MOV AX OFFSET MES1
Программа вычислит и подставит нужное смещение.
Исходный текст должен находиться в файле Pr1.txt. Например такой:
MOV AH 0x09
MOV DX OFFSET MES1
INT 0x21
MOV AH 0x09
MOV DX OFFSET MES2
INT 0x21
MOV AX 0x4C 0x0
INT 0x21
VAR MES1 5 0x30 0x31 0xD 0xA 0x24
VAR MES2 5 0x30 0x31 0x31 0x31 0x24
Наша программа-ассемблер все откомпилирует и создаст промежуточный файл Pr.txt (его можно будет превратить в com-файл с помощью программы, описанной в предыдущей главе).
Текст программы весьма большой, можно его посмотреть по ссылке (папка проекта PrCom1). Не путать программу на ассемблере и программу-ассемблер (т.е. транслятор)!
Если присмотреться внимательнее к коду, то можно заметить, что транслятором делаются два прохода. Во время второго подставляется смещение данных.