Advertisement
Guest User

Untitled

a guest
May 29th, 2016
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Prolog 5.68 KB | None | 0 0
  1. :- use_module(library(readutil)).
  2.  
  3. cPoczatek(Wyjscie) :-
  4.     write(Wyjscie, "#include <stdio.h>\n#include <stdint.h>\nint main() {\n\tuint32_t m[4096];\n\tuint32_t a = 0;\n\tuint32_t b = 0;\n\tuint32_t c = 0;\n\tuint32_t d = 0;\n\tuint32_t si = 0;\n\tuint32_t di = 0;\n\tuint32_t sp = 3500;\n\tint zeroFlag = 1;\n\tuint32_t temp;\n\n").
  5.    
  6. cKoniec(Wyjscie) :-
  7.     write(Wyjscie, "\n\n\tprintf(\"AX = %d\\n\", a);\n\tprintf(\"BX = %d\\n\", b);\n\tprintf(\"CX = %d\\n\", c);\n\tprintf(\"DX = %d\\n\", d);\n\tprintf(\"si = %d\\n\", si);\n\tprintf(\"di = %d\\n\", di);\n\tprintf(\"sp = %d\\n\", sp);\n\tprintf(\"zeroFlag = %d\\n\", zeroFlag);\n}\n").
  8.  
  9.    
  10.  
  11. asembler2c(PlikWejsciowy, PlikWyjsciowy) :-
  12.     open(PlikWejsciowy, read, Wejscie),
  13.     open(PlikWyjsciowy, write, Wyjscie),
  14.     cPoczatek(Wyjscie),
  15.     repeat,
  16.     read_line_to_codes(Wejscie, Wiersz),
  17.     ( Wiersz == end_of_file ->
  18.         cKoniec(Wyjscie),
  19.         close(Wejscie),
  20.         close(Wyjscie), !
  21.     ;
  22.     prefix(Postfix, Wiersz, []),
  23.     write(Wyjscie, "\t"), write(Wyjscie, Postfix), nl(Wyjscie),
  24.     fail
  25.     ).
  26.    
  27.  
  28.  
  29. prefix(E) --> rozkazA(E1), spacja, rejestr(E2), przecinek, rejestr(E3), {atomic_list_concat([E2, E1, E3, ";"], '', E)}.
  30. prefix(E) --> rozkazA(E1), spacja, rejestr(E2), przecinek, liczba(E3), {atomic_list_concat([E2, E1, E3, ";"], '', E)}.
  31. prefix(E) --> rozkazA(E1), spacja, rejestr(E2), przecinek, nawiasKL, pamiec(E3), nawiasKP, {atomic_list_concat([E2, E1, "m[", E3, "]", ";"], '', E)}.
  32. prefix(E) --> rozkazA(E1), spacja, nawiasKL, pamiec(E2), nawiasKP, przecinek, rejestr(E3), {atomic_list_concat(["m[", E2, "]", E1, E3, ";"], '', E)}.
  33. prefix(E) --> rozkazA(E1), spacja, nawiasKL, pamiec(E2), nawiasKP, przecinek, liczba(E3), {atomic_list_concat(["m[", E2, "]", E1, E3, ";"], '', E)}.
  34. prefix(E) --> rozkazA(E1), spacja, nawiasKL, pamiec(E2), nawiasKP, przecinek, nawiasKL, pamiec(E3), nawiasKP, {atomic_list_concat(["m[", E2, "]", E1, "m[", E3, "];"], '', E)}.
  35.  
  36.  
  37. prefix(E) --> rozkazA(E1), spacja, rejestr(E2), {atomic_list_concat([E2, E1, ";"], '', E)}.
  38. prefix(E) --> rozkazA(E1), spacja, nawiasKL, pamiec(E2), nawiasKP, {atomic_list_concat(["m[", E2, "]", E1, ";"], '', E)}.
  39.  
  40. prefix(E) --> rozkazL1(E1), spacja, rejestr(E2), {atomic_list_concat([E2, E1, E2, ";"], '', E)}.
  41. prefix(E) --> rozkazL1(E1), spacja, nawiasKL, pamiec(E2), nawiasKP, {atomic_list_concat(["m[", E2, "]", E1, "m[", E2, "];"], '', E)}.
  42.  
  43. prefix(E) --> rozkazL2(E1), spacja, rejestr(E2), przecinek, rejestr(E3), {atomic_list_concat([E2, " = ", E2, E1, E3, ";"], '', E)}.
  44. prefix(E) --> rozkazL2(E1), spacja, rejestr(E2), przecinek, liczba(E3), {atomic_list_concat([E2, " = ", E2, E1, E3, ";"], '', E)}.
  45. prefix(E) --> rozkazL2(E1), spacja, rejestr(E2), przecinek, nawiasKL, pamiec(E3), nawiasKP, {atomic_list_concat([E2, " = ", E2, E1, "m[", E3, "]", ";"], '', E)}.
  46. prefix(E) --> rozkazL2(E1), spacja, nawiasKL, pamiec(E2), nawiasKP, przecinek, rejestr(E3), {atomic_list_concat(["m[", E2, "]", " = ", E2, E1, E3, ";"], '', E)}.
  47. prefix(E) --> rozkazL2(E1), spacja, nawiasKL, pamiec(E2), nawiasKP, przecinek, liczba(E3), {atomic_list_concat(["m[", E2, "]", " = ", E2, E1, E3, ";"], '', E)}.
  48. prefix(E) --> rozkazL2(E1), spacja, nawiasKL, pamiec(E2), nawiasKP, przecinek, nawiasKL, pamiec(E3), nawiasKP, {atomic_list_concat(["m[", E2, "]", " = ", E2, E1, "m[", E3, "];"], '', E)}.
  49.  
  50. prefix(E) --> rozkazL3(E1), spacja, rejestr(E2), {atomic_list_concat([E2, E1, "1;"], '', E)}.
  51. prefix(E) --> rozkazL3(E1), spacja, nawiasKL, pamiec(E2), nawiasKP, {atomic_list_concat(["m[", E2, "]", E1, "1;"], '', E)}.
  52.  
  53.  
  54. prefix(E) --> rozkazP1(E1), spacja, rejestr(E2), przecinek, rejestr(E3), {atomic_list_concat([E2, E1, E3, ";"], '', E)}.
  55. prefix(E) --> rozkazP1(E1), spacja, rejestr(E2), przecinek, liczba(E3), {atomic_list_concat([E2, E1, E3, ";"], '', E)}.
  56. prefix(E) --> rozkazP1(E1), spacja, rejestr(E2), przecinek, nawiasKL, pamiec(E3), nawiasKP, {atomic_list_concat([E2, E1, "m[", E3, "]", ";"], '', E)}.
  57. prefix(E) --> rozkazP1(E1), spacja, nawiasKL, pamiec(E2), nawiasKP, przecinek, rejestr(E3), {atomic_list_concat(["m[", E2, "]", E1, E3, ";"], '', E)}.
  58. prefix(E) --> rozkazP1(E1), spacja, nawiasKL, pamiec(E2), nawiasKP, przecinek, liczba(E3), {atomic_list_concat(["m[", E2, "]", E1, E3, ";"], '', E)}.
  59. prefix(E) --> rozkazP1(E1), spacja, nawiasKL, pamiec(E2), nawiasKP, przecinek, nawiasKL, pamiec(E3), nawiasKP, {atomic_list_concat(["m[", E2, "]", E1, "m[", E3, "];"], '', E)}.
  60.  
  61. prefix(E) --> rozkazP2(E1), spacja, rejestr(E2), przecinek, rejestr(E3), {atomic_list_concat(["temp = ", E2, "; ", E2, E1, E3, "; ", E3, " = temp;"], '', E)}.
  62. prefix(E) --> rozkazP2(E1), spacja, rejestr(E2), przecinek, nawiasKL, liczba(E3), nawiasKP, {atomic_list_concat(["temp = ", E2, "; ", E2, E1, "m[", E3, "]", "; ", "m[", E3, "] = temp;"], '', E)}.
  63.  
  64. liczba(N) --> digits(Ds), {number_chars(N,Ds)}.
  65. pamiec(N) --> digits(Ds), {number_chars(N,Ds)}.
  66. pamiec("si") --> "SI".
  67. pamiec("di") --> "DI".
  68. pamiec("a") --> "AX".
  69. pamiec("b") --> "BX".
  70. pamiec("c") --> "CX".
  71. pamiec("d") --> "DX".
  72.  
  73.  
  74. digit(C) --> [C], {code_type(C, digit)}.
  75. digits(D) --> digit(C), {D=[C]}; digit(C), digits(Ds), {D=[C|Ds]}.
  76.  
  77. spacja --> " "; " ", spacja.
  78.  
  79. przecinek --> ",".
  80.  
  81. nawiasKL --> "[".
  82. nawiasKP --> "]".
  83.  
  84. rozkazA(" += ") --> "ADD".
  85. rozkazA(" -= ") --> "SUB".
  86. rozkazA(" *= ") --> "MUL".
  87. rozkazA(" ++ ") --> "INC".
  88. rozkazA(" -- ") --> "DEC".
  89.  
  90. rozkazL1("= ~") --> "NOT".
  91. rozkazL2(" & ") --> "AND".
  92. rozkazL2(" | ") --> "OR".
  93. rozkazL2(" ^ ") --> "XOR".
  94. rozkazL3(" << ") --> "SHL".
  95. rozkazL3(" >> ") --> "SHR".
  96.  
  97. rozkazP1(" = ") --> "MOV".
  98. rozkazP2(" = ") --> "XCHG".
  99.  
  100.  
  101. rejestr('a') --> "AX".
  102. rejestr('b') --> "BX".
  103. rejestr('c') --> "CX".
  104. rejestr('d') --> "DX".
  105. rejestr('si') --> "SI".
  106. rejestr('di') --> "DI".
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement