Bitfield Example 2

This example extends the program in example 1 to decode both I-format and R-format instructions. A union is used to give dual assignments for the least-signficant 16 bits of the instruction. See From C to Machine Instructions I from which the test instructions were taken.

C Source

C source files: bitfields.zip


01: #include <stdio.h>
02: 
03: typedef union {
04:         struct {
05:                 unsigned int fn:6;
06:                 unsigned int sh:5;
07:                 unsigned int rd:5;
08:         };
09:         struct {
10:                 signed int immed:16;
11:                 unsigned int rt:5;
12:                 unsigned int rs:5;
13:                 unsigned int opcode:6;
14:         };
15:         unsigned int w;
16: } mips_format_t;
17: 
18: 
19: int main()
20: {
21:         int i;
22:         mips_format_t ia;
23:         unsigned int codes[] = {0x27bdffe8, 0xAFBE0010, 0x03A0F021, 0x2402000E};
24:         int n = sizeof(codes)/sizeof(int);
25:         for (i=0; i<n; i++) {
26:                 ia.w = codes[i];
27:                 printf("\ninstruction: %X\n",ia.w);
28:                 printf("opcode: %X\n",ia.opcode);
29:                 printf("rs: %d rt: %d\n", ia.rs, ia.rt);
30:                 if (ia.opcode==0) {
31:                         printf("rd: %d  sh: %d  fn: %X\n",ia.rd,ia.sh,ia.fn);
32:                 }
33:                 else {
34:                         printf("immed: %d\n",ia.immed);
35:                 }
36:         }
37:         return 0;
38: }


Line 24, shown below, determines the length of the codes array

         int n = sizeof(codes)/sizeof(int);
sizeof(codes) returns the number of bytes in the array codes.
sizeof(int) returns the number of bytes in one element of codes.
Dividing the first by the second gives the number of elements in codes.

Results


instruction: 27BDFFE8
opcode: 9
rs: 29 rt: 29
immed: -24

instruction: AFBE0010
opcode: 2B
rs: 29 rt: 30
immed: 16

instruction: 3A0F021
opcode: 0
rs: 29 rt: 0
rd: 30  sh: 0  fn: 21

instruction: 2402000E
opcode: 9
rs: 0 rt: 2
immed: 14


Maintained by John Loomis, updated Thu Aug 07 21:09:52 2008