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;
}