Запрос на разработку моей функции симулятора руки, представляющей формат 1 - PullRequest
0 голосов
/ 10 июля 2020

Следующая функция представляет формат 1 в ARM Thumb. Мне непонятна часть использования AND (&) после сдвига в каждом объявлении полей форматов и почему мы использовали эти числа после AND? представление формата 1 в архитектуре ARM

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;
                
                }*/
 

1 Ответ

0 голосов
/ 10 июля 2020

Для чего-то вроде op это должно быть 2 бита, но с некоторым смещением в вашей инструкции. Итак, вам нужно сдвинуть биты op полностью в наименее значимую позицию, а затем удалить все оставшиеся биты.

Сдвиг перемещает биты в позицию младшего разряда в вашем op unsigned char, и операция AND с 3 (что является 11 в двоичном формате, что означает сохранение только 2 младших значащих бита) избавляет от всего, что находится в более высоких битовых позициях (для op это должны быть все 0 s, но для что-то вроде offset5 не было бы).

То же самое и для всех остальных частей инструкции. offset5 имеет длину 5 бит, поэтому нам нужно 11111 в двоичном формате, то есть 0x1F и т. Д.

...