易码技术论坛

 找回密码
 加入易码
搜索
楼主: gameghost

[工具] [原创][星端编译器1.43(增加结构指针)][2006/12/23]

[复制链接]
发表于 2006-12-11 14:23:39 | 显示全部楼层
支持!!!!!!!!!
发表于 2006-12-11 23:08:40 | 显示全部楼层
这个软件的容错性不如YAN大哥的好,编译含*的地址操作符时可以编译,但一运行就自动关机了,真是奇怪的BUG(也许不算)啊。
 楼主| 发表于 2006-12-12 08:52:25 | 显示全部楼层
如果真有问题请把程序贴出来,这样让我摸不到头脑~~
发表于 2006-12-12 22:53:18 | 显示全部楼层
比如说在写:

if(a=>b)

这样的语句时(当然是写错了),YAN大哥的编译器能把它通过,并且是if(a>=b)的效果。

下面的JAY大哥的示例程序在本人的TC1KS上编译时通过,但运行时自动关机了。

#define FONT_SMA 0
#define FONT_LAR 1
#define EDIT_INS 0
#define EDIT_OVR 1
#define KEY_LEFT 23
#define KEY_RIGHT 22
#define KEY_UP 20
#define KEY_DOWN 21
#define KEY_ENTER 13
#define KEY_SHIFT 18
#define KEY_CAPS 26
#define KEY_ESC 27
#define KEY_HELP 25
#define KEY_SPC 32
#define KEY_F1 28
#define KEY_F2 29
#define KEY_F3 30
#define KEY_F4 31
//文字缓存
char textBuf[100];
//保存地址,长度,显示坐标,字体
char Input(long textAdd,char length,char textX,char textY,char font){
char strPt;//字串指针、长度
char curX,curY,curL;//光标坐标、长度
int word;//获得的单个字符的ASCII或GB码
char editMode;
strPt=0;
word=0;
editMode=EDIT_INS;
if(font==FONT_SMA){//判断字体
curL=6;
curY=textY+11;
}
else{
curL=8;
curY=textY+15;
}
while(1){
Refresh();
TextOut(textX,textY,textAdd,0x40+0x80*font);//显示当前字串
curX=textX+strPt*curL;
if(editMode==EDIT_INS){//绘制光标
if(*(textAdd+strPt)>=0xa1){Line(curX,curY,curX+curL*2-1,curY,2);}
else{Line(curX,curY,curX+curL-1,curY,2);}
}else{
if(*(textAdd+strPt)>=0xa1){Box(curX,curY-curL*2,curX+curL*2-1,curY,1,2);}else
{Box(curX,curY-curL*2,curX+curL-1,curY,1,2);}
}
word=GetWord(3);
if(word==KEY_ENTER||word==KEY_ESC){break;}
if(word==KEY_F1){//切换插入、覆盖
if(editMode==EDIT_INS){editMode=EDIT_OVR;}
else{editMode=EDIT_INS;}
continue;
}
if(word==KEY_LEFT){//左移光标
if(strPt>0){
if(*(textAdd+strPt-1)>=0xa1){strPt=strPt-2;}
else{strPt--;}
}
continue;
}
if(word==KEY_RIGHT){//右移光标
if(strPt<strlen(textAdd)){
if(*(textAdd+strPt)>=0xa1){strPt=strPt+2;}
else{strPt++;}
}
continue;
}
if(word==KEY_F2){//删除字符
if(*(textAdd+strPt)==NULL){
if(strPt>0){
if(*(textAdd+strPt-1)>=0xa1){strPt=strPt-2;}
else{strPt--;}
}
}
if(*(textAdd+strPt)>=0xa1){strcpy(textBuf,textAdd+strPt+2);}
else if(*(textAdd+strPt)!=0){strcpy(textBuf,textAdd+strPt+1);}
strcpy(textAdd+strPt,textBuf);
continue;
}
//加入字符
if(!isgraph(word&0xff) && (word>>8==0)){continue;}//合法字符
if(editMode==EDIT_INS||*(textAdd+strPt)==NULL){//插入模式,或是光标在最后为新加的字符腾出空间
if(word>>8!=0&&strlen(textAdd)>=length-1){continue;}//判断长度是否超过规定长度
if(word>>8==0&&strlen(textAdd)>=length){continue;}
strcpy(textBuf,textAdd+strPt);
if(word>>8!=0){strcpy(textAdd+strPt+2,textBuf);}
else{strcpy(textAdd+strPt+1,textBuf);}
}
if(word>>8!=0){//汉字
if(*(textAdd+strPt)<0xA1&&editMode==EDIT_OVR){//覆盖英文或数字
if(strlen(textAdd)>=length)continue;
strcpy(textBuf,textAdd+strPt);
strcpy(textAdd+strPt+1,textBuf);
}
*(textAdd+strPt)=word&0xff;
*(textAdd+strPt+1)=word>>8;
strPt=strPt+2;
}else{//英文或数字
if(strlen(textAdd)>=length&&*(textAdd+strPt)==NULL)continue;
if(*(textAdd+strPt)>=0xA1&&editMode==EDIT_OVR){//覆盖汉字
strcpy(textBuf,textAdd+strPt+1);
strcpy(textAdd+strPt,textBuf);
}
*(textAdd+strPt)=word&0xff;
strPt++;
}
}
if(word==KEY_ESC)return 0;
return!0;
}

void main(){
char text[20];
memset(text,0,20);
Input(text,18,10,10,1);
}

希望gameghost能继续更新这个编译器,把它做得更好,本人很支持你啊!!
 楼主| 发表于 2006-12-13 17:18:31 | 显示全部楼层
唉!晕!超晕!
我把GetWord该为getchar,用我的编译器编译出的程序后反编译了成这样:
char function_23(long f_l_5,long f_c_9,long f_c_13,long f_c_17,long f_c_21){
   char f_c_25;
   int f_i_29;
   char f_c_31;
   char f_c_28;
   char f_c_27;
   char f_c_26;
   (f_c_25=0);
   (f_i_29=0);
   (f_c_31=0);
   if((f_c_21==0)){
      (f_c_28=6);
      (f_c_27=(f_c_17+11));
   }
   else {
      (f_c_28=8);
      (f_c_27=(f_c_17+15));
   }
   goto  Label_121;

Label_117:
   goto  Label_1103;

Label_121:
   if(1){
      Refresh();
      TextOut(f_c_13,f_c_17,f_l_5,(64+(128*f_c_21)));
      (f_c_26=(f_c_13+(f_c_25*f_c_28)));
      if((f_c_31==0)){
        if((*(f_l_5+f_c_25)>=161)){
           Line(f_c_26,f_c_27,((f_c_26+(f_c_28*2))-1),f_c_27,2);
        }
        else {
           Line(f_c_26,f_c_27,((f_c_26+f_c_28)-1),f_c_27,2);
        }
      }
      else {
        if((*(f_l_5+f_c_25)>=161)){
           Box(f_c_26,(f_c_27-(f_c_28*2)),((f_c_26+(f_c_28*2))-1),f_c_27,1,2);
        }
        else {
           Box(f_c_26,(f_c_27-(f_c_28*2)),((f_c_26+f_c_28)-1),f_c_27,1,2);
        }
      }
      (f_i_29=getchar());
      if(((f_i_29==13)||(f_i_29==27))){
        goto  Label_117;
      }
      if((f_i_29==28)){
        if((f_c_31==0)){
           (f_c_31=1);
        }
        else {
           (f_c_31=0);
        }
        goto  Label_121;
      }
      if((f_i_29==23)){
        if((f_c_25>0)){
           if((*((f_l_5+f_c_25)-1)>=161)){
              (f_c_25=(f_c_25-2));
           }
           else {
              f_c_25--;
           }
        }
        goto  Label_121;
      }
      if((f_i_29==22)){
        if((f_c_25<strlen(f_l_5))){
           if((*(f_l_5+f_c_25)>=161)){
              (f_c_25=(f_c_25+2));
           }
           else {
              f_c_25++;
           }
        }
        goto  Label_121;
      }
      if((f_i_29==29)){
        if((*(f_l_5+f_c_25)==0)){
           if((f_c_25>0)){
              if((*((f_l_5+f_c_25)-1)>=161)){
                (f_c_25=(f_c_25-2));
              }
              else {
                f_c_25--;
              }
           }
        }
        if((*(f_l_5+f_c_25)>=161)){
           strcpy(8192,((f_l_5+f_c_25)+2));
        }
        else {
           if((*(f_l_5+f_c_25)!=0)){
              strcpy(8192,((f_l_5+f_c_25)+1));
           }
        }
        strcpy((f_l_5+f_c_25),8192);
        goto  Label_121;
      }
      if((!isgraph((f_i_29&255))&&((f_i_29>>8)==0))){
        goto  Label_121;
      }
      if(((f_c_31==0)||(*(f_l_5+f_c_25)==0))){
        if((((f_i_29>>8)!=0)&&(strlen(f_l_5)>=(f_c_9-1)))){
           goto  Label_121;
        }
        if((((f_i_29>>8)==0)&&(strlen(f_l_5)>=f_c_9))){
           goto  Label_121;
        }
        strcpy(8192,(f_l_5+f_c_25));
        if(((f_i_29>>8)!=0)){
           strcpy(((f_l_5+f_c_25)+2),8192);
        }
        else {
           strcpy(((f_l_5+f_c_25)+1),8192);
        }
      }
      if(((f_i_29>>8)!=0)){
        if(((*(f_l_5+f_c_25)<161)&&(f_c_31==1))){
           if((strlen(f_l_5)>=f_c_9)){
              goto  Label_121;
           }
           strcpy(8192,(f_l_5+f_c_25));
           strcpy(((f_l_5+f_c_25)+1),8192);
        }
        (*(f_l_5+f_c_25)=(f_i_29&255));
        (*((f_l_5+f_c_25)+1)=(f_i_29>>8));
        (f_c_25=(f_c_25+2));
      }
      else {
        if(((strlen(f_l_5)>=f_c_9)&&(*(f_l_5+f_c_25)==0))){
           goto  Label_121;
        }
        if(((*(f_l_5+f_c_25)>=161)&&(f_c_31==1))){
           strcpy(8192,((f_l_5+f_c_25)+1));
           strcpy((f_l_5+f_c_25),8192);
        }
        (*(f_l_5+f_c_25)=(f_i_29&255));
        f_c_25++;
      }
      goto  Label_121;

Label_1103:
      if((f_i_29==27)){
        return 0;
      }
      return !0;
   }
}
void main(){
   char f_c_5[20];
   memset(f_c_5,0,20);
   function_23(f_c_5,18,10,10,1);
}

运行竟然正常~~,晕!
这下找编译错误可要麻烦了~~~
发表于 2006-12-13 23:00:43 | 显示全部楼层
看来这个BUG还真是麻烦啊,gameghost要好好加油啊。(如果编译的时候还能提速就更好了,嘻嘻,貌似比YAN大哥的还慢一点啊)

对了,请教一下,编译好的LAV文件运行起来能处理多少个伪代码每秒?可以的话说一下每个机型的运行速度情况。

还有,真的是一用*(xxxx)之类的地址赋值就导致自动关机啊。(本人吃过好几次亏了)

再有就是编译if(a=b)(纯属写错的)的时候居然也能通过,结果无条件执行往下的程序了。
 楼主| 发表于 2006-12-14 16:34:48 | 显示全部楼层
一个语法判断错误,终于解决了.
并不是*的问题,而是*编译后没有清除运算符信息,导致后面的++或--运算编译错误.
还有
a=b也是一个表达式,它同样有一个值,值为运算后的a,if(a=b) 相当于 a=b;if(a)。
发表于 2006-12-14 17:01:56 | 显示全部楼层
a=b也是一个表达式
完全正确
发表于 2006-12-15 16:27:47 | 显示全部楼层
好久没更新了,再次支持个~
发表于 2006-12-20 13:35:53 | 显示全部楼层
报告 1.42 BUG(ASM)!如下...
  .org $4000
  ldx #$00
la:lda data,x
  sta $2000,x
  inx
  cpx #$60
  bne la
  rts
data:.db $aa,$bb,$cc,$dd,$ee,$ff

红色那个地方的寻址地址不对!

另........
dsa=$80
    lda #$00
    sta dsa
    rts
编译以后为:sta $0080
我觉得应该是:sta $80
(寻址方式怎么变了?)
加油......................
 楼主| 发表于 2006-12-20 16:03:25 | 显示全部楼层
data的地址是0x400E,没错啊.

sta dsa

因为很多情况下dsa作为标号值可能是待定的,所以就编译为占用最长指令的方式了.
发表于 2006-12-20 17:18:18 | 显示全部楼层
嗯。如果做成二次扫描就没问题课
 楼主| 发表于 2006-12-20 19:48:19 | 显示全部楼层
不行,我已经是2次扫描,第一次扫描得出地址,第二次扫描写入.
要是不定为16位地址第二次扫描后地址有可能就变了(未出现的标号无法预知是否为零页),要想完全优化没那么简单.
发表于 2006-12-20 20:17:19 | 显示全部楼层
把标号定义在前面应该就解决了吧
发表于 2006-12-21 12:04:11 | 显示全部楼层
代码运行的速度应该没有影响吧?
发表于 2006-12-21 12:43:23 | 显示全部楼层
当然有一点点影响了
3字节指令比2字节慢
发表于 2006-12-21 13:23:01 | 显示全部楼层
.org $4000
  ldx #$00
la:lda data,x
  sta $2000,x
  inx
  cpx #$60
  bne la
  rts
data:.db $aa,$bb,$cc,$dd,$ee,$ff
没太注意!
上面那个是可以正确编译的!
但这个就不行了~~~~
.org $4000
.include "/h";BIN文件头
  ldx #$00
la:lda data,x
  sta $2000,x
  inx
  cpx #$60
  bne la
  rts
data:.db $aa,$bb,$cc,$dd,$ee,$ff
后面这个一编译data的寻址地址就错了!
把.org放到.include后也许就能正确编译!(还没试呢~_~!!)
发表于 2006-12-21 13:34:51 | 显示全部楼层
问一下,在电脑上写汇编有没有什么虚拟机之内的反正是用来调试的东西?
 楼主| 发表于 2006-12-21 21:26:43 | 显示全部楼层
引用第217楼shuyufeng2006-12-21 13:23发表的“”:
.org $4000
  ldx #$00
la:lda data,x
  sta $2000,x
  inx
.......
哦!的确失误了~~
包含文件后地址仍然从调用的地方开始算.....
我现在在尝试给编译器加入新的功能,在下个版本会修正的.
发表于 2006-12-22 15:31:35 | 显示全部楼层
期待ing...
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-4-29 09:00 , Processed in 0.012378 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表