c0语言编译器,C0编译器C0Compiler——生成汇编码

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 ;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值