设计表示格式 1 的 Arm 模拟器功能的查询

inquiry in designing my Arm simulator function representing format 1

以下函数表示 ARM Thumb 中的格式 1。我不明白在格式字段的每个声明中移动后使用 AND(&) 的部分,为什么我们在 AND 之后使用这些数字? format 1 representation in ARM architecture

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("lsl\tr%d, r%d, #%d\n", rd, rs, offset5); break;
                    case 1: printf("lsr\tr%d, r%d, #%d\n", rd, rs, offset5); break;
                    case 2: printf("asr\tr%d, r%d, #%d\n", rd, rs, offset5); break;
                
                }*/
 

对于像 op 这样的东西,它应该是 2 位长,但它在您的指令中有一些偏移量。因此,您需要将 op 位一直移动到最低有效位置,然后删除所有剩余位。

移位将位移动到您的 op unsigned char 中的最低有效位位置,并将其与 3(二进制中的 11,意味着只保留 2最低有效位)摆脱了高位位置的任何东西(对于 op 那些应该是所有 0s,但对于像 offset5 这样的东西它不会)。

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