PandoraRL

home work 1

Aug 14th, 2025
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.28 KB | None | 0 0
  1. #include <stdio.h>
  2. typedef unsigned char u8;
  3.  
  4. static void PrintRegister(u8 regVal, u8 wide)
  5. {
  6.     if (!wide)
  7.     {
  8.         switch (regVal)
  9.         {
  10.             case 0b000: printf("AL"); break;
  11.             case 0b001: printf("CL"); break;
  12.             case 0b010: printf("DL"); break;
  13.             case 0b011: printf("BL"); break;
  14.             case 0b100: printf("AH"); break;
  15.             case 0b101: printf("CH"); break;
  16.             case 0b110: printf("DH"); break;
  17.             case 0b111: printf("BH"); break;
  18.             default: printf("Unexpected regval at line: %d",__LINE__); break;
  19.         }
  20.     } else
  21.     {
  22.         switch (regVal)
  23.         {
  24.             case 0b000: printf("AX"); break;
  25.             case 0b001: printf("CX"); break;
  26.             case 0b010: printf("DX"); break;
  27.             case 0b011: printf("BX"); break;
  28.             case 0b100: printf("SP"); break;
  29.             case 0b101: printf("BP"); break;
  30.             case 0b110: printf("SI"); break;
  31.             case 0b111: printf("DI"); break;
  32.             default: printf("Unexpected regval"); break;
  33.         }
  34.     }
  35. }
  36.  
  37. int main(int argc, char **argv)
  38. {
  39.     char *fileName = argv[1];
  40.  
  41.     FILE *file = fopen(fileName, "r");
  42.     if (!file)
  43.     {
  44.         printf("Failed to open file: %s\n", fileName);
  45.     }
  46.     fseek(file, 0, SEEK_END);
  47.     long fileSize = ftell(file);
  48.     fseek(file, 0, SEEK_SET);
  49.  
  50.     for (int i = 0; i < fileSize; i += 2)
  51.     {
  52.         u8 byte1 = (u8) getc(file);
  53.         u8 byte2 = (u8) getc(file);
  54.         if ((byte1 >> 2) == 0b00100010) // MOV instruction 0b00100010=0x22
  55.         {
  56.             printf("MOV ");
  57.         } else
  58.         {
  59.             printf("unsupported");
  60.         }
  61.         u8 d = (byte1 & 0b00000010) >> 1;
  62.         u8 w = (byte1 & 0b00000001);
  63.  
  64.         u8 mod = (byte2 >> 6); // Ignored for now
  65.         u8 reg = (byte2 & 0b00111000) >> 3;
  66.         u8 rem = (byte2 & 0b00000111);
  67.  
  68.         if (d)
  69.         {
  70.             // reg first
  71.             PrintRegister(reg, w);
  72.             printf(",");
  73.             PrintRegister(rem, w);
  74.         } else
  75.         {
  76.             // rem first
  77.             PrintRegister(rem, w);
  78.             printf(",");
  79.             PrintRegister(reg, w);
  80.         }
  81.         printf("\n");
  82.     }
  83.     fclose(file);
  84.  
  85.  
  86.     return 0;
  87. }
  88.  
Advertisement
Add Comment
Please, Sign In to add comment