面向对象的汇编语言OASM(Object assembly language)

⚫对象:对象具有状态和行为。如一只狗的状态 :颜色、名称、等,行为:摇动、叫唤、吃。对象(Object)是类(Class)的一个实例(Instance)。

⚫类:类可以定义为描述对象行为/状态的模板/蓝图。

⚫方法:从基本上说,一个方法表示一种行为,一个类可以包含多个方法。可在方法中写入逻辑、操作数据以及执行所有的动作。方法还有很多叫法,比如函数、子例程或程序、等等,其本质就是一段指令;OASM一条机器指令码用半字u16表示、可以和对应的汇编指令语句相互转换(汇编器功用),方法就是一个指令码数组,可以和汇编指令语句组或字符串数组相互转换。

⚫位容器:一个茶杯容器可以装茶水、可乐、油、米等等无数不同种类的东西,而计算机世界的容器及种类,只是装二进制数据的位容器。最简单的位容器只是1位(bit):0或1,这一位二进制容器可以用0表达为假、1表示为真,等等。其次、有8位的B(称为字节byte、u8)、16位的Z(称为半字z、u16)、32位的W(称为字word、u32)、64位的D(称为双字Double Word、u64)、128位的(u128)、256位的(u256)、等等位容器。
我们以自然语言去描述世界,而计算机是用各种数据结构的位容器去描述世界。

⚫变量:位容器通常以大量字节集中于“内存”,CPU是用内存地址(如32位地址线A31--A0可表达2^32个单元、每个单元是一个字节b。)来标识一块内存区域。令A0 = 0,也可以有单元为半字;A1A0 = 00,也可以有单元为字;...也可以有单元为8字行r(32字节、表示为行row)、或有扇区s(512字节、磁盘单位)、或有页page(8个扇区、4Kb)等等。单元内容表述的数据可以是不定的、可变的,我们用变量来标识内存单元位容器,给变量起个易记的名字(标识符identifier)、就是变量名。机器码中,是不会出现变量名的;出现的是逻辑相对地址,给出地址、读或写单元的内容;变量名是给我们程序员易于记忆和编写代码而使用的;简单说,变量就是指其对应地址的数据内容。是故,汇编器必须有符号表(变量标识符名字name和对应的变量初始地址)。

⚫标识符:OASM 标识符是用来标识变量、函数、类、模块,或任何其他用户自定义项目的名称。一个标识符以字母 A-Z 或 a-z 或下划线 _ 开始,后跟零个或多个字母、下划线和数字(0-9)。OASM 是区分大小写的编程语言,标识符内不允许出现标点字符,比如 @、& 和 %。

⚫基本数据类型:一个n位的位容器表述的基本类型可以使用一个或多个类型修饰符进行修饰(signed有符号、unsigned无符号、浮点float、无类型void、const 常量类型、volatile变动类型、static 静态存储类、extern 外部存储类、等等),n通常是8位、16位、32位、64位、128位、256位,作为地址(或说指针)时也有24位、48位的。如果位容器的最高位用于表述有符号数(signed有符号:最高位为1、是负数,为0是正数),则有sn、如s8、s16、s32、s64、s128、s256、等,有符号整数运算位容器sit;同理,无符号(unsigned、没有符号位)的正数位容器有:u8、u16、u32、u64、u128、u256、等,无符号整数运算位容器uit;如还需更多的类型修饰符、则加上并简写,如:cu64表示、const unsigned long int,cs16表示、const signed short int,vs32表示、__IO  signed int (__IO表示变量是随时被改变的(volatile),不要进行编译优化)。u16也用于16位字符表示wchar_t,如Unicod字符编码UTF_16,或用于表述2个ASCII 字符组合(ASCII 字符编码7位、最高位为0),u16也可用来表示一条指令的机器码。

a)、单精度浮点数:f32表示、float,双精度浮点数:f64表示、double float,四精度浮点数:f128表示、long double float,半精度浮点数:f16表示、float16,四精度十进制浮点数:df128表示、long double decimal float。

b)、数组:是一个存储相同类型变量(元素)的固定大小的顺序集合。OASM的基本数据类型之数组,一维数组最大元素数目为64K个。多维数组、集合、表、等等,其元素及自身则是对象引用类型。字符串(character String)和指令码都为u16类型的数组,n个字符串为n+1的u16类型数组、最后的u16为\0(空字符、这里是0x0000),指令码串(一段指令码)最后的u16为0xFFFF。

c)、boolean布尔数据类型表示一位的信息,只有两个取值:true 和 false;这种类型只作为一种状态标志来记录 true/false 情况,默认值是 false。
OASM1.0版本:布尔数据类型、循环结构(while 循环、do…while 循环、for 循环、嵌套循环、(break、continue))、条件语句( if 、if...else、嵌套 if 语句(可以在一个 if 或 else if 语句内使用另一个 if 或 else if 语句)、switch...case(break、 default)、嵌套 switch 语句)、等等,还是基于汇编语言指令来实现。我的口号:高效、高速、灵活、简洁。OASM是汇编语言,不是C或C++、JAVA、C#、等等的语言,我随时都得在考虑 OASM汇编器(含连接器)的简洁实现(暂时不考虑用复杂的编译器)。编译器工作流程:词法分析(Lex)、语法分析(Yacc)、语义分析、IR(中间代码,intermediate Representation)产生、IR优化、代码产生、最终优化。我大约看了下编译器的工作原理,这方面不熟悉、以后再考虑学习和应用。
         
d)、从汇编语言“地址”引申出来的“指针”概念、过于复杂和拗口,还是取消了;汇编语言也只是有“地址”及“地址的内容”概念,而无论数据或指令代码、某一时刻会处于不同的“时空”,也就是说其“地址”是变动的;简单说,我现在当前“时空”,百年后、我在那?哈哈。数据或指令代码有五大空间:文件磁盘虚拟空间(非常大、16字节地址256EEs(单位扇区))、虚拟内存空间(受AOS管理、为48位地址256TB空间)、物理内存空间(DDR主内存,页表、MMU,最大16TB)、本地内存空间(多核单元GPU的局部内存空间、32位地址16MB--4GB)、GPU多核的寄存器空间。编写AOS简易操作系统的难点之一就是“空间转换”。

e)、基本位容器类型:汇编语言有基本数据类型的概念,但实际上、都是使用位容器来表达。一个u64的位容器,可以装双精度浮点数f64、或2个单精度浮点数f32、或有符号整数s64、或8字节无符号正数数组u8 a[8]、或4--8个字符串、或4条指令、等等,一个u8r(256字节)的位容器,可以是i节点结构、也可以为256字节数组、也可以是127条指令码串、也可以是127个Unicod字符串、等等;位容器是什么取决于使用者、或说程序方法里、使用者所用的汇编指令。OASM1.0的基本位容器(64位CPU)表示:uxxx(连续位,通常有u64、u128),uxxxr(连续xxx行row、1行32字节4D双字8W字16Z字符,通常有u1r、u8r),uxxxs(连续xxx扇区sector、1扇区512字节、16行u16r,通常有u1s、u8s(1页page为8个扇区4Kb、为128行、为512双字、为1K字、为2k字符));类同有:uxxxp(连续页page),uxxxc(连续章chapters),uxxxdb(连续数据块data block ),uxxxbdb(连续大数据块big data block ),uxxxrl(连续卷roll ),等等,xxx可到64k。

磁盘虚拟空间有16字节的地址表示,最小单位一个扇区s(扇区sector);全局磁盘GDPT( Global Disk PartitionTable全局硬盘分区表 )用64位8字节整数来表示扇区号LBA(小端格式,扇区地址、逻辑块地址Logical Block Address),最低半字为扇区号(1章 = 64K个扇区)、低半字为章号(1db数据块 = 64K章)、中半字为数据块号(1bdb大数据块 = 64k db)、高半字为大数据块号(1卷rl (roll)= 64K bdb);一个局域本地机器组节点支持64k(卷)个全局磁盘GDPT阵列,
1卷rl (roll)= 4G*4G*512b = 8 Zb,一个分区一个卷,每卷最大文件数4G个。还有6字节对应以太网MAC地址,为机器节点地址,
一个机器节点 = 64K卷rl (roll)= 64K*4G*4G*512b = 512 Yb = 0.5Bb。
当编写极大容量数据库文件时,对象的磁盘虚拟空间引用地址必须足够大,这是没办法的,将来的BOS、COS都需要大、大、大;一个对象引用地址包含有64位的虚拟内存空间基本引用地址(含类型说明及成员数),64位的本地内存地址和说明以及Mark Word标记,还需有128位16字节的磁盘虚拟空间地址。这样,一个通用类对象最少要占据一行r(row、32字节、u1r),而值类型或说元件的最小单位是半字,最终对象为行对齐。单u8、s8成员变量不支持,只支持字节数组、或将字节装入u64(等效8字节数组),元件成员变量最少半字对齐,元件为双字对齐。

1c(章chapters)= 64Ks(扇区sector) = 1Mr(行row)= 8Mw(字word)= 16Mz(半字z)= 32Mb(字节byte)= 256Mbit(位bit)。
1db( data block 数据块)  = 64Kc章 = 4Gs(扇区sector) = 512Gw(字word)= 1Tz(半字z)= 2Tb(字节byte)= 16Tbit(位bit)。
1bdb(big data block 大数据块) = 64K db( data block 数据块)  = 4Gc章 = 256Ts(扇区sector) = 32Pw(字word)= 128Pb(字节byte)。 
1卷rl (roll)= 64K bdb = 4G db = 256Tc = 16Es(扇区sector) = 2Zw(字word)= 8Zb(字节byte)。
磁盘空间分配有:连续大数据块、连续数据块、连续章、连续页(1页page为8个扇区4Kb)。
1 Kb ( Kilobyte 千字节 ) =1024b,1024 = 2^10 ( 2的10次方);
1 Mb ( Megabyte 兆字节、简称“兆”) = 1024 Kb,
1Gb ( Gigabyte 吉字节、又称“千兆”) = 1024 Mb,
1 Tb ( Trillionbyte 万亿字节、太字节 ) = 1024 Gb,
1 Pb(Petabyte 千万亿字节、拍字节)= 1024 Tb,
1Eb(Exabyte 百亿亿字节、艾字节)= 1024 Pb;
1 Zb ( Zettabyte 十万亿亿字节、 泽字节 ) = 1024 Eb,
1 Yb (Yottabyte 一亿亿亿字节、 尧字节 ) = 1024 Zb,
1 Bb ( Brontobyte 一千亿亿亿字节 ) = 1024 Yb。

  

一、类(Class)的设计

OASM1.0版本,为了简洁、暂不考虑“继承”;这样一来,C++的类内容被砍去一大半,继承、重载、多态、抽象类、接口、等等去除;我没有用过C++等OOP语言,C语言都没用来编写过程序,但我用“想象力”去了解过它们,多少知道一些。OASM1.0是为简化编写AOS而设计的,为何选汇编?当方法库标椎化后,需用户编写的方法代码行已是简短;无论高级语言或C语言等编写的方法之行数、与汇编所写的行数相比,已是优势极小;但汇编语言编写的代码更为高速、高效、直观、灵活,OASM1.0会制作不少的宏汇编指令、使之代码行数更少。在如今多核、并行、AI、的年代,汇编优势更大;当我们使用面向对象的汇编语言OASM时,呵呵、你还需花时间去学习众多、压力山大的各种语言?简单说:面向对象是为了“代码重用”,用汇编是为了“简单和高性能”。如果设备层驱动都挂接了“文件流端口类”,那设备视为文件,应用程序都可以通过“文件流端口类”的方法连接和操控万千设备协议层驱动程序、而无需另外编写代码。我们只是一次编写“文件流端口类”的十多个具现方法,就可以到处使用。即使有万千个同类对象运行,它们的方法代码也只是一份,只是对象属性地址、属性配置不一样

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值