创建处理器

-1 c cpu processor cpu-architecture microprocessors

这是我在大学的最后一个学期,副课叫做微处理器的体系结构和编程,教授写了这段代码,我只是无法理解他在做什么。尤其是有面具的部分。这是代码。谁能帮我理解一下吗?

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>


uint32_t Instruction_Memory[0x2000];
uint32_t PC = 0;

uint32_t Registers[32];

uint32_t Data_Memory[0x3000];

uint32_t get_instruction(uint32_t input){
   uint32_t temp = input/4;
   return Instruction_Memory[temp];
}

void print_registers() {
   for (int i = 0; i < 4; i++) {
       for (int j = 0; j < 8; j++) {
           printf("x%d: %x \t", i*8+j, Registers[i*8+j]);
       }
       printf("\n");
   };
};

uint32_t get_bits(uint32_t input, int start, int numberOfBits){
   uint32_t t4 = input >> start;
   uint32_t mask = (1 << numberOfBits) - 1;

   t4 = mask & t4;
//    printf("input : %x, start : %d, nob : %d, mask : %x\n", input, start, numberOfBits, mask);
   return t4;
}

int main(){


   PC = 0x1000;

//    x5
   Registers[5] = 6;
//    x9
   Registers[9] = 0x2004;

   Data_Memory[0x2000] = 10;

   Instruction_Memory[0x1000 / 4] = 0xFFC4A303;
   Instruction_Memory[0x1004 / 4] = 0x0064A423;
   Instruction_Memory[0x1008 / 4] = 0x0062E233;


   uint32_t instruction = get_instruction(0x1000);

   printf("Instruction = 0x%x\n\r", instruction);

   print_registers();
   uint32_t A1 = get_bits(instruction, 15, 5);
   printf("A1 = %x\n\r", A1);

   return 0;
}

Run Code Online (Sandbox Code Playgroud)

据我了解,他打印了寄存器,并向系统提供了指令。

Dev*_*lar 5

该函数get_bits(又名“带有掩码的部分”)采用 32 位整数和两个计数。第一个计数是要忽略多少个低位,第二个计数是要返回多少个。(正如 @PeterCordes 在评论中指出的那样,由于某些限制,该函数原样不适合一般使用,但我想这段代码只是一次性说明某些点。)

get_bits分别用值 15 和 5 调用。这意味着忽略 15,返回 5。

Mbbbbbbb bbbbbbbb bbbbbbbb bbbbbbbL
             rrrr riiiiiii iiiiiiii
Run Code Online (Sandbox Code Playgroud)

“M”表示最高有效位,“L”表示最低有效位,“i”表示忽略(右移),“r”表示返回。

至于如何完成此操作,请查看有关位移和按位运算符的 C 参考资料。至于它在语义上的含义,这应该从您随附的课程材料中清楚地解释这些位(标记的A1)含义。

  • 也许值得一提的是,正如所写的,这个“get_bits”函数不支持从“uint32_t”获取所有32位。事实上,由于它使用 `1&lt;&lt;` 而不是 `1U&lt;&lt;`,因此在 `int` 为 `int32_t` 的系统上获取 31 位时,它也会出现有符号整数溢出。它假设“int”至少为 32 位,但这并不能保证。更稳健的实现将使用“(1UL &lt;&lt; count) - 1”。或者两次移位,一左一右,以消除位,支持 uint32_t 的任何非零大小的位字段直至全宽。 (2认同)