Наверх

Пред. След.  

Мини-ассемблер.

 

В предыдущей главе мы рассмотрели программку, которая из «промежуточного» текстового файла с машинными командами делает 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). Не путать программу на ассемблере и программу-ассемблер (т.е. транслятор)!

Если присмотреться внимательнее к коду, то можно заметить, что транслятором делаются два прохода. Во время второго подставляется смещение данных.

Хостинг от uCoz