Скачиваний:
17
Добавлен:
01.05.2014
Размер:
381.95 Кб
Скачать

Генерация ассемблерного кода

Генерация ассемблерного кода происходит после генерации последовательности атомов.

Ассемблерный код строится по следующему шаблону:

include macro.inc

.model SMALL

.stack 100h

data segment

ticonst label word

[dw xxxx]

...

tfconst label dword

[dd xxxx.xx]

...

tvar db [max_addr] dup(?)

data ends

text segment 'code'

assume cs:text, ds:data, es:data

p386

p387

main proc far

push ds

xor ax, ax

push ax

mov ax, data

mov ds, ax

mov es, ax

call openIO

[последовательности тетрад в формате макровызова]

call closeIO

ret

main endp

text ends

end main

Сегмент данных имеет следующие метки:

  • ticonst– адрес начала таблицы целых констант

  • tfconst– адрес начала таблицы вещественных констант

  • tvar– адрес области переменных

[max_addr]– переменная содержит количество байт в области переменных

Процедуры (описаны в файле macro.inc):

  • openIO– инициализация ввода/вывода

  • closeIO– закрытие ввода / вывода

Каждой тетраде промежуточного языка соответствует макрокоманда.

Пример

fmatr M1[6, 6], M2[2, 2];

float k;

int i, j;

const int sz = 6;

void main()

{

for (i = 0; i < sz; i = i + 1)

for (j = 0; j < sz; j = j + 1)

scan (M1[i, j]);

k = 0;

k = det(M1);

print (k);

}

include macro.inc

.model SMALL

.stack 100h

data segment

ticonst label word

dw 6

dw 2

dw 0

dw 1

dw 24

dw 4

tfconst label dword

tvar db 172 dup(?)

data ends

text segment 'code'

assume cs:text, ds:data, es:data

p386

p387

main proc far

push ds

xor ax, ax

push ax

mov ax, data

mov ds, ax

mov es, ax

call openIO

seti tvar+164, ticonst+4

@m1: li tvar+164, ticonst+0, tvar+168

jmpf tvar+168, @m20

jmp @m7

@m4: addi tvar+164, ticonst+6, tvar+168

seti tvar+164, tvar+168

jmp @m1

@m7: seti tvar+166, ticonst+4

@m8: li tvar+166, ticonst+0, tvar+168

jmpf tvar+168, @m19

jmp @m14

@m11: addi tvar+166, ticonst+6, tvar+168

seti tvar+166, tvar+168

jmp @m8

@m14: muli tvar+164, ticonst+8, tvar+168

muli tvar+166, ticonst+10, tvar+170

addi tvar+168, tvar+170, tvar+168

scanf tvar+0, 168

jmp @m11

@m19: jmp @m4

@m20: ftype ticonst+4, tvar+168

setf tvar+160, tvar+168

det tvar+0, 6, 6, tvar+168, 0, 0

setf tvar+160, tvar+168

printf tvar+160

@m25:

call closeIO

ret

main endp

text ends

end main

Соседние файлы в папке kurs