Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- :- use_module(library(readutil)).
- cPoczatek(Wyjscie) :-
- 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").
- cKoniec(Wyjscie) :-
- 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").
- asembler2c(PlikWejsciowy, PlikWyjsciowy) :-
- open(PlikWejsciowy, read, Wejscie),
- open(PlikWyjsciowy, write, Wyjscie),
- cPoczatek(Wyjscie),
- repeat,
- read_line_to_codes(Wejscie, Wiersz),
- ( Wiersz == end_of_file ->
- cKoniec(Wyjscie),
- close(Wejscie),
- close(Wyjscie), !
- ;
- prefix(Postfix, Wiersz, []),
- write(Wyjscie, "\t"), write(Wyjscie, Postfix), nl(Wyjscie),
- fail
- ).
- prefix(E) --> rozkazA(E1), spacja, rejestr(E2), przecinek, rejestr(E3), {atomic_list_concat([E2, E1, E3, ";"], '', E)}.
- prefix(E) --> rozkazA(E1), spacja, rejestr(E2), przecinek, liczba(E3), {atomic_list_concat([E2, E1, E3, ";"], '', E)}.
- prefix(E) --> rozkazA(E1), spacja, rejestr(E2), przecinek, nawiasKL, pamiec(E3), nawiasKP, {atomic_list_concat([E2, E1, "m[", E3, "]", ";"], '', E)}.
- prefix(E) --> rozkazA(E1), spacja, nawiasKL, pamiec(E2), nawiasKP, przecinek, rejestr(E3), {atomic_list_concat(["m[", E2, "]", E1, E3, ";"], '', E)}.
- prefix(E) --> rozkazA(E1), spacja, nawiasKL, pamiec(E2), nawiasKP, przecinek, liczba(E3), {atomic_list_concat(["m[", E2, "]", E1, E3, ";"], '', E)}.
- prefix(E) --> rozkazA(E1), spacja, nawiasKL, pamiec(E2), nawiasKP, przecinek, nawiasKL, pamiec(E3), nawiasKP, {atomic_list_concat(["m[", E2, "]", E1, "m[", E3, "];"], '', E)}.
- prefix(E) --> rozkazA(E1), spacja, rejestr(E2), {atomic_list_concat([E2, E1, ";"], '', E)}.
- prefix(E) --> rozkazA(E1), spacja, nawiasKL, pamiec(E2), nawiasKP, {atomic_list_concat(["m[", E2, "]", E1, ";"], '', E)}.
- prefix(E) --> rozkazL1(E1), spacja, rejestr(E2), {atomic_list_concat([E2, E1, E2, ";"], '', E)}.
- prefix(E) --> rozkazL1(E1), spacja, nawiasKL, pamiec(E2), nawiasKP, {atomic_list_concat(["m[", E2, "]", E1, "m[", E2, "];"], '', E)}.
- prefix(E) --> rozkazL2(E1), spacja, rejestr(E2), przecinek, rejestr(E3), {atomic_list_concat([E2, " = ", E2, E1, E3, ";"], '', E)}.
- prefix(E) --> rozkazL2(E1), spacja, rejestr(E2), przecinek, liczba(E3), {atomic_list_concat([E2, " = ", E2, E1, E3, ";"], '', E)}.
- prefix(E) --> rozkazL2(E1), spacja, rejestr(E2), przecinek, nawiasKL, pamiec(E3), nawiasKP, {atomic_list_concat([E2, " = ", E2, E1, "m[", E3, "]", ";"], '', E)}.
- prefix(E) --> rozkazL2(E1), spacja, nawiasKL, pamiec(E2), nawiasKP, przecinek, rejestr(E3), {atomic_list_concat(["m[", E2, "]", " = ", E2, E1, E3, ";"], '', E)}.
- prefix(E) --> rozkazL2(E1), spacja, nawiasKL, pamiec(E2), nawiasKP, przecinek, liczba(E3), {atomic_list_concat(["m[", E2, "]", " = ", E2, E1, E3, ";"], '', E)}.
- prefix(E) --> rozkazL2(E1), spacja, nawiasKL, pamiec(E2), nawiasKP, przecinek, nawiasKL, pamiec(E3), nawiasKP, {atomic_list_concat(["m[", E2, "]", " = ", E2, E1, "m[", E3, "];"], '', E)}.
- prefix(E) --> rozkazL3(E1), spacja, rejestr(E2), {atomic_list_concat([E2, E1, "1;"], '', E)}.
- prefix(E) --> rozkazL3(E1), spacja, nawiasKL, pamiec(E2), nawiasKP, {atomic_list_concat(["m[", E2, "]", E1, "1;"], '', E)}.
- prefix(E) --> rozkazP1(E1), spacja, rejestr(E2), przecinek, rejestr(E3), {atomic_list_concat([E2, E1, E3, ";"], '', E)}.
- prefix(E) --> rozkazP1(E1), spacja, rejestr(E2), przecinek, liczba(E3), {atomic_list_concat([E2, E1, E3, ";"], '', E)}.
- prefix(E) --> rozkazP1(E1), spacja, rejestr(E2), przecinek, nawiasKL, pamiec(E3), nawiasKP, {atomic_list_concat([E2, E1, "m[", E3, "]", ";"], '', E)}.
- prefix(E) --> rozkazP1(E1), spacja, nawiasKL, pamiec(E2), nawiasKP, przecinek, rejestr(E3), {atomic_list_concat(["m[", E2, "]", E1, E3, ";"], '', E)}.
- prefix(E) --> rozkazP1(E1), spacja, nawiasKL, pamiec(E2), nawiasKP, przecinek, liczba(E3), {atomic_list_concat(["m[", E2, "]", E1, E3, ";"], '', E)}.
- prefix(E) --> rozkazP1(E1), spacja, nawiasKL, pamiec(E2), nawiasKP, przecinek, nawiasKL, pamiec(E3), nawiasKP, {atomic_list_concat(["m[", E2, "]", E1, "m[", E3, "];"], '', E)}.
- prefix(E) --> rozkazP2(E1), spacja, rejestr(E2), przecinek, rejestr(E3), {atomic_list_concat(["temp = ", E2, "; ", E2, E1, E3, "; ", E3, " = temp;"], '', E)}.
- 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)}.
- liczba(N) --> digits(Ds), {number_chars(N,Ds)}.
- pamiec(N) --> digits(Ds), {number_chars(N,Ds)}.
- pamiec("si") --> "SI".
- pamiec("di") --> "DI".
- pamiec("a") --> "AX".
- pamiec("b") --> "BX".
- pamiec("c") --> "CX".
- pamiec("d") --> "DX".
- digit(C) --> [C], {code_type(C, digit)}.
- digits(D) --> digit(C), {D=[C]}; digit(C), digits(Ds), {D=[C|Ds]}.
- spacja --> " "; " ", spacja.
- przecinek --> ",".
- nawiasKL --> "[".
- nawiasKP --> "]".
- rozkazA(" += ") --> "ADD".
- rozkazA(" -= ") --> "SUB".
- rozkazA(" *= ") --> "MUL".
- rozkazA(" ++ ") --> "INC".
- rozkazA(" -- ") --> "DEC".
- rozkazL1("= ~") --> "NOT".
- rozkazL2(" & ") --> "AND".
- rozkazL2(" | ") --> "OR".
- rozkazL2(" ^ ") --> "XOR".
- rozkazL3(" << ") --> "SHL".
- rozkazL3(" >> ") --> "SHR".
- rozkazP1(" = ") --> "MOV".
- rozkazP2(" = ") --> "XCHG".
- rejestr('a') --> "AX".
- rejestr('b') --> "BX".
- rejestr('c') --> "CX".
- rejestr('d') --> "DX".
- rejestr('si') --> "SI".
- rejestr('di') --> "DI".
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement