Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КУРСОВАЯ СПО.DOC
Скачиваний:
9
Добавлен:
22.11.2019
Размер:
181.25 Кб
Скачать

5. Реализация

Тестирование процедуры gotoToAsm

1) если ch !=’;’ то выдаётся ошибка NOT_EXPECTED

2)если ch = =’;’ но name не найден в т.и. то выдаётся ошибка UNDECLARED_ID

3) если ch = =’;’ и name найден в т.и то name записывается в вых.файл

1)если name не обнаружено в т.и то Error(UNDECLARED_ID,lineNumber)

2) если name не обнаружено в т.и то запись name в вых файл и переход на новую строку

Внешнее тестирование

Пример №1: Вычислить 2 в степени 5

Текст программы:

var

result:integer;

a:integer;

power:integer;

label l1;

begin

power:=5;

a:=2;

result:=1;

l1:

result:= result*a;

power:=power-1;

if power > 0 then goto l1;

writeln(result);

end.

Текст программы на ассемблере:

.model small

.stack 128

.data

power dw ?

a dw ?

result dw ?

tmp_1 dw ?

st_1 db 4 dup(?),'$'

.code

write proc near

mov cl,16-4

mov di,0

Repeat:

mov ax,bx

shr ax,cl

and al,0Fh

add al,'0'

cmp al,'9'

jbe Digit09

add al,'A'-('9'+1)

Digit09:

mov st_1[di],al

inc di

sub cl,4

cmp cl,0

jge Repeat

lea dx, st_1

mov ah,9

int 21h

mov ah, 2

mov dl, 0Ah

int 21h

ret

write endp

main proc far

mov ax, @data

mov ds, ax

mov ax, 5

mov power, ax

mov ax, 2

mov a, ax

mov ax, 1

mov result, ax

l1:

mov ax, result

mov bx, a

mul bx

mov tmp_1, ax

mov ax, tmp_1

mov result, ax

mov ax, power

mov bx, 1

sub ax, bx

mov tmp_1, ax

mov ax, tmp_1

mov power, ax

mov ax, power

mov bx, 0

cmp ax, bx

jle els_1

jmp l1

els_1:

mov bx, result

call write

mov ah,1 ;waiting

int 21h

mov ax, 4C00h

int 21h

main endp

end main

На экран выводится число 0020 (в шестнадцатеричной СС)

Пример №2: Вычислить максимальное из трёх чисел (5, 20, 9)

Текст программы:

var

a1:integer;

a2:integer;

a3:integer;

max:integer;

begin

a1:=5;

a2:=20;

a3:=9;

if a1 > a2 then max:=a1;

else max:=a2;

if max < a3 then max:=a3;

writeln(max);

end.

Текст программы на ассемблере:

.model small

.stack 128

.data

max dw ?

a3 dw ?

a2 dw ?

a1 dw ?

st_1 db 4 dup(?),'$'

.code

write proc near

mov cl,16-4

mov di,0

Repeat:

mov ax,bx

shr ax,cl

and al,0Fh

add al,'0'

cmp al,'9'

jbe Digit09

add al,'A'-('9'+1)

Digit09:

mov st_1[di],al

inc di

sub cl,4

cmp cl,0

jge Repeat

lea dx, st_1

mov ah,9

int 21h

mov ah, 2

mov dl, 0Ah

int 21h

ret

write endp

main proc far

mov ax, @data

mov ds, ax

mov ax, 5

mov a1, ax

mov ax, 20

mov a2, ax

mov ax, 9

mov a3, ax

mov ax, a1

mov bx, a2

cmp ax, bx

jle els_1

mov ax, a1

mov max, ax

jmp nel_1

els_1:

mov ax, a2

mov max, ax

nel_1:

mov ax, max

mov bx, a3

cmp ax, bx

jge els_2

mov ax, a3

mov max, ax

els_2:

mov bx, max

call write

mov ah,1 ;waiting

int 21h

mov ax, 4C00h

int 21h

main endp

end main

На экран выводится число 0014 (в шестнадцатеричной СС)

Приложение

1.глобальные переменные:

enum SentenseType{EXPRESSION, IF_STATEMENT, GOTO,

WRITE, BEGIN, LABEL_STATE, UNKNOWN};

List<IdTableElement> IdTable;

FILE *sourceFile=NULL;

FILE *asmFile=NULL;

char buf[READING_STRING_SIZE]; //current string

int lineNumber=1; //current line

int recourse=-1;

int ifCounter=0;

int operationCounter=0;

char ch; //last char

2.процедура genUnicName:

void genUnicName(char firstFor[5], int n, char uni[ID_NAME_SIZE])

{

char strN[10];

itoa(n, strN, 10);

uni[0]=firstFor[0];

uni[1]=firstFor[1];

uni[2]=firstFor[2];

uni[3]=firstFor[3];

for(int i=0; i<2; ++i)

{

uni[i+4]=strN[i];

}

uni[6]='\0';

}

3.процедура analyseSentense

SentenseType analyseSentense()

{

SentenseType st=UNKNOWN;

//expression?

int i=0;

while (buf[i]!='\0')

{

if(buf[i]==':' && buf[i+1]=='=' )

{

st=EXPRESSION;

return st;

}

if (i>ID_NAME_SIZE)

break;

i++;

};

//writeln?

i=0;

char tmp[9];

for(i=0; i<8; i++)

{

tmp[i]=buf[i];

}

tmp[i]='\0';

if(stringComp(tmp,"writeln("))

{

st=WRITE;

return st;

}

//if?

if(stringComp(buf,"if"))

{

st=IF_STATEMENT;

return st;

}

//goto?

if(stringComp(buf,"goto"))

{

st=GOTO;

return st;

}

//begin?

if(stringComp(buf,"begin"))

{

st=BEGIN;

return st;

}

//label?

i=0;

char c=' ';

while (buf[i]!='\0')

{

c=buf[i];

i++;

}

if(c==':')

{

st=LABEL_STATE;

return st;

}

return st;

}