易码技术论坛

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

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

[复制链接]
 楼主| 发表于 2006-12-23 16:48:07 | 显示全部楼层
include 错误修正了,加了个结构指针.
发表于 2006-12-31 14:49:09 | 显示全部楼层
谢谢
发表于 2007-1-2 09:35:57 | 显示全部楼层
又更新了.支持啊!1.41及以前的版本可以编译的文件太少了,希望制革版本可以更好一些.
发表于 2007-1-3 21:15:41 | 显示全部楼层
顶起!!!!!!
发表于 2007-1-12 23:33:11 | 显示全部楼层
我正在文曲星上自学6502汇编,困难重重,而又一直不太会用TOOL2600,这个编译器对我是个很好的东西.
我今天尝试了一下,先写了一个清屏按键退出的程序,成功了,我很高兴,便又想写一个显示文字的程序,可是总是成功不了,运行程序会造成关机.所以我想是否有人能给我写一段可用在这个编译器中的代码?我十分想要.
就这样吧,在屏幕上显示"HELLO WORLD",按键退出.我的机型是NC2600C.谢谢.
 楼主| 发表于 2007-1-13 11:01:05 | 显示全部楼层
因为我只有过TC1000,所以我就写个TC1000的显示程序吧:

scrbuf=0x02c0;显存地址
print=0xc719;显示中断地址
getchar=0xc006;按键中断地址
org 0x4000;程序从0x4000开始
db 0,0,0,0,0,0,0;前16字节的文件头的前7的字节(在TC1000上可以直接用0代替)
jmp main;标志程序的入口
db 0,0,0,0,0,0;文件头的后6个字节
str;一个标号,表示下面的字符串数据的开始地址
db "HELLO WORLD",0;...
main;主程序开始的位置
ldx #0xff;为简化程序,让X寄存器初始为255,这样在第一次inx后就为0了
loopstart;标志循环程序的开始位置
inx;使用寄存器间接寻址的方法,用递增的方式复制数据
lda str,x;以str为基准,x为偏移取得字符
sta scrbuf,x;以scrbuf为基准,x为偏移量存放字符
bne loopstart;当前累加器的数据还存在,所以不用cmp就可以直接判断,遇到str最后的零时就不会再跳转到loopstart了
int print;调用现实中断
int getchar;调用按键中断
rts;程序结束,返回

我推荐你在lavax中嵌入汇编,这样用LavaX可以帮助你调试代码.
发表于 2007-1-13 14:44:00 | 显示全部楼层
我迷惑不已!
我将gameghost的代码中的第三行改为getchar=0xc00a,即开始在NC2600C上编译.可是结果仍是关机.
另外,我有一些问题,希望汇编高手们能回答一下,我将十分感激.
1.程序中有一行"bne loopend",可是哪里有loopend?
2.这个程序的流程是怎样的?为什么要jmp main呢?这个程序不是顺序执行吗?
3.db 0,0,0,0,0,0,0和db 0,0,0,0,0,0是干什么的?
4.是否可以org 0x2000?
最好有人能给代码写注释.这可能会给我的自学带来较大帮助.
 楼主| 发表于 2007-1-13 16:16:35 | 显示全部楼层
哎呀~写错了
把那个loopend改成loopstart.
4C XX XX (jmp main) 是程序文件头的一部分,表示着程序的入口,
NC的机型可能还需要正确的文件头,在TC1000上直接用0就可以代替,所以就db 0...了,别的机型上的文件头的0的那个位置可能要求别的东西.
在TC1000上无论程序多大都把程序放到0x4000的位置,所以就org 0x4000,但是在NC的机型上有可能还要根据程序的大小决定程序的载入位置.
我也没有NC,不太清楚,去汇编区看看吧,那里有答案.

我把上面的程序加了注释了.
发表于 2007-1-13 20:55:58 | 显示全部楼层
非常感谢gameghost的耐心解答!
发表于 2007-1-14 12:51:10 | 显示全部楼层
我参考了一下6502secret,在代码中写了相应的文件头,终于运行正常了.我十分高兴.我终于会写显示程序了.
可是为什么org$2000还是会造成关机?org$4000便正常?

怎样在lavaX中嵌入汇编?谁能写一段简单的代码?例如嵌入一段汇编来清除屏幕?

可以在lavaX中嵌入汇编是否意味着lava程序中也可以控制通讯了(红外,有线)?
 楼主| 发表于 2007-1-14 14:22:03 | 显示全部楼层
org $2000关机只说明程序放在了$4000开始的位置~~~~

关于嵌入汇编请仔细看编译器附带的说明,里面有详细的例子.

在我的编译器里是这样调用的
先用#asmdef 定义要修改的LavaX函数来确定汇编地址入口(关于函数的地址各机型都不同,到汇编区找吧)
然后用asm{}定义程序内存块或用Putasm(){}指令像内存初始化汇编程序
之后用Callasm()来执行汇编代码

嵌入的汇编意味着在LavaX中实现汇编可以实现的功能,至于什么功能,依机型而定了.
发表于 2007-1-14 15:18:17 | 显示全部楼层
"要修改的LavaX函数"?"函数的地址"?找?能再说一说吗?编译器附带的说明我已看了好多遍了,还是不太懂,因为目前汇编这件东西对我简直太陌生了.
能再说一说吗?gameghost不嫌我烦吧?
 楼主| 发表于 2007-1-14 15:48:00 | 显示全部楼层
是LavaX内置函数的地址,比如ClearScreen()在WQX的解释器的程序中有一个入口地址的,在一个地址列表中,只要你知道这个地址就行(但是我不知道,汇编区里可能有),
然后就 #asmdef ClearScreen() xxxx  //xxxx 就是ClearScreen的入口地址
之后就是上面说的了.
发表于 2007-1-17 17:21:27 | 显示全部楼层
好东西啊....................
为我们这些在星星上编程的人提供了巨大的福音
发表于 2007-2-9 18:57:22 | 显示全部楼层
不知为什么,我在用这个编译器编译下面这个代码时成功通过,可是运行时便死机.但是电脑端编译出的LAV文件却能正常运行.
谁能帮我看看这个代码哪儿出问题了?关键的是电脑端能编译出能正常运行的LAV文件,所以不会是死循环的问题.

为什么.txt

1 KB, 下载次数: 683

发表于 2007-2-9 21:05:46 | 显示全部楼层
用yan的2.06编译器也编译成功了.
发表于 2007-3-4 21:06:16 | 显示全部楼层
作者的结构指针存在bug:指针作为函数形参时必须放在最后,否则就会报错。这导致无法使用两个(及以上)的指针参数。
如:
void getfloat(struct float *f,long a,int n)报错;
调整为void getfloat(long a,int n,struct float *f)后通过。
但void add(struct float *a,struct float *b,struct float *sum)怎么办?
望作者修改。
 楼主| 发表于 2007-3-4 22:32:26 | 显示全部楼层
这个编译器的确存在很多漏洞,缺陷在于编译器结构本身.
现在我也没时间继续改了,也没什么意义了.
我还是推荐yan的编译器^_^!
发表于 2007-3-4 22:35:08 | 显示全部楼层
支持下
发表于 2007-3-5 10:44:08 | 显示全部楼层
引用第238楼gameghost2007-03-04 22:32发表的“”:
这个编译器的确存在很多漏洞,缺陷在于编译器结构本身.
现在我也没时间继续改了,也没什么意义了.
我还是推荐yan的编译器^_^!

不要放弃啊,大哥……
yan的编译器还不支持指针,而我要做的东西必须使用结构指针
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

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

GMT+8, 2024-4-29 08:27 , Processed in 0.013622 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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