标题中把“标准”二字给括起来,是因为,所谓标准,是多方势力妥协下的产物,个体如果要定标准,则须有独步天下能服众人的影响力。本贴不在“标准”上做文章,就当是一个普通的实现方法。
Smart200不直接支持位的间接寻址,间接寻址由用户编程实现。
1、位地址的表示:
一般位地址表示成:AAAA.b,
其中AAAA是字节(BYTE)或字(WORD)的地址,b是字节或字内的位序号,最低有效位取0。
对于以字节(BYTE)为基本寻址单元的,b取值范围为0-7;
而对字(WORD)为基本寻址单元的,b取值范围为0-15。
对于Smart200,是字节为基本的寻址单元。
2、位地址的参数传递:
可以做成两个独立的参数AAAA和b,分别作为参数传递。
也可以合并成一个参数。
对于8位字节地址,使用8进制合并:8#AAAAb,
也就是原AAAA左移3位,空出的3个BIT位由b占居。
对于16位的字地址,使用16进制合并:16#AAAAb,
也就是原AAAA左移4位,空出的4个BIT位由b占居。
形成的AAAAb具有线性,可增可减,可四则运算。
传送到程序中后,可以进行反运算,分离出AAAA和b。
3、置位、复位、替换、检测
这前三个操作中,替换不是独立的,是用置位和复位实现的。
假设已知AAAA和b:
因为AAAA是字节或字地址,支持间址,所以,使用间址寻址定位到AAAA的变量值。
比如Smart200:AC1 = (&QB0 + AAAA),*AC1就间接寻址到Q区AAAA的变量值。
根据位序号b生成操作模板,以字节为例,b=3生成MASK=2#00001000。
在Smart200中,有现成的指令可用:
DECO b,AC0 // AC0中存放MASK
重点来了:
3.1 置位,使用或运算OR,例:
ORB MASK,*AC1 // 根据MASK置位目标*AC1
如:MASK=2#00001000,会把*AC1中的Bit3置位。
3.2 复位,使用与运算AND,例:
INVB MASK // MASK取反,XORB 16#FF,MASK可以达到同样的效果。
ANDB MASK,*AC1 // 根据MASK复位目标*AC1
如:MASK=2#00001000经反相后变成2#11110111,与运算会把Bit3复位。
3.3 替换,假如位D去替换指定的位
根据D的值,若D=0,执行3.2复位操作,若D=1,执行3.1置位操作。
3.4 检测位状态,使用AND指令
为避免对原始值的影响,运算之前,把目标值复制到临时变量,例:
MOVB *AC1,AC2 // 把*AC1值复制到临时变量AC2中
ANDB MASK,AC2 // 与运算,AC2==0,表示目标位=0,AC2<>0,表示目标位=1