masm32用不了。。。只能用masm611或者masm615。。。
asm.c
#include
#include "C0Compiler.h"
asmindex = 0;
sp = 0; //偏移基址的偏移量
x = 0;
scanfflag =
0; //读函数标志
printfflag =
0; //打印函数标志
//四元式转换成汇编码
void changetoasm()
{
datasegment(); //数据段定义
fprintf(fasm,"\n");
stacksegment();
fprintf(fasm,"\n");
fprintf(fasm,"CODE SEGMENT\n");
fprintf(fasm," ASSUME CS:CODE,DS:DATA,SS:STACK\n\n");
while(asmindex
{
if(strcmp(code[asmindex].var3,"main")==0)
{
fprintf(fasm,"MAIN
PROC FAR\n");
fprintf(fasm,"START:\n");
fprintf(fasm,"\t\tMOV AX,STACK\n");
fprintf(fasm,"\t\tMOV SS,AX\n");
fprintf(fasm,"\t\tMOV SP,S_BTM\n");
fprintf(fasm,"\t\tMOV AX,DATA\n");
fprintf(fasm,"\t\tMOV DS,AX\n");
fprintf(fasm,"\t\tXOR AX,AX\n");
fprintf(fasm,"\t\tMOV BP,S_BTM\n\n");
asmindex++;
sp = 0;
x = 0;
proasm();
fprintf(fasm,"EXIT:\n");
fprintf(fasm,"\t\tMOV AX,4C00H\n");
fprintf(fasm,"\t\tINT 21H\n");
fprintf(fasm,"MAIN ENDP\n\n");
}
else
{
pa = 0;
x =
0; //从0开始存储信息
sp = 0;
strcpy(proname,code[asmindex].var3);
fprintf(fasm,"%s
PROC NEAR\n",proname);
asmindex++;
//对参数声明的处理
while(strcmp(code[asmindex].op,"para")==0)
{
sp++; //腾出空间给参数
insertaddress();
pa++; //参数个数加1
asmindex++;
//跳到下一条四元式
}
//寄存器入栈
fprintf(fasm,"\t\tPUSH AX\n");
sp++;
fprintf(fasm,"\t\tPUSH BX\n");
sp++;
fprintf(fasm,"\t\tPUSH CX\n");
sp++;
fprintf(fasm,"\t\tPUSH DX\n");
sp++;
fprintf(fasm,"\t\tPUSH SI\n");
sp++;
fprintf(fasm,"\t\tPUSH DI\n");
sp++;
fprintf(fasm,"\t\tPUSH BP\n\n");
sp++;
sp++;
fprintf(fasm,"\t\tMOV BP,SP\n");
fprintf(fasm,"\t\tADD BP,%d\n",2*(8+pa));
proasm();
fprintf(fasm,"RET%s:\n",proname);
fprintf(fasm,"\t\tSUB BP,%d\n",2*(8+pa));
fprintf(fasm,"\t\tMOV SP,BP\n");
fprintf(fasm,"\t\tPOP BP\n");
fprintf(fasm,"\t\tPOP DI\n");
fprintf(fasm,"\t\tPOP SI\n");
fprintf(fasm,"\t\tPOP DX\n");
fprintf(fasm,"\t\tPOP CX\n");
fprintf(fasm,"\t\tPOP BX\n");
fprintf(fasm,"\t\tPOP AX\n");
fprintf(fasm,"\t\tRET %d\n",pa*2);
fprintf(fasm,"%s ENDP\n",proname);
}
asmindex++;
}
if(scanfflag>0)
{
scanfint();
fprintf(fasm,"\n");
}
if(printfflag>0)
{
printfint(); //打印整数的函数
printfchar();
fprintf(fasm,"\n");
}
fprintf(fasm,"CODE ENDS\n");
fprintf(fasm,"\t\tEND MAIN\n");
return ;
}
//数据段的汇编码生成
void datasegment()
{
fprintf(fasm,"DATA SEGMENT\n");
while (strcmp(code[asmindex].op,"const")==0)
{
if
(strcmp(code[asmindex].var1,"int")==0 ||
strcmp(code[asmindex].var1,"float")==0)
fprintf(fasm,"\t%s\tDW\t%s\n",code[asmindex].var3,code[asmindex].var2);
else
fprintf(fasm,"\t%s\tDW\t\'%s\'\n",code[asmindex].var3,code[asmindex].var2);
asmindex++;
}
while(strcmp(code[asmindex].op,"int")==0 ||
strcmp(code[asmindex].op,"float")==0 ||
strcmp(code[asmindex].op,"char")==0)
{
fprintf(fasm,"\t%s\tDW\t?\n",code[asmindex].var3);
asmindex++;
}
fprintf(fasm,"\tINDATA\tDB\t12 DUP(?)\n");
fprintf(fasm,"\tRESULTS DB
0,0,0,0,0,'$'\n");
fprintf(fasm,"\tDIVISORS DW
10000,1000,100,10,1\n");
fprintf(fasm,"\tRESULT\tDW\t0\n");
fprintf(fasm,"\tSTRING\tDB\t50 DUP(?)\n");
fprintf(fasm,"DATA ENDS\n");
return ;
}
//堆栈段定义
void stacksegment()
{
fprintf(fasm,"STACK SEGMENT PARA STACK\n");
fprintf(fasm,"\tS_AREA\tDW\t200H
DUP(?)\n");
fprintf(fasm,"\tS_BTM\tEQU\t$-S_AREA\n");
fprintf(fasm,"STACK ENDS\n");
return ;
}
//函数体的转换,不处理end语句,遇到end返回
void proasm()
{
while (strcmp(code[asmindex].op,"const")==0)
{
sp++;
if
(strcmp(code[asmindex].var1,"int")==0 ||
strcmp(code[asmindex].var1,"float")==0)
fprintf(fasm,"\t\tMOV AX,%s\n",code[asmindex].var2);
else
fprintf(fasm,"\t\tMOV AX,\'%s\'\n",code[asmindex].var2);
fprintf(fasm,"\t\tPUSH AX\n");
insertaddress();
asmindex++;
}
while(strcmp(code[asmindex].op,"int")==0 ||
strcmp(code[asmindex].op,"float")==0 ||
strcmp(code[asmindex].op,"char")==0)
{
sp++;
// fprintf(fasm,"\t\tMOV AX,0\n");
// fprintf(fasm,"\t\tPUSH AX\n");
// fprintf(fasm,"\t\tSUB SP,2\n");
fprintf(fasm,"\t\tMOV SP,BP\n");
fprintf(fasm,"\t\tSUB SP,%d\n",2*sp);
insertaddress();
asmindex++;
}
while(strcmp(code[asmindex].op,"end")!=0)
{
if(strcmp(code[asmindex].op,"delete")==0)
{
asmindex++;
continue
;
}
if(strcmp(code[asmindex].op,"+
")==0) addasm();
if(strcmp(code[asmindex].op,"-
")==0) subasm();
if(strcmp(code[asmindex].op,"*
")==0) mulasm();
if(strcmp(code[asmindex].op,"/
")==0) divasm();
if(strcmp(code[asmindex].op,">
")==0) aboveasm();
if(strcmp(code[asmindex].op,">=")==0)
aeqasm();
if(strcmp(code[asmindex].op,"<
")==0) lowasm();
if(strcmp(code[asmindex].op,"<=")==0)
leqasm();
if(strcmp(code[asmindex].op,"!=")==0)
neqasm();
if(strcmp(code[asmindex].op,"==")==0)
equasm();
if(strcmp(code[asmindex].op,"=
")==0) becasm();
if(strcmp(code[asmindex].op,"setlab")==0)
setlabasm();
if(strcmp(code[asmindex].op,"scanf")==0)
{
scanfasm();
scanfflag++; //表明需要读函数
}
if(strcmp(code[asmindex].op,"print")==0)
{
printfasm();
printfflag++; //表明需要打印函数
}
if(strcmp(code[asmindex].op,"neq")==0)
negasm();
if(strcmp(code[asmindex].op,"jmp")==0)
jmpasm();
if(strcmp(code[asmindex].op,"parav")==0)
paravasm();
if(strcmp(code[asmindex].op,"call")==0)
callasm();
if(strcmp(code[asmindex].op,"ret")==0)
retasm();
asmindex++;
}
return ;
}
//加法转换汇编码
void addasm()
{
int offset1,offset2,offset3;
if(code[asmindex].var3[0]=='$') {
sp++;
fprintf(fasm,"\t\tMOV SP,BP\n");
fprintf(fasm,"\t\tSUB SP,%d\n",2*sp);
insertaddress();
}
offset1 =
lookupaddress(code[asmindex].var1);
offset2 =
lookupaddress(code[asmindex].var2);
offset3 =
lookupaddress(code[asmindex].var3);
if(offset1==-1) {
if((code[asmindex].var2[0]>='a'
&&
code[asmindex].var2[0]<='z') ||
(code[asmindex].var2[0]>='A'
&&
code[asmindex].var2[0]<='Z'))
fprintf(fasm,"\t\tMOV AX,\'%s\'\n",code[asmindex].var1);
else
fprintf(fasm,"\t\tMOV AX,%s\n",code[asmindex].var1);
}
else fprintf(fasm,"\t\tMOV AX,[BP-%d]\n",offset1*2);
if(offset2==-1) {
if((code[asmindex].var2[0]>='a'
&&
code[asmindex].var2[0]<='z') ||
(code[asmindex].var2[0]>='A'
&&
code[asmindex].var2[0]<='Z'))
fprintf(fasm,"\t\tADD AX,\'%s\'\n",code[asmindex].var2);
else
fprintf(fasm,"\t\tADD AX,%s\n",code[asmindex].var2);
}
else fprintf(fasm,"\t\tADD AX,[BP-%d]\n",offset2*2);
if(offset3==-1)
fprintf(fasm,"\t\tMOV %s,AX\n",code[asmindex].var3);
else fprintf(fasm,"\t\tMOV [BP-%d],AX\n",offset3*2);
return ;
}
//减法转换汇编码
void subasm()
{
int offset1,offset2,offset3;
if(code[asmindex].var3[0]=='$')
{
sp++;
// fprintf(fasm,"\t\tMOV AX,0\n");
// fprintf(fasm,"\t\tPUSH AX\n");
// fprintf(fasm,"\t\tSUB SP,2\n");
fprintf(fasm,"\t\tMOV SP,BP\n");
fprintf(fasm,"\t\tSUB SP,%d\n",2*sp);
insertaddress();
}
offset1 =
lookupaddress(code[asmindex].var1);
offset2 =
lookupaddress(code[asmindex].var2);
offset3 =
lookupaddress(code[asmindex].var3);
if(offset1==-1) {
if((code[asmindex].var2[0]>='a'
&&
code[asmindex].var2[0]<='z') ||
(code[asmindex].var2[0]>='A'
&&
code[asmindex].var2[0]<='Z'))
fprintf(fasm,"\t\tMOV AX,\'%s\'\n",code[asmindex].var1);
else
fprintf(fasm,"\t\tMOV AX,%s\n",code[asmindex].var1);
}
else fprintf(fasm,"\t\tMOV AX,[BP-%d]\n",offset1*2);
if(offset2==-1) {
if((code[asmindex].var2[0]>='a'
&&
code[asmindex].var2[0]<='z') ||
(code[asmindex].var2[0]>='A'
&&
code[asmindex].var2[0]<='Z'))
fprintf(fasm,"\t\tSUB AX,\'%s\'\n",code[asmindex].var2);
else
fprintf(fasm,"\t\tSUB AX,%s\n",code[asmindex].var2);
}
else fprintf(fasm,"\t\tSUB AX,[BP-%d]\n",offset2*2);
if(offset3==-1)
fprintf(fasm,"\t\tMOV %s,AX\n",code[asmindex].var3);
else fprintf(fasm,"\t\tMOV [BP-%d],AX\n",offset3*2);
return ;
}
//乘法转换汇编码
void mulasm()
{
int offset1,offset2,offset3;
if(code[asmindex].var3[0]=='$')
{
sp++;
fprintf(fasm,"\t\tMOV SP,BP\n");
fprintf(fasm,"\t\tSUB SP,%d\n",2*sp);
insertaddress();
}
offset1 =
lookupaddress(code[asmindex].var1);
offset2 =
lookupaddress(code[asmindex].var2);
offset3 = lookupaddress(code[asmindex].var3);
if(offset1==-1) {
if
((code[asmindex].var2[0]>='a'
&&
code[asmindex].var2[0]<='z') ||
(code[asmindex].var2[0]>='A'&&code[asmindex].var2[0]<='Z'))
fprintf(fasm,"\t\tMOV AX,\'%s\'\n",code[asmindex].var1);
else
fprintf(fasm,"\t\tMOV AX,%s\n",code[asmindex].var1);
}
else fprintf(fasm,"\t\tMOV AX,[BP-%d]\n",offset1*2);
if(offset2==-1) {
if( code[asmindex].var2[0]=='-'
|| (code[asmindex].var2[0]>='0'
&&
code[asmindex].var2[0]<='9')) {
fprintf(fasm,"\t\tMOV BX,%s\n",code[asmindex].var2);
fprintf(fasm,"\t\tIMUL BX\n");
}
else if
((code[asmindex].var2[0]>='a'
&&
code[asmindex].var2[0]<='z') ||
(code[asmindex].var2[0]>='A'&&code[asmindex].var2[0]<='Z')){
fprintf(fasm,"\t\tMOV BX,\'%s\'\n",code[asmindex].var2);
fprintf(fasm,"\t\tIMUL BX\n");
}
else
fprintf(fasm,"\t\tIMUL %s\n",code[asmindex].var2);
}
else fprintf(fasm,"\t\tIMUL WORD PTR [BP-%d]\n",offset2*2);
if(offset3==-1)
fprintf(fasm,"\t\tMOV %s,AX\n",code[asmindex].var3);
else fprintf(fasm,"\t\tMOV [BP-%d],AX\n",offset3*2);
return ;
}
//除法转换汇编码
void divasm()
{
int offset1,offset2,offset3;
if(code[asmindex].var3[0]=='$')
{
sp++;
fprintf(fasm,"\t\tMOV SP,BP\n");
fprintf(fasm,"\t\tSUB SP,%d\n",2*sp);
insertaddress();
}
offset1 =
lookupaddress(code[asmindex].var1);
offset2 =
lookupaddress(code[asmindex].var2);
offset3 = lookupaddress(code[asmindex].var3);
if(offset1==-1) {
if
((code[asmindex].var2[0]>='a'
&&
code[asmindex].var2[0]<='z') ||
(code[asmindex].var2[0]>='A'&&code[asmindex].var2[0]<='Z'))
fprintf(fasm,"\t\tMOV AX,\'%s\'\n",code[asmindex].var1);
else
fprintf(fasm,"\t\tMOV AX,%s\n",code[asmindex].var1);
}
else fprintf(fasm,"\t\tMOV AX,[BP-%d]\n",offset1*2);
fprintf(fasm,"\t\tCWD\n");
if(offset2==-1) {
if
((code[asmindex].var2[0]>='0'
&&
code[asmindex].var2[0]<='9')) {
fprintf(fasm,"\t\tMOV BX,%s\n",code[asmindex].var2);
fprintf(fasm,"\t\tIDIV BX\n");
}
else if
((code[asmindex].var2[0]>='a'
&&
code[asmindex].var2[0]<='z') ||
(code[asmindex].var2[0]>='A'&&code[asmindex].var2[0]<='Z')){
fprintf(fasm,"\t\tMOV BX,\'%s\'\n",code[asmindex].var2);
fprintf(fasm,"\t\tIDIV BX\n");
}
else
fprintf(fasm,"\t\tIDIV %s\n",code[asmindex].var2);
}
else fprintf(fasm,"\t\tIDIV WORD PTR [BP-%d]\n",offset2*2);
if(offset3==-1)
fprintf(fasm,"\t\tMOV %s,AX\n",code[asmindex].var3);
else fprintf(fasm,"\t\tMOV [BP-%d],AX\n",offset3*2);
return ;
}
//>转换汇编码
void aboveasm()
{
int offset1,offset2;
offset1 =
lookupaddress(code[asmindex].var1);
offset2 =
lookupaddress(code[asmindex].var2);
if(offset1==-1) {
if
(code[asmindex].var2[0]>='0'
&&
code[asmindex].var2[0]<='9')
fprintf(fasm,"\t\tMOV AX,%s\n",code[asmindex].var1);
else
fprintf(fasm,"\t\tMOV AX,\'%s\'\n",code[asmindex].var1);
}
else fprintf(fasm,"\t\tMOV AX,[BP-%d]\n",offset1*2);
if(offset2==-1) {
if(code[asmindex].var2[0]>='0'
&&
code[asmindex].var2[0]<='9')
fprintf(fasm,"\t\tMOV BX,%s\n",code[asmindex].var2);
else
fprintf(fasm,"\t\tMOV BX,\'%s\'\n",code[asmindex].var2);
}
else fprintf(fasm,"\t\tMOV BX,[BP-%d]\n",offset2*2);
fprintf(fasm,"\t\tCMP AX,BX\n");
asmindex++;
fprintf(fasm,"\t\tJLE %s\n",code[asmindex].var3);
return ;
}
//>=转换汇编码
void aeqasm()
{
int offset1,offset2;
offset1 =
lookupaddress(code[asmindex].var1);
offset2 =
lookupaddress(code[asmindex].var2);
if(offset1==-1) {
if(code[asmindex].var2[0]>='0'
&&
code[asmindex].var2[0]<='9')
fprintf(fasm,"\t\tMOV AX,%s\n",code[asmindex].var1);
else
fprintf(fasm,"\t\tMOV AX,\'%s\'\n",code[asmindex].var1);;
}
else fprintf(fasm,"\t\tMOV AX,[BP-%d]\n",offset1*2);
if(offset2==-1) {
if(code[asmindex].var2[0]>='0'
&&
code[asmindex].var2[0]<='9')
fprintf(fasm,"\t\tMOV BX,%s\n",code[asmindex].var2);
else
fprintf(fasm,"\t\tMOV BX,\'%s\'\n",code[asmindex].var2);;
}
else fprintf(fasm,"\t\tMOV BX,[BP-%d]\n",offset2*2);
fprintf(fasm,"\t\tCMP AX,BX\n");
asmindex++;
fprintf(fasm,"\t\tJL %s\n",code[asmindex].var3);
return ;
}
//
void lowasm()
{
int offset1,offset2;
offset1 =
lookupaddress(code[asmindex].var1);
offset2 =
lookupaddress(code[asmindex].var2);
if(offset1==-1) {
if(code[asmindex].var2[0]>='0'
&&
code[asmindex].var2[0]<='9')
fprintf(fasm,"\t\tMOV AX,%s\n",code[asmindex].var1);
else
fprintf(fasm,"\t\tMOV AX,\'%s\'\n",code[asmindex].var1);;
}
else fprintf(fasm,"\t\tMOV AX,[BP-%d]\n",offset1*2);
if(offset2==-1) {
if(code[asmindex].var2[0]>='0'
&&
code[asmindex].var2[0]<='9')
fprintf(fasm,"\t\tMOV BX,%s\n",code[asmindex].var2);
else
fprintf(fasm,"\t\tMOV BX,\'%s\'\n",code[asmindex].var2);
}
else fprintf(fasm,"\t\tMOV BX,[BP-%d]\n",offset2*2);
fprintf(fasm,"\t\tCMP AX,BX\n");
asmindex++;
fprintf(fasm,"\t\tJGE %s\n",code[asmindex].var3);
return ;
}
//<=转换汇编码
void leqasm()
{
int offset1,offset2;
offset1 =
lookupaddress(code[asmindex].var1);
offset2 =
lookupaddress(code[asmindex].var2);
if(offset1==-1) {
if(code[asmindex].var2[0]>='0'
&&
code[asmindex].var2[0]<='9')
fprintf(fasm,"\t\tMOV AX,%s\n",code[asmindex].var1);
else
fprintf(fasm,"\t\tMOV AX,\'%s\'\n",code[asmindex].var1);;
}
else fprintf(fasm,"\t\tMOV AX,[BP-%d]\n",offset1*2);
if(offset2==-1) {
if(code[asmindex].var2[0]>='0'
&&
code[asmindex].var2[0]<='9')
fprintf(fasm,"\t\tMOV BX,%s\n",code[asmindex].var2);
else
fprintf(fasm,"\t\tMOV BX,\'%s\'\n",code[asmindex].var2);
}
else fprintf(fasm,"\t\tMOV BX,[BP-%d]\n",offset2*2);
fprintf(fasm,"\t\tCMP AX,BX\n");
asmindex++;
fprintf(fasm,"\t\tJG %s\n",code[asmindex].var3);
return ;
}
//!=转换汇编码
void neqasm()
{
int offset1,offset2;
offset1 =
lookupaddress(code[asmindex].var1);
offset2 =
lookupaddress(code[asmindex].var2);
if(offset1==-1) {
if(code[asmindex].var2[0]>='0'
&&
code[asmindex].var2[0]<='9')
fprintf(fasm,"\t\tMOV AX,%s\n",code[asmindex].var1);
else
fprintf(fasm,"\t\tMOV AX,\'%s\'\n",code[asmindex].var1);;
}
else fprintf(fasm,"\t\tMOV AX,[BP-%d]\n",offset1*2);
if(offset2==-1) {
if(code[asmindex].var2[0]>='0'
&&
code[asmindex].var2[0]<='9')
fprintf(fasm,"\t\tMOV BX,%s\n",code[asmindex].var2);
else
fprintf(fasm,"\t\tMOV BX,\'%s\'\n",code[asmindex].var2);
}
else fprintf(fasm,"\t\tMOV BX,[BP-%d]\n",offset2*2);
fprintf(fasm,"\t\tCMP AX,BX\n");
asmindex++;
fprintf(fasm,"\t\tJE %s\n",code[asmindex].var3);
return ;
}
//==转换汇编码
void equasm()
{
int offset1,offset2;
offset1 =
lookupaddress(code[asmindex].var1);
offset2 =
lookupaddress(code[asmindex].var2);
if(offset1==-1) {
if(code[asmindex].var2[0]>='0'
&&
code[asmindex].var2[0]<='9')
fprintf(fasm,"\t\tMOV AX,%s\n",code[asmindex].var1);
else
fprintf(fasm,"\t\tMOV AX,\'%s\'\n",code[asmindex].var1);;
}
else fprintf(fasm,"\t\tMOV AX,[BP-%d]\n",offset1*2);
if(offset2==-1) {
if(code[asmindex].var2[0]>='0'
&&
code[asmindex].var2[0]<='9')
fprintf(fasm,"\t\tMOV BX,%s\n",code[asmindex].var2);
else
fprintf(fasm,"\t\tMOV BX,\'%s\'\n",code[asmindex].var2);
}
else fprintf(fasm,"\t\tMOV BX,[BP-%d]\n",offset2*2);
fprintf(fasm,"\t\tCMP AX,BX\n");
asmindex++;
fprintf(fasm,"\t\tJNE %s\n",code[asmindex].var3);
return ;
}
//=转换汇编码
void becasm()
{
int offset1,offset3;
if(code[asmindex].var3[0]=='$')
{
sp++;
// fprintf(fasm,"\t\tMOV AX,0\n");
// fprintf(fasm,"\t\tPUSH AX\n");
// fprintf(fasm,"\t\tSUB SP,2\n");
fprintf(fasm,"\t\tMOV SP,BP\n");
fprintf(fasm,"\t\tSUB SP,%d\n",2*sp);
insertaddress();
}
offset1 =
lookupaddress(code[asmindex].var1);
offset3 = lookupaddress(code[asmindex].var3);
if(offset1==-1) {
if(code[asmindex].var2[0]>='0'
&&
code[asmindex].var2[0]<='9')
fprintf(fasm,"\t\tMOV AX,%s\n",code[asmindex].var1);
else
fprintf(fasm,"\t\tMOV AX,\'%s\'\n",code[asmindex].var1);;
}
else fprintf(fasm,"\t\tMOV AX,[BP-%d]\n",offset1*2);
if(offset3==-1)
fprintf(fasm,"\t\tMOV %s,AX\n",code[asmindex].var3);
else fprintf(fasm,"\t\tMOV [BP-%d],AX\n",offset3*2);
return ;
}
//插入标签转换汇编码
void setlabasm()
{
fprintf(fasm,"%s:\n",code[asmindex].var3);
}
//建立地址结构
void insertaddress()
{
strcpy(tableasm[x].name,code[asmindex].var3);
tableasm[x].address =
sp; x++;
}
//查结构数组,返回address,查找失败返回-1
int lookupaddress(char name[])
{
int i = 0;
//查的是整数,返回-1
if(name[0]=='+'||name[0]=='-'||name[0]>='0'&&name[0]<='9')
return -1;
//查的是标志符
if(name[0]!='$')
{
while(tableasm[i].name[0]!='$'&&i
{
if(strcmp(tableasm[i].name,name)==0)
return tableasm[i].address;
i++;
}
return -1;
}
else
{
while(i
{
if(strcmp(tableasm[i].name,name)==0)
return tableasm[i].address;
i++;
}
return -1;
}
}
//标准输入的代码转换
void scanfasm()
{
int offset3;
fprintf(fasm,"\t\tCALL SCANFINT\n");
offset3 =
lookupaddress(code[asmindex].var3);
if(offset3==-1)
fprintf(fasm,"\t\tMOV %s,AX\n",code[asmindex].var3);
else fprintf(fasm,"\t\tMOV [BP-%d],AX\n",2*offset3);
return ;
}
//标准输出函数
void scanfint()
{
fprintf(fasm,"SCANFINT PROC NEAR\n");
fprintf(fasm,"\t\tLEA DI,INDATA\n");
fprintf(fasm,"READ:\n");
fprintf(fasm,"\t\tMOV AH,1\n");
fprintf(fasm,"\t\tINT 21H\n");
fprintf(fasm,"\t\tMOV BYTE PTR
[DI],AL\n");
fprintf(fasm,"\t\tINC DI\n");
fprintf(fasm,"\t\tCMP AL,0DH\n");
fprintf(fasm,"\t\tJNE READ\n\n");
fprintf(fasm,"\t\tMOV DI,OFFSET
INDATA\n");
fprintf(fasm,"\t\tMOV CX,10\n");
fprintf(fasm,"\t\tMOV DX,0\n");
fprintf(fasm,"\t\tMOV BL,BYTE
PTR [DI]\n");
fprintf(fasm,"\t\tCMP BL,'+'\n");
fprintf(fasm,"\t\tJE SIGN\n");
fprintf(fasm,"\t\tCMP BL,'-'\n");
fprintf(fasm,"\t\tJE SIGN\n");
fprintf(fasm,"\t\tJMP DIGITS\n\n");
fprintf(fasm,"SIGN:\n");
fprintf(fasm,"\t\tINC DI\n\n");
fprintf(fasm,"DIGITS:\n");
fprintf(fasm,"\t\tMOV BL,BYTE
PTR [DI]\n");
fprintf(fasm,"\t\tCMP BL,'0'\n");
fprintf(fasm,"\t\tJB ENDVAL\n");
fprintf(fasm,"\t\tCMP BL,'9'\n");
fprintf(fasm,"\t\tJA ENDVAL\n");
fprintf(fasm,"\t\tSUB BL,30H\n");
fprintf(fasm,"\t\tMOV BH,0\n");
fprintf(fasm,"\t\tMOV AX,DX\n");
fprintf(fasm,"\t\tMUL CX\n");
fprintf(fasm,"\t\tADD AX,BX\n");
fprintf(fasm,"\t\tMOV DX,AX\n");
fprintf(fasm,"\t\tINC DI\n");
fprintf(fasm,"\t\tJMP DIGITS\n\n");
fprintf(fasm,"ENDVAL:\n");
fprintf(fasm,"\t\tMOV AX,DX\n\n");
fprintf(fasm,"\t\tMOV DI,OFFSET INDATA\n");
fprintf(fasm,"\t\tMOV BL,BYTE
PTR [DI]\n");
fprintf(fasm,"\t\tCMP BL,'-'\n");
fprintf(fasm,"\t\tJNE SCANFINTRET\n");
fprintf(fasm,"\t\tNEG AX\n\n");
fprintf(fasm,"SCANFINTRET:\n");
fprintf(fasm,"\t\tMOV BX,AX\n");
fprintf(fasm,"\t\tMOV DL,0AH\n");
fprintf(fasm,"\t\tMOV AH,02H\n");
fprintf(fasm,"\t\tINT 21H\n");
fprintf(fasm,"\t\tMOV DL,0DH\n");
fprintf(fasm,"\t\tMOV AH,02H\n");
fprintf(fasm,"\t\tINT 21H\n");
fprintf(fasm,"\t\tMOV AX,BX\n");
fprintf(fasm,"\t\tRET\n");
fprintf(fasm,"SCANFINT ENDP\n"); }
//标准输出的代码转换
void printfasm()
{
int i=0,offset2;
if(code[asmindex].var1[0]!='\0')
{
while(code[asmindex].var1[i]!='\0')
{
fprintf(fasm,"\t\tMOV STRING+%d,'%c'\n",i,code[asmindex].var1[i]);
i++;
}
fprintf(fasm,"\t\tMOV STRING+%d,' '\n",i);
fprintf(fasm,"\t\tMOV STRING+%d,'$'\n",i+1);
fprintf(fasm,"\t\tMOV DI,OFFSET STRING\n");
fprintf(fasm,"\t\tMOV DX,DI\n");
fprintf(fasm,"\t\tMOV AH,9\n");
fprintf(fasm,"\t\tINT 21H\n");
if(code[asmindex].var2[0]!='
')
{
offset2 =
lookupaddress(code[asmindex].var2);
if(offset2==-1)
fprintf(fasm,"\t\tMOV AX,%s\n",code[asmindex].var2);
else
fprintf(fasm,"\t\tMOV AX,[BP-%d]\n",2*offset2);
if(strcmp(code[asmindex].var3,"int")==0
|| strcmp(code[asmindex].var3,"float")==0)
fprintf(fasm,"\t\tCALL PRINTFINT\n");
if(strcmp(code[asmindex].var3,"char")==0)
fprintf(fasm,"\t\tCALL PRINTFCHAR\n");
}
}
else
{
offset2 =
lookupaddress(code[asmindex].var2);
if(offset2==-1)
fprintf(fasm,"\t\tMOV AX,%s\n",code[asmindex].var2);
else
fprintf(fasm,"\t\tMOV AX,[BP-%d]\n",2*offset2);
if(strcmp(code[asmindex].var3,"int")==0
|| strcmp(code[asmindex].var3,"float")==0)
fprintf(fasm,"\t\tCALL PRINTFINT\n");
if(strcmp(code[asmindex].var3,"char")==0)
fprintf(fasm,"\t\tCALL PRINTFCHAR\n");
}
return ;
}
//打印整数的函数
void printfint()
{
fprintf(fasm,"PRINTFINT PROC NEAR\n");
fprintf(fasm,"\t\tCMP AX,0\n");
fprintf(fasm,"\t\tJGE POSITIVE\n");
fprintf(fasm,"\t\tNEG AX\n");
fprintf(fasm,"\t\tPUSH AX\n");
fprintf(fasm,"\t\tMOV DL,'-'\n");
fprintf(fasm,"\t\tMOV AH,2\n");
fprintf(fasm,"\t\tINT 21H\n");
fprintf(fasm,"\t\tPOP AX\n\n");
fprintf(fasm,"POSITIVE:\n"); fprintf(fasm,"\t\tMOV SI,OFFSET
DIVISORS\n");
fprintf(fasm,"\t\tMOV DI,OFFSET
RESULTS\n");
fprintf(fasm,"\t\tMOV CX,5\n");
fprintf(fasm,"AA:\n");
fprintf(fasm,"\t\tMOV DX,0\n");
fprintf(fasm,"\t\tDIV WORD PTR
[SI]\n");
fprintf(fasm,"\t\tADD AL,48\n");
fprintf(fasm,"\t\tMOV BYTE PTR
[DI],AL\n");
fprintf(fasm,"\t\tINC DI\n");
fprintf(fasm,"\t\tADD SI,2\n");
fprintf(fasm,"\t\tMOV AX,DX\n");
fprintf(fasm,"\t\tLOOP AA\n");
fprintf(fasm,"\t\tMOV CX,4\n");
fprintf(fasm,"\t\tMOV DI,OFFSET
RESULTS\n");
fprintf(fasm,"BB:\n");
fprintf(fasm,"\t\tCMP BYTE PTR
[DI],'0'\n");
fprintf(fasm,"\t\tJNE PRINT\n");
fprintf(fasm,"\t\tINC DI\n");
fprintf(fasm,"\t\tLOOP BB\n");
fprintf(fasm,"PRINT:\n");
fprintf(fasm,"\t\tMOV DX,DI\n");
fprintf(fasm,"\t\tMOV AH,9\n");
fprintf(fasm,"\t\tINT 21H\n");
fprintf(fasm,"\t\tRET\n");
fprintf(fasm,"PRINTFINT ENDP\n");
return ;
}
void printfchar()
{
fprintf(fasm,"PRINTFCHAR PROC NEAR\n");
fprintf(fasm,"\t\tMOV DL,AL\n");
fprintf(fasm,"\t\tMOV AH,2\n");
fprintf(fasm,"\t\tINT 21H\n");
fprintf(fasm,"\t\tRET\n");
fprintf(fasm,"PRINTFCHAR ENDP\n");
return ;
}
//求相反数转换
void negasm()
{
int offset1,offset3;
offset1 =
lookupaddress(code[asmindex].var1);
offset3 = lookupaddress(code[asmindex].var3);
if(offset1==-1)
fprintf(fasm,"\t\tMOV AX,%s\n",code[asmindex].var3);
else fprintf(fasm,"\t\tMOV AX,[BP-%d]\n",offset1*2);
fprintf(fasm,"\t\tNEG AX\n\n");
if(offset3==-1)
fprintf(fasm,"\t\tMOV %s,AX\n",code[asmindex].var3);
else fprintf(fasm,"\t\tMOV [BP-%d],AX\n",offset3*2);
return ;
}
//跳转语句的转换
void jmpasm()
{
fprintf(fasm,"\t\tJMP %s\n",code[asmindex].var3);
return ;
}
//返回语句的转换
void retasm()
{
int offset3;
if(strcmp(code[asmindex].var3," ")!=0)
{
offset3 =
lookupaddress(code[asmindex].var3);
if(offset3==-1)
fprintf(fasm,"\t\tMOV AX,%s\n",code[asmindex].var3);
else
fprintf(fasm,"\t\tMOV AX,[BP-%d]\n",offset3*2);
fprintf(fasm,"\t\tMOV RESULT,AX\n");
}
if(proname[0]!='\0')
fprintf(fasm,"\t\tJMP RET%s\n",proname);
else fprintf(fasm,"\t\tJMP EXIT\n");
return ;
}
//实参转换
void paravasm()
{
int offset3;
offset3 = lookupaddress(code[asmindex].var3);
if(offset3==-1)
{
fprintf(fasm,"\t\tMOV AX,%s\n",code[asmindex].var3);
fprintf(fasm,"\t\tPUSH AX\n",code[asmindex].var3);
}
else fprintf(fasm,"\t\tPUSH [BP-%d]\n",offset3*2);
return ;
}
//函数调用语句转换
void callasm()
{
fprintf(fasm,"\t\tCALL %s\n",code[asmindex].var1);
if(code[asmindex].var3[0]=='$')
{
sp++;
// fprintf(fasm,"\t\tMOV AX,0\n");
// fprintf(fasm,"\t\tPUSH AX\n");
// fprintf(fasm,"\t\tSUB SP,2\n");
fprintf(fasm,"\t\tMOV SP,BP\n");
fprintf(fasm,"\t\tSUB SP,%d\n",2*sp);
insertaddress();
fprintf(fasm,"\t\tMOV BX,RESULT\n");
fprintf(fasm,"\t\tMOV [BP-%d],BX\n",2*sp);
}
return ;
}