eq->cons=atoi(pa); // и значения в eq->const eq->next=NULL; eq1=eq; p5++; }
else //если не первый эл
{eq2=new equ; //новый эл
strcpy(eq2->name,p); //запись в список имени eq2->name=p
eq2->cons=atoi(pa); // и значения в eq2->const
eq2->next=NULL;
eq1->next=eq2; //связывание элементов
eq1=eq2; //текущий эл eq1
}}
void AnalisIF(char *str) //поиск в списке нужной переменной и её значения и определение выполняется ли условная директива
{ eq1=eq; //указатель списка перемещаем в начало
int i=0; char *p,*pa;
// str="IF w EQ 2"
p=pa=strtok(str," "); // p=str="IF"
p=strtok(NULL," "); // p="w"
pa=strtok(NULL,strtok(NULL," ")); //pa="2"
while (eq1->next!=NULL) //поиск в списке нужной переменной
{ if (i>0) eq1=eq1->next;
if (strcmp(eq1->name,p)==0) //если нашли её имя { if (eq1->cons==atoi(pa)) //и значения сходятся, т.е. { //условие директивы выполняется то устанавл. признак компиляции
u=true; break; }} i++; }}
void ObrIF() //если условная директива выполн., то чтение команд
{ // и запись их в выходной файл
char str[80];
if (u==false) //если условная директива (???не) выполняется
{ do { //то чтение команд и запись их в выходной файл
fgets(str,40,file_r); fprintf(file_w,str); }
while (!strstr(str,"ENDIF")); //чтение, пока не конец условной директивы
}}
Підключаємий файл code.asm:
data segment
a db 55
b dw 44
c db 33
data ends
code segment
assume ds:data,cs:code
begin:
mov ax,data
mov ds,ax
mov cl,a
xor bx,bx
@a: add bx,b
sub bh,c
loop @a
mov c,bh
code ends
end begin
Текст вхідного файлу:
INCLUDE code.asm
w equ 2
z equ 5
data segment
a dw 200
data ends
mac1 MACRO b1,b2
mov b1,04ch
mov b2,3
int 21h
ENDM mac1
mac2 MACRO d1,d3
mov d1,35
xor d3,a
int 21h
ENDM mac2
code segment
assume ds:data,cs:code
begin:
mov ax,data
mov ds,ax
sub a,10
IF w EQ 2
mac1 dh,dl
mac2 ax,bx
ENDIF
code ends
end begin
Вихідні дані:формується той же файл (з ім’ям, заданим користувачем):
INCLUDE code.asm
data segment
a db 55
b dw 44
c db 33
data ends
code segment
assume ds:data,cs:code
begin:
mov ax,data
mov ds,ax
mov cl,a
xor bx,bx
@a: add bx,b
sub bh,c
loop @a
mov c,bh
code ends
end begin
w equ 2
z equ 5
data segment
a dw 200
data ends
mac1 MACRO b1,b2
mov b1,04ch
mov b2,3
int 21h
ENDM mac1
mac2 MACRO d1,d3
mov d1,35
xor d3,a
int 21h
ENDM mac2
code segment
assume ds:data,cs:code
begin:
mov ax,data
mov ds,ax
sub a,10
IF w EQ 2
mac1 dh,dl
mac2 ax,bx
ENDIF
code ends
end begin
Висновок: був вивчений принцип роботи препроцесору, а саме робота директив условної компіляції, директив визначення макросів, включення файлів користувача, обробка команд макросів.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.