No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

tab_instruc.c 2.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #include "tab_instruc.h"
  2. int current_index = 0;
  3. struct operation_t tab_op[MAXTAILLE];
  4. void add_operation(enum opcode_t opcode, int arg1, int arg2, int arg3){
  5. if (current_index == MAXTAILLE){
  6. printf("Taillemax tableau operations atteinte\n");
  7. }
  8. else{
  9. struct operation_t new_op = {opcode, arg1, arg2, arg3};
  10. tab_op[current_index] = new_op;
  11. current_index++;
  12. }
  13. }
  14. char * get_asm_line_from_op(struct operation_t op){
  15. char * buffer = malloc(sizeof(char)*200);
  16. switch (op.opcode){
  17. case (ADD):
  18. sprintf(buffer,"ADD %d %d %d\n",op.arg1, op.arg2, op.arg3);
  19. break;
  20. case (MUL):
  21. sprintf(buffer,"MUL %d %d %d\n",op.arg1, op.arg2, op.arg3);
  22. break;
  23. case (SOU):
  24. sprintf(buffer,"SOU %d %d %d\n",op.arg1, op.arg2, op.arg3);
  25. break;
  26. case (DIV):
  27. sprintf(buffer,"DIV %d %d %d\n",op.arg1, op.arg2, op.arg3);
  28. break;
  29. case (COP):
  30. sprintf(buffer,"COP %d %d\n",op.arg1, op.arg2);
  31. break;
  32. case (AFC):
  33. sprintf(buffer,"AFC %d %d\n",op.arg1, op.arg2);
  34. break;
  35. case (AFCA):
  36. sprintf(buffer,"AFCA %d %d\n",op.arg1, op.arg2);
  37. break;
  38. case (COPA):
  39. sprintf(buffer,"COPA %d %d\n",op.arg1, op.arg2);
  40. break;
  41. case (JMP):
  42. sprintf(buffer,"JMP %d\n",op.arg1);
  43. break;
  44. case (JMF):
  45. sprintf(buffer,"JMF %d %d\n",op.arg1, op.arg2);
  46. break;
  47. case (INF):
  48. sprintf(buffer,"INF %d %d %d\n",op.arg1, op.arg2, op.arg3);
  49. break;
  50. case (SUP):
  51. sprintf(buffer,"SUP %d %d %d\n",op.arg1, op.arg2, op.arg3);
  52. break;
  53. case (EQU):
  54. sprintf(buffer,"DIV %d %d %d\n",op.arg1, op.arg2, op.arg3);
  55. break;
  56. case (PRI):
  57. sprintf(buffer,"PRI %d\n",op.arg1);
  58. break;
  59. case (READ):
  60. sprintf(buffer,"READ %d %d\n",op.arg1, op.arg2);
  61. break;
  62. case (WR):
  63. sprintf(buffer,"WR %d %d\n",op.arg1, op.arg2);
  64. break;
  65. case (CALL):
  66. sprintf(buffer,"CALL %d %d %d\n",op.arg1, op.arg2, op.arg3);
  67. break;
  68. case (RET):
  69. sprintf(buffer,"RET\n");
  70. break;
  71. case (COPR):
  72. sprintf(buffer,"COPR %d %d\n",op.arg1, op.arg2);
  73. break;
  74. }
  75. return buffer;
  76. }
  77. void create_asm(){
  78. FILE * output = fopen("output.txt","w");
  79. for (int i = 0; i < current_index; i++){
  80. char * line = get_asm_line_from_op(tab_op[i]);
  81. fputs(line, output);
  82. free(line);
  83. }
  84. }
  85. int get_current_index(){return current_index;}
  86. void patch(int index, int arg){
  87. if (tab_op[index].opcode == JMP){
  88. tab_op[index].arg1 = arg;
  89. }
  90. else if (tab_op[index].opcode == JMF){
  91. tab_op[index].arg2 = arg;
  92. }
  93. }