询问在设计我的手臂模拟器功能表示格式1

inquiry in designing my Arm simulator function representing format 1

本文关键字:功能 模拟器 表示 格式 我的      更新时间:2023-10-16

以下函数表示ARM Thumb中的格式1。我不明白在格式字段的每个声明中移位后使用AND(&(的部分,为什么我们在AND之后使用这些数字?ARM体系结构中的格式1表示

int simulate(unsigned short instr)
{
unsigned char fmt, op, offset5, rd, rs, offset3, rn;
fmt = (instr) >> 13;
switch(fmt){
case 0:             // format 1/2
op = (instr >> 11) & 3;
rd = instr & 7;
rs = (instr >>  3) & 7;
offset5 = (instr >> 6) & 0x1F;
if(op!=3) {     // format 1
/*
switch(op){
case 0: printf("lsltr%d, r%d, #%dn", rd, rs, offset5); break;
case 1: printf("lsrtr%d, r%d, #%dn", rd, rs, offset5); break;
case 2: printf("asrtr%d, r%d, #%dn", rd, rs, offset5); break;

}*/

对于类似op的东西,它应该是2位长,但它在指令中有一定的偏移量。因此,您需要将op位一直移动到最低有效位,然后移除任何剩余的位。

移位会将位移动到opunsigned char中的最低有效位位置,并将其与3(二进制中为11,意味着只保留2个最低有效位(进行"与"运算,可以消除高位位置中的任何内容(对于op,这些应该都是0,但对于类似offset5的内容,则不会(。

指令的其他部分都是一样的。offset5是5位长,所以我们需要二进制的11111,也就是0x1F,依此类推