From 6e6219c2efa4bc8bcc48edf0e82361241b15701b Mon Sep 17 00:00:00 2001 From: Duiccni Date: Tue, 5 Sep 2023 19:22:53 +0300 Subject: [PATCH] modified: main.py --- __pycache__/functions.cpython-311.pyc | Bin 11816 -> 12141 bytes __pycache__/variables.cpython-311.pyc | Bin 4311 -> 4530 bytes functions.py | 11 ++- main.py | 122 ++++++++++++++------------ old_funcs.py | 42 +++++++++ variables.py | 13 +++ 6 files changed, 131 insertions(+), 57 deletions(-) create mode 100644 old_funcs.py diff --git a/__pycache__/functions.cpython-311.pyc b/__pycache__/functions.cpython-311.pyc index 0be8a2173b7c0d3955d2550a135c9d6d17fc47f9..498804c9478ca08461395c7debf338673f828a7c 100644 GIT binary patch delta 1941 zcmZuxZ%k8H6o0p`udjWj{3%jfDDaAa6ch$HqizFX;Ga2BC}BuLKDR z#F@nz%$D73YvQ)}WtrLbLC1%=Y{~w7@?-szY2K#GlI?@bmiT4SU@~^jEvT5iw7>h_ z@0@$ix#ym9F1+&hk>XE19z}qsJaRw2E^w*%x})wVA_yM{Glae|Bg9DnrTmH8#%%aP z2ib3-YNpDeQcw_|RA3>wf(^)S_PSg}?Ch+(zCl{vRB7_f1yjeR!YT-8ARiHH3x zzgSkXB6%chbB0J68+5+aIj~3?7fJUbS-(h*gk6@H($khW8Kssz8jn*;%FskIZMlsJ zJ*G`YQ(4`3*R>;9fk7jnSK|)AoN!MOB-cH`$&R`jnr}Je)8thAbnN8V+}Le*@%+}j zea&sfGvAgA<$7|xx!w;OZYXMAR2SZMxoxC^opW#X`N5E-Xt8K2mQ6)Xoi+dwWPiG^ zk^uX*=%3CS_zv4R&E36s_aVO@K?PWC z&~hG2rsI($9OwWDkF&4*pTI$04SWP8{4g+7R0Zttv{=^^rnT%)rP>_=f*Z2rWIC40 z#&x<5%|4Z)GJY>3Npm!lH6u`y20aXFbL?`Z;c}lnaZUE;Wk1_gRR``ysy^F^m&cRI z(_+a~hvG2wu=qHKh4@8Ke0&q*`gn$(*iSPtdISXTv0cF~7q+D(j%VWRyCR?CDDP<& zs`c9^1sY%FA$?gX$$}#8snRW<5n#|ZtH><6# zT5DhK=OS}O0oLOVHdq~ibd6P4hvgMP+PzB0xx%B*urz&!U8+7X+tt;jCUkR1Pb3ZK zp{BaHQ5W8(s_WE5Ae#T&?B<~#hS6~yjqqMtpW2tiFQ8`CmjWy zbMQBE05DIyg5)?`J|E26E8vI2W5Z1)cufiB2Cpi$H#@9R!+^_lmpk~ z08AH_tI?o@AJlwLG;EuJu!A23V-x5>085Ds4{5!-hqcZQ`U0|i42Xp$O(KEyXsoIU z4^&(#nbx(5C^g$@3KTA~wV?#KnhpJB+gos@6b68tG@_}A(I`I?*Dd(Ll+px%B^l5i z2CptYry$626s8eWcDcTh_}Q=ZJ}C>tj|+?SH3UjJ(3m4N?90aMq?f(9e(S6cwQ&v? zMj{S8%btR3=TnOx>v8oL+8i5_9zwv*;Q?5ZnVm@KPXvojEvKfXqvN`!(K6I5Md(M^ zfl_;4&rr)A`Vta6vv@4J5dj;8kF-VS^UyBYl-@)m(7fc delta 1728 zcmZ8hUrbw77{BMXrME5ZC@WCPzfys65$B*&#B4BFyNygcZA%!-;M%m8Qr3T-dm*gB ziEndpiFzKyhnXeDh<~D6croIGiM|;PGM{du556tYghYu6iQ@O2RtcQs{?0wW?>pc5 z{+;vt?D{p=hfb$mfbr}1yXmXm2d;-TUAKuKyd$g-I7+{GpHQgxz)f zScf$r>LR=6_ptY^ZkxF(_OX|(EyTj^Sc7j%J;cF+(mA)YVgnJZn$i~5-szLdCP9b` z`Z0D_dc9|l^hEc_=pG5~ky%+XOgXh+n3j^%FelS#YFLUilP$1m+xb=xx`AMUPx}gB zRoJl$7Tbc{bSmfz1nl22oOkjk!JS&*s;N$d-JuS|9L;KcZu$5E){iHb zr^v8U75YO{Wz#`EE3rVQV{)pM$*cJyz3~Dqrsxa^82hGmq?-q0$`{iqe$Rl%fknm5 zf0+5bWaDion6I;)ZM8M9Py9A}xkeBQWJT0%)l2C(xUzzf1Xo1%p1*PAI$zRS zy(++I0gO~e!EuPU{>RUWaX~hhC)w@x$yXo!v%kL|eS~hw5Q2SEWTmpWv^yw7HMAbLs@cUR6V9&;BBqQ_B$Ut~Jq-ju9?HY-PX-A; zfOhC$Clo)IEvQN?L^=;rck@T?#-3>$N5tmi$Viu?hU|2M0QjHgu zzY^dS=A7mbI@sUcJ+1sTsY?~}`D7uj=xV;iUnC7QHaA9l+6lDRY;cXVvA=>3$r$^t zcX+x1w|fw}5b*sm%sI#oe?)j(2c1~CehE~(f`DDjJu)o%VkxKcd{(^I*o^EQ4x>T@ zz%Yl$VwdOyu6eyMCfbjH4aysMPdW{4x|mZ(=q>h{JaD3()b9uYx8i(SGxKTP#HXXs sx8dyjg*@#fAO?6d#HY0cpVlYuhrTe~f96w#FOPzMqqF~_$&8--3rVYg%>V!Z diff --git a/__pycache__/variables.cpython-311.pyc b/__pycache__/variables.cpython-311.pyc index 218a09452ba5b7497f2289177ea00a104067fcba..6a333761e25b170a0a40e18d3a40eb7889cd4871 100644 GIT binary patch delta 981 zcmaJuKfWnbk&lD2%^;8h>GCKbECz!h?jidIrsYx=Y*5&biU}yJyTVM z;Q4;}2fULA`M@vx$93@Xb?-^;>3y9*(}ti$Xo!aIpsGbd(qa&V5QHHDQHVh^v_LDg zt;t$5R<~~m$Q>@nT~2HWkX&ofS|9~!$gGK4t4_2w+D?`B{h@>gpmQ8==yV)#43yBy zatpe&IE@zt=sr-u^&YA~FKUMx{%u|KL2kvXB}77#(6=cNvW574v=pidnp#h@2{Fp1 z)qUJBru3AGfWeQCwdMK69`uJ!qDOOog_DtTF&h;OmnLQPP%-GdglAsYcVa4 zTp@tSk8XbxC2u+JbHsw}h&BQc6j4OzJdQZx*bv51#A(DBVg@mbC?Fs&JD#~x#qlgG znvSPXE+CbV?24NiJVPp!fM>u$Qk!s%<)yT6gI$u6t;X}KgcxL*ki6)4%CnZ!FuQ2! z+ePV~;M4g!=GbR>z`KNLfhCl^tcjV;H=x?_jCmaC3;r!Cg66_j-cpAl3YJWqT_4 GQ1}JRMeWxB delta 856 zcmaJF|7=QD|*>+}k_MhwO{?m0`-BvLaB#`sPu};Zc6e4J$gAsM;5PfepsWs@q``+)*H^1-AFfV)FcW0mJ zx<+tiGvC1DCgg)4M@#(;zV1HCK3!%37F$k2unfw78M!RO`O#YJ?m*P>jZ%e#&z-~I()9Dd5}b~GXuTN zcg>T@q|xhS^s(M21hP&&$>iBS{+V{Ex$6XQ=lZw9vRhfU>CA{tM~8CMmWy*WTP`nD za&rAGUZwsWi%o}5Bi|EOJKx|8`5T1wpAH`q{w_l6QiHQxi--|f%(UfFxnRq{3bry0 zz`%CRv-t&UaY-H=9JIGRYEg1s6;EH|i`pq=0^tq*T>F$Z5LLxDNu{hH9zV3Pxl*-O zSeUPzwWd%o`Hp8cK6$Lov7A!mXS_TA@ypz+Uy!nVT))fr^?{^y1*7a1F~k}dP@Sq) z=1R31v#bd|;=33Ip(>?v<#x?htm(4JEQ3GrrL{X~h~K69n!oaW>_6}X9*(~ABv#yq nE)oo_=y<65p4)q<$X int: if x[0] == "$": if len(x) == 1: return var.addr - return var.orgin + if x[1] == "$": + return var.orgin + return var.spec_values[x[1:]] if x[0] == "&": return var.constants[x[1:]] if x[0] == "?": @@ -135,7 +137,7 @@ def splitWithoutSpecs(x: str) -> list[str]: if tmp != "": retu.append(tmp) tmp = "" - elif tmp != _excluded: + elif char != _excluded: # tmp -> char (Bux fix.) tmp += char retu.append(tmp) # Bug fixed. return retu @@ -155,8 +157,13 @@ def getRegister(x: str, mod: bool = True) -> tuple[int, int]: Returns Register values -> (index, size). >>> getRegister("eax") (0, var.DWORD) + >>> getRegister("ds"): # Segment Register + (2, -1) """ + if x in var.seg_regs: + return (var.seg_regs.index(x), -1) + tmp = var.str_regs.index(x[-2:]) return ( tmp % var.REG_INDEX_LEN if mod else tmp, diff --git a/main.py b/main.py index c3840a5..1f8073d 100644 --- a/main.py +++ b/main.py @@ -15,6 +15,7 @@ import variables as var import functions as func # type: ignore +''' test_case: list[str] = ( # mov , [f"mov {i}, 0x45" for i in var.regs8] @@ -40,6 +41,15 @@ "mov dword *0x1234, 0x10000", ] ) +''' + +test_case = ( + [f"push {i}" for i in var.regs16_32] + + [f"push e{i}" for i in var.regs16_32] + + [f"push {i}" for i in var.seg_regs] + + ["push 0x4321", "push byte 0x4321", "push 0x43210", "push dword 0x43210"] + + ["push *0x4321", "push dword *0x4321", "push *0x2132312"] +) # test_case: list[str] = [] # for _sub in var.test_cases: @@ -53,57 +63,6 @@ ) # Actualy these values are default values but while i debuging i use this function for making it more easyly. -''' -def foo(bar: int) -> int: - """ - An test command. (its basicly calculates factorial.) - """ - if bar == 1: - return 1 - return foo(bar - 1) * bar -''' - -""" -def _command_mov(value1: str, value2: str, size: int | None = None) -> list[str]: - retu_: list[str] = [] - if value1[0] == "*": - v1_ptr = func.convertInt(value2[1:]) - if value2[0].isalpha(): - v2_reg = func.getRegister(value2) - else: - v2_value = func.convertInt(value2) - pass # reg, const - else: - v1_reg = func.getRegister(value1) - if value2[0].isalpha(): - v2_reg = func.getRegister(value2) - pass # reg, reg - elif value2[0] == "*": - v2_value = func.convertInt(value2[1:]) - if v1_reg[1] == var.DWORD: - retu_.append(var.STR_BIT_32) - retu_.append(hex(0xB0 + v1_reg[0])[2:]) - tmp = func.findSize(v2_value) - if tmp > v1_reg[1]: - func.raiseError( - "Overflow Error", - f"Used size({v1_reg[1]}) is smaller than should({tmp}) used.", - line=index, - ) - retu_ += func.memoryProc(v2_value, v1_reg[1]) - else: - pass # reg, const - return retu_ -""" - -# mov , FINISHED -# mov , -# mov , FINISHED -# mov , - - -# mov , -# mov , (word) def convertIt(x: str, mod_reg: bool = True) -> tuple[Any, int]: if x[0] == "*": return func.convertInt(x[1:]), 1 @@ -111,7 +70,13 @@ def convertIt(x: str, mod_reg: bool = True) -> tuple[Any, int]: return func.getRegister(x, mod_reg), 2 return func.convertInt(x), 0 +# mov , FINISHED +# mov , +# mov , FINISHED +# mov , +# mov , +# mov , (word) def _new_command_mov(value1: str, value2: str, size: int | None = None) -> list[str]: v1, v2 = convertIt(value1, False), convertIt(value2) retu_: list[str] = [] @@ -132,10 +97,7 @@ def _new_command_mov(value1: str, value2: str, size: int | None = None) -> list[ + [func.zeroExtend(hex((tmp << 3) + 6), notation=False)] + tmp2 ) - case ( - 2, - 2, - ): # I tried to put (_REG, _REG) but its gives me this error on line 185 idk why 'cannot access local variable '_REG' where it is not associated with a value' + case (2, 2): tmp = v1[0][0] % var.REG_INDEX_LEN if tmp == v2[0][0]: func.raiseError( @@ -164,6 +126,47 @@ def _new_command_mov(value1: str, value2: str, size: int | None = None) -> list[ return [var.STR_BIT_32] + retu_ if size == var.DWORD else retu_ +_segment_value = [ # 8((x + 1) % 4) + 6 + ["0e"], # 8 * 1 + 6 + ["16"], # 8 * 2 + 6 + ["1e"], # 8 * 3 + 6 + ["06"], # 8 * 0 + 6 + ["0f", "a0"], + ["0f", "a8"], +] + +# push +# push +# push (word) +# push (word) +# push # FINISHED +# push # FINISHED +def _command_push(value: str, size: int | None = None) -> list[str] | None: + retu_: list[str] = [] + if size == None: + reg_index, size = func.getRegister(value) + if size == var.BYTE: + return + if size == -1: + return _segment_value[reg_index] + retu_.append(hex(0x50 + reg_index)[2:]) + elif value[0] == "*": + retu_.append("36") + retu_ += func.memoryProc(func.convertInt(value[1:]), size) + else: + retu_.append("6a" if size == var.BYTE else "68") + v1 = func.convertInt(value) + tmp = func.findSize(v1) + if size < tmp: + func.raiseError( + "Overflow Error", + f"Used size({size}) is smaller than should({tmp}) used.", + line=index, + ) + retu_ += func.memoryProc(v1, size) + return [var.STR_BIT_32] + retu_ if size == var.DWORD else retu_ + + def _OP2IC( bias: int, pos_reg: str ) -> list[str] | None: # OP2IC: Outline Part 2 Inc Dec @@ -286,6 +289,13 @@ def procCase(_case: str) -> list[str] | None: if split[0][-1] == ",": # Check if first value size notation or real value. return _new_command_mov(split[0][:-1], split[1]) return _new_command_mov(split[1][:-1], split[2], var.sizes[split[0]]) + case "push": # 0x36 + if split[0][0].isalpha(): + if len(split) == 1: + return _command_push(split[0]) + else: + return _command_push(split[1], var.sizes[split[0]]) + return _command_push(split[0], var.WORD) case _: if command[0] == ":": command = command[1:] @@ -297,6 +307,8 @@ def procCase(_case: str) -> list[str] | None: index, ) var.constants[command] = var.addr + else: + func.raiseError("Command", f"'{command}'({hex(func.convertInt(command))[2:]}) isn't reconized by Assembler.", line=index) return None diff --git a/old_funcs.py b/old_funcs.py new file mode 100644 index 0000000..28ddcb0 --- /dev/null +++ b/old_funcs.py @@ -0,0 +1,42 @@ +''' +def foo(bar: int) -> int: + """ + An test command. (its basicly calculates factorial.) + """ + if bar == 1: + return 1 + return foo(bar - 1) * bar +''' + +""" +def _command_mov(value1: str, value2: str, size: int | None = None) -> list[str]: + retu_: list[str] = [] + if value1[0] == "*": + v1_ptr = func.convertInt(value2[1:]) + if value2[0].isalpha(): + v2_reg = func.getRegister(value2) + else: + v2_value = func.convertInt(value2) + pass # reg, const + else: + v1_reg = func.getRegister(value1) + if value2[0].isalpha(): + v2_reg = func.getRegister(value2) + pass # reg, reg + elif value2[0] == "*": + v2_value = func.convertInt(value2[1:]) + if v1_reg[1] == var.DWORD: + retu_.append(var.STR_BIT_32) + retu_.append(hex(0xB0 + v1_reg[0])[2:]) + tmp = func.findSize(v2_value) + if tmp > v1_reg[1]: + func.raiseError( + "Overflow Error", + f"Used size({v1_reg[1]}) is smaller than should({tmp}) used.", + line=index, + ) + retu_ += func.memoryProc(v2_value, v1_reg[1]) + else: + pass # reg, const + return retu_ +""" \ No newline at end of file diff --git a/variables.py b/variables.py index e38002a..75405fd 100644 --- a/variables.py +++ b/variables.py @@ -60,6 +60,7 @@ class colors: regs8 = ["al", "cl", "dl", "bl", "ah", "ch", "dh", "bh"] regs16_32 = ["ax", "cx", "dx", "bx", "sp", "bp", "si", "di"] +seg_regs = ["cs", "ss", "ds", "es", "fs", "gs"] str_regs = regs8 + regs16_32 @@ -69,6 +70,13 @@ class colors: one_inst = { "hlt": "f4", "nop": "90", + "cmc": "f5", + "clc": "f8", + "stc": "f9", + "cli": "fa", + "sti": "fb", + "cld": "fc", + "std": "fd", } spec_inst = { @@ -78,6 +86,11 @@ class colors: "dec": [0xC8, 0xFE, "0e"], } +spec_values = { + "mbr": 0x55AA, + "borg": 0x7C00, +} + added: list[str] = [] memory: list[str] = []