之前最后留下一个伪指令的问题,考虑再三,我还是决定暂时不做深入研究了。因为在我的代码转换中,可能用不到伪指令的情况。
今天首先整理一下我已经完成的指令:
指 令:ABS ACC
指令含义:对ACC中值取绝对值,存入ACC中
宏定义名:ABS_ACC
关 联:C,N,V,Z,OVM
参考页码:6-19
指 令:ABSTC ACC
指令含义:对ACC中值取绝对值,存入ACC中.将TC与符号位作异或运算并存入TC
宏定义名:ABSTC_ACC
关 联:C,N,V,Z,TC,OVM
参考页码:6-20
指 令:ADD ACC , #16bit<<#0..15
指令含义:根据SXM决定16比特立即数是否做符号位扩展,再移位后与ACC相加,结果存入ACC
宏定义名:ADD_ACC_16bitShift(ShiftValue)
参 数:ShiftValue
参数含义:移位量,范围0~15之间
预设参数:16bit预设为0x0011
关 联:C,N,V,Z,OVC,OVM,SXM
参考页码:6-22
指 令:ADD ACC , loc16<
指令含义:根据SXM决定loc16指向的16比特数据是否做符号位扩展,寄存器XT高16位作为移位量,对数据移位后与ACC相加,结果存入ACC
宏定义名:ADD_ACC_loc16ShiftT
预设参数:loc16预设为第一种寻址方式,参数0x3
关 联:C,N,V,Z,OVC,OVM,SXM
参考页码:6-24
指 令:ADDB XARn , #7bit
指令含义:将一个无符号7比特常量与XARn相加,结果存入XARn
宏定义名:ADDB_XARn_7bit(_7bit)
参 数:_7bit
参数含义:7比特的无符号数,高于7比特位全置0
预设参数:XARn预设为XAR0
关 联:无
参考页码:6-33
指 令:ADRK #8bit
指令含义:将一个无符号8比特常量与ARP指针所指XARn相加,结果存入XARn
宏定义名:ADRK(_8bit)
参 数:_8bit
参数含义:8比特的无符号数,高于8比特位全置0
关 联:ARP
参考页码:6-42
首先对第一条指令作测试,对ACC做绝对值处理,为了方便测试,汇编代码如下:
.def Begin
Begin: MOV ACC, #0
MOV ACC, #-2<<#15
NOT ACC
ABS ACC
预计是,ACC先为0,然后0x7FFF0000,取反后为0x8000FFFF,绝对值后为0x7FFF0001。
执行时同时打开寄存器观察,第一步,ST0的Z标志位为1,取反时N为1。最终结果正确。
测试第二条指令,将上述汇编最后一句改为ABSTC ACC,执行到最后一步时,TC位为1,restart以后(TC位此时仍为1,重新执行一遍程序),最后一步TC位成功清零。
现将这两条指令的汇编转换实现。
设置一个总开关Trans_to_Assembler,为真时汇编语言转换开启。
输出文件定为asm.asm,在main函数时完成预先的准备工作
Trans_to_Assembler = true; //开启汇编转换功能
if(Trans_to_Assembler)
{
fpasm = fopen("asm.asm","w");
fprintf(fpasm," .def Begin
Begin:
"); //定义开始符
}
在ABS ACC的实现函数后加入转换部分
if(Trans_to_Assembler)
{
fprintf(fpasm," ABS ACC
");
}
指令中最长操作码为7个字符,于是在操作码与操作数之间,输入了5个空格,这样做的目的就是为了输出文件看上去的美观。
ABSTC ACC的转换功能和上述类似。
现在的问题是我需不需要将寄存器初始化相关的指令也做转换呢?
在完成前两个指令以后,对第三条指令需要有些变通。
fprintf(fpasm , " ADD ACC , #%u << #%u
" , _16bit , shift);
第四条指令遇到了一个问题,寻址。
首先我想到的方法是,在寻址函数头文件中添加一个char*,每个寻址函数被执行时都会修改这个变量,便成相应寻址方式的汇编表示形式。然后,指令只需要调用这个变量就可以完成转换。
在更改寻址函数时,遇到一个问题,25与26号寻址的表示方式中都有%,这在fprintf函数中无法正确显示。
具体代码如下:
if(Trans_to_Assembler)
{
char temp[20];
sprintf(temp , "*AR6%++");
addrAssembler = temp;
}
即使在%号前再加一个%也没用。后来直到尝试加了3个%才成功。结果就变成了这样sprintf(temp , "*AR6%%%%++");
在网上没能找到答案。