要了解G语言写的程序如何编译执行就必须对编译后的二进制文件 *.rbf 有一个详细的了解,这一节我就专门讲这个文件。为了更好的理解这个文件,我还专门编写了一个二进制文件的解析文件,不过不具备反编译的功能。 编译后的*.rbf文件为二进制文件,该文件可以使用linux命名vim打开
Vim 可以用来查看和编辑二进制文件 vim -b filename 加上-b参数,以二进制打开 然后输入命令 :%!xxd -g 1 切换到十六进制模式显示 rbf文件的头由16个字节组成 /* 0 */ PROGRAMHeader(size=317, VersionInfo=0.57,NumberOfObjects=2, GlobalBytes=57), /* 0 */ Sign = 4C 45 47 4F /* 4 */ Image size = 3D 01 00 00 /* 8 */ Version info = 39 00 /* 10 */ Number of objects = 02 00 /* 12 */ Number of global bytes = 39 00 00 00
0-3 四个字节为字母LEGO 4-7 四个字节为rbf文件的大小 8-9 两个字节为版本号*100 10-11 两个字节 object的个数,两个字节 12-15 四个字节为全局变量所占的字节数,全局变量用于各个Object之间交换数据。 在Image Header后面接着就是定义每个Object Header object至少为1个,有多少个obejct就排多少个。 /* 16 */ VMTHREADHeader(OffsetToInstructions=40,LocalBytes=35), // Object 1 /* 16 */ Offset to instructions len=4 Code= 28 00 00 00 /* 20 */ Owner object id len=2 Code= 00 00 /* 22 */ Trigger count len=2 Code= 00 00 /* 24 */ Local bytes len=4 Code= 23 00 00 00
Object Header 的第一个四字节(16-19字节)为Object对应的指令偏移码,即执行此Object时,跳转到何处开始执行。 Ower Object Id(20-21字节) 依据主Object,子Object,程序调用等进行设置 Trigger count(22-23字节) 为触发器设置。 Local Bytes(24-27字节)为定义局部变量的字节数,用于Object内部交换数据。 在Object 后面接着就是程序指令,此指令和内核中定义的指令函数相对应。 在内核中,共定义了255个主函数(实际有些是空的),每个函数都定义了对应的参数个数和参数类型,所有主函数参数个数不超过8个;部分主函数又定义了子函数。 通过每个函数对应的指令和参数即可执行*.rbf对应的二进制文件。每个函数对应的代码在lms2012.c文件中定义
如: 假说 Object 1 对应的命令信息为40-127处的字节表示 40位置的字节为 A2 00 0F 第40个字节处 A2 表示调用函数, opOUTPUT_RESET, 函数对应的属性Pars=0x00000088 表示这个函数的参数类型,为两个 DATA8L类型。 00 0F 表示opOUTPUT_RESET, 的两个输入参数。 /* 43 */ OpCodes[99]=opINPUT_DEVICE, .Pars=0x00000B18 SubCodes[0B][0A]=LC0(CLR_ALL),LC0(FFFFFFFF), 99 0A 3F 第43个字节处99 表示调用函数 opINPUT_DEVICE,函数对应的属性Pars=0x00000B18 ,该函数三个参数,并且调用了子函数 CLR_ALL , opINPUT_DEVICE函数对应的属性Pars=0x00000B18 中的0B 表示子函数的类,第44 字节 0A 表示 子函数对应的类中的第几个函数,所有的自函数在SubCodes[0B][0A] 自函数表中, SubCodes[0B][0A] 表示的是子函数 CLR_ALL。 关于各个函数的说明可以参见文档 LEGO MINDSTORMS EV3 Firmware Developer Kit.pdf 此文档在乐高网站上可下载。
老规矩: 我给出了一个简单的ev3文件Ract.ev3 编译后的二进制文件Ract.rbf 以及二进制文件的注释文件。在注释文件中,每一个函数都可以在lms2012.c中找到对应的定义
链接:https://pan.baidu.com/s/1kas53edBp44qB_wgrzqGDw?pwd=euhg
对应文档: EV3文件及其对应二进制文件注释.zip
|