易码技术论坛

 找回密码
 加入易码
搜索
查看: 563387|回复: 14

关于LavaX伪指令          

[复制链接]
发表于 2006-11-18 17:34:03 | 显示全部楼层
既然有人发了,我也发点,斑竹认为不好的话可以删。
我用Yan大哥的编译器看到了函数的伪代码。
以下全是16进制数,但括号内加了h的才是16进制数。
函数格式是:参数1数据长度+参数1的值+...(其他参数)+函数代码,如果有引用字符串用0D和00括起来。
跳转命令是3D,后加3位地址码(都是3位的)。
全局变量赋初值,格式:41+2位地址码(从8192起算)+数据长度(1位)+值(长度看这个变量的类型而定)+00(表示结束)
全局变量,格式为:3Cxyy3B(?),x不知如何描述,yy减掉8192就是内存使用量,3B后接3位main函数地址码。
3E是用户自定义函数开头标识。后接变量使用情况,格式:3位地址码(xyy,x不知如何描述,yy减掉5就是内存使用量)
函数内内存赋值:3位地址码+长度(2位,减掉80h就是变量长度)+变量的值(长度看这个变量的类型而定)+35+38(如果要跳转”变量的值“部分就直接加3D+3位地址码)
45 是加运算(+)
46 是减运算(-)
47 乘运算(*)
48 除运算(/)
每步运算后接00。

想得起来的就那么多了,哈哈。
 楼主| 发表于 2006-11-18 17:49:41 | 显示全部楼层
3F是子程序返回指令
发表于 2006-11-18 17:52:54 | 显示全部楼层
居然还叫LEE进来看,他会疯的!!
发表于 2006-11-18 18:00:21 | 显示全部楼层
有什么意义吗?
顺便说一下,俺没疯,楼上的傻了吧
 楼主| 发表于 2006-11-18 18:11:41 | 显示全部楼层
这是LEE的作品,他有权知道!
其实他也有他的难处
发表于 2006-11-18 19:19:52 | 显示全部楼层
这个……大家等一会,月魂要我把80前的发出来,但是我还存在我的笔记本里,等我输到电脑里再发吧~说一下是因为我们找得很全,基本上不要补充了,所以在我回贴之前,大家好像不需要增加资料了~~~
发表于 2006-11-18 20:50:42 | 显示全部楼层
伪代码  意义
0x01  一位常数(即char类型常数)入栈
0x02  二位常数(即int类型常数)入栈
0x03  四位常数(即long类型常数)入栈
0x04  char型外部变量地址入栈
0x05  int型外部变量地址入栈
0x06  long型外部变量地址入栈
0x07  读char型外部数组地址入栈
0x08  读int型外部数组地址入栈
0x09  读long型外部数组地址入栈
0x0a  写char型外部数组地址入栈
0x0b  写int型外部数组地址入栈
0x0c  写long型外部数组地址入栈
0x0d  字符串起始
0x0e  char型内部变量地址入栈
0x0f  int型内部变量地址入栈
0x10  long型内部变量地址入栈
0x11  读char型内部数组地址入栈
0x12  读int型内部数组地址入栈
0x13  读long型内部数组地址入栈
0x14  写char型内部数组地址入栈
0x15  写int型内部数组地址入栈
0x16  写long型内部数组地址入栈
0x17  
0x18  
0x19  取内部变量实际地址
0x1a  _TEXT
0x1b  _GRAPH
0x1c  负号
0x1d  前自加
0x1e  前自减
0x1f  后自加
0x20  后自减
0x21  加
0x22  减
0x23  按位与
0x24  按位或
0x25  按位取反
0x26  按位异或
0x27  逻辑与
0x28  逻辑或
0x29  逻辑非
0x2a  乘
0x2b  除
0x2c  取余
0x2d  左移位
0x2e  右移位
0x2f  相等
0x30  不等
0x31  小于等于
0x32  大于等于
0x33  大于
0x34  小于
0x35  赋值
0x36  取地址
0x37  
0x38  函数、语句返回值入栈
0x39  返回值为非跳转到后面的三位地址
0x3a  返回值为是跳转到后面的三位地址
0x3b  无条件跳转到后面的三位地址
0x3c  全局变量结束内存地址(即相对偏移起始)
0x3d  调用后面的三位地址指向的子程序
0x3e  子程序入口,标明入口偏移、形参数目
0x3f  子程序返回
0x40  程序结束
0x41  数组起始
0x42  
0x43  
0x44  #loadadd
0x45  表达式加后两位立即数
0x46  表达式减后两位立即数
0x47  表达式乘后两位立即数
0x48  表达式除后两位立即数
0x49  表达式加后两位立即数
0x49  表达式取余后两位立即数
0x4a  表达式左移后两位立即数
0x4b  表达式右移后两位立即数
0x4c  表达式等于后两位立即数
0x4d  表达式不等于后两位立即数
0x4e  表达式大于后两位立即数
0x4f  表达式小于后两位立即数
0x50  表达式大于等于后两位立即数
0x51  表达式小于等于后两位立即数

大家注意到了,LavaX语言的伪指令有两组运算苻,靠前的一组和函数有相同的使用方式,即使用堆栈内参数,而后一组则是直接让栈顶元素和后面的两位立即数运算,速度快,但是只限于int和char
发表于 2006-11-18 20:52:11 | 显示全部楼层
总结:LavaX语言主要靠堆栈实现各模块数据交流,是一种典型的堆栈语言
发表于 2006-11-18 22:35:08 | 显示全部楼层
引用第5楼月魂2006-11-18 18:11发表的“”:
这是LEE的作品,他有权知道!
其实他也有他的难处

有权知道什么? 他知道的比谁知道得都多~~
反正不理解这两句话~~

还有字节码不全.
而且缺少其他的字节码.
发表于 2006-11-19 12:26:14 | 显示全部楼层
//以下readXXX是指从LAV文件总读取,getXXX是指从运行内存总读取.
          case 0x17:
              pushInt((short) (readInt() + popInt()));   
              break;
           case 0x18:
              pushInt((short) (readInt() + ep + popInt()));  
              break;
           case 0x37:  
              pushLong(popInt() | 0x00010000);
              break;
          case 0x42:
              pushLong(_BUFFER);
              break;

还有,某些指令弄错了.
比如0x36   取地址
实际操作应该是:
          case 0x36:  
              pushByte(getByte(popInt()));
              break;
解释为读地址的值还过得去.
 楼主| 发表于 2006-11-19 13:27:50 | 显示全部楼层
0x44是loadall,而且是在LAV文件头中的第八个字节处.
从第五字节写3byte的数据〔具体多少我不清楚了〕,可以直接灰度作图,
我想是LEE是直接运用宏指令操控硬件实现的吧!
也就是说这只对TC800有效.
发表于 2006-11-20 10:26:22 | 显示全部楼层
EastSum你是用什么语言描述的啊?怎么感觉象反编译了Lava的解释器啊?
发表于 2006-11-20 11:41:25 | 显示全部楼层
呵呵,这是我写的LVM的代码~~
ps:ls把我名字打错了.
发表于 2006-11-20 11:59:48 | 显示全部楼层
Sorry啊~~*^_^*
没想到EastSun也这么厉害~~什么时候发布啊?
 楼主| 发表于 2006-11-18 16:40:40 | 显示全部楼层 |阅读模式
  如果帖子有不对的地方,望斑竹帮忙更正!!!!!!!
下面的是我和starwing高中时研究LAV文件结构时发现的LAV伪指令,前面是16进制的伪代码,后面是相应的LAVA库函数。
一般函数:
80  putchar  81  getchar      
82  printf  83  strcpy      
84  strlen  85  SetScreen   
86  updataLCD  87  Delay      
88  WriteBlock  89  Refresh   
8A  TextOut  8B  block      
8C  Rectangle  8D  exit        
8E  ClearScreen8F  abs        
90  rand  91  srand      
92  Locate  93  Inkey      
94  Point  95  GetPoint   
96  Line  97  Box      
98  Circle  99  Ellipse      
9A  Beep  9B  isalnum   
9C  isalpha  9D  iscntrl      
9E  isdigit  9F  isgraph      
A0  islower  A1  isprint      
A2  ispunct  A3 isspace      
A4  isupper  A5  isxdigit   
A6  strcat  A7  strchr      
A8  strcmp  A9  strstr      
AA  tolower  AB  toupper   
AC  memset  AD  memcpy   
AE  fopen  AF  fclose      
B0  fread  B1  fwrite      
B2  fseek  B3  ftell      
B4  feof  B5  rewind      
B6  getc  B7  putc      
B8  sprintf  B9  MakeDir   
BA  DeleteFile  BB  Getms      
BC  CheckKey  BD  memmove   
BE  Crc16  BF  Secret      
C0  ChDir  C1  FileList   
C2  GetTime  C3  SetTime   
C4  GetWord  C5  Xdraw      
C6  ReleaseKey  C7GetBlock   
C8  Sin  C9  Cos      
CA  FillArea  CB  SetGraphMode
CC  SetBgColor  CD SetFgColor  
CE  SetList  CF  Fade      
D0    D1  FindFile   
D2  GetFileNum  
例如:fwrite(data,1,5,fp);编译后成为02xxxx0101010502xxxxB138。前面的xxxx是指data指向的内存单元的地址,后面的xxxx是指fp指向的内存单元的地址,最后的38说明该函数有返回值。
系统函数:D3调用,即根据最后参数的不同调用不同的系统函数。
00  System.GetPID
01  System.SetBrightness
02  System.GetBrightness
03  System.ComOpen
04  System.ComClose
05  System.WaitReady
06  System.SetTimer
07  System.Getc
08  System.Putc
09  System.ComRead
0A  System.ComWrite
0B  System.ComXor
0C  System.RamRead
0D  System.DiskReclaim
0E  System.DiskCheck
0F  System.FlmDecode
10  System.SndPlay
11  System.SndOpen
12  System.SndClose
13  System.SndIfEnd
14  System.PY2GB
15  System.SndPlayFile
16  System.SndSetVolume
17  System.SndGetVolume
18  System.SndStop
19  System.SndPause
1A  System.SndResume
1B  System.SndGetPlay
1C  System.Idle
1D  System.FindFileEx
1E  System.GetFileNumEx
1F  System.GetTickCount
20  System.PeekMessage
  例如:System.SetBrightness(5);编译后成为01050101D3。至于LEE为什么要这样设计,那我就不清楚了。
  关于0x80以前的由于整理的资料的遗失,无法搞出来。希望starwing看见这篇文章后,在后面跟出来补充完整!谢谢!!
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

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

GMT+8, 2024-4-20 14:04 , Processed in 0.012047 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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