From 6910e05be6c74dde55cca31e78969adaa840828b Mon Sep 17 00:00:00 2001 From: IgorCielniak Date: Fri, 12 Dec 2025 17:41:24 +0100 Subject: [PATCH] made puts wor for strings as well an some other changes --- a.out | Bin 10376 -> 10408 bytes a.sl | 2 +- build/a.asm | 53 ++++++++++++++++---------- build/a.o | Bin 3296 -> 3440 bytes build/call_syntax_parens.asm | 52 +++++++++++++++---------- build/call_syntax_parens.o | Bin 3248 -> 3488 bytes build/loops_and_cmp.asm | 52 +++++++++++++++---------- build/loops_and_cmp.o | Bin 3312 -> 3552 bytes build/main.asm | 33 ++++++++++++++++ build/main.o | Bin 3040 -> 3472 bytes build/override_dup_compile_time.asm | 52 +++++++++++++++---------- build/override_dup_compile_time.o | Bin 3120 -> 3376 bytes build/string_puts.asm | 57 +++++++++++++++++----------- build/string_puts.o | Bin 3552 -> 3712 bytes build/test.asm | 33 ++++++++++++++++ build/test.o | Bin 6352 -> 6784 bytes hello.sl | 2 +- main.py | 12 ++++++ stdlib.sl | 51 +++++++++++++++---------- tests/run_tests.py | 6 +-- 20 files changed, 280 insertions(+), 125 deletions(-) diff --git a/a.out b/a.out index 8bc6f17c21736d7ab0c10456f430ca531187afa3..723c48f2322ff83224d87c8a4f9f97546cce4b4b 100755 GIT binary patch literal 10408 zcmeI2e{fXQ6~}LWEQTK;p+rEN5www73;D4Nm9%I#l)&5Rrh}DA9mO}B>@KYCk97BK zLO={oCbm0irj9k!p`&#=o!0tC>xj+}Y#D?VqOHY|KPpqEP_4FaMx;er0|nfkbMLwD z-FHLsPyg)h4ELV4OlvqYCDmj%5w_3dGm!jkcc zm#cCH${8qUpqznn2Fe*IXP}&cat6v7C}*IYfpP}^A2Sdhz4cOE1?wvOJv_SdA9a&7-)`*jM3E=kXJ-^(H*nc!DnI& zU1qyy841G_}(D&>NeLtC@?-{qx7-6&$ad<*Fufh_Zzpjyae9c{ynXZur%7Ls` zQG0FEI2=VhaUxd=pR4kC!S9wyxqnt#^URAPLmmEV$ zpDOv5E;)dbdsK-!mj;|m3rbp52_7nYF5-498q_{~nJDLpE4QmqauXJ3|ARaB4zB(< zxJcD5RQ(x%{Ryf*z~V4Ur2zV!koa~}a?F&pZ&7U6AtyNc+WRo%{mPK-Ff;oh9C8S| zf@r1C3c15Tp-bDL@xt!hR6KcKTxL0Pi4(?G5sjdVa$#8eTo+ka{>X~E}og- z_m_RAXC@mE-44iJs;&;Gvj=>oG8}w$JbHVGt`@l*K35+fwUZg8*YVmJd=Kv&`>l)0 zBJoH_A3lN_^(GnB9)s!Nr6nVsh^f5Wae zw4Oxk%Mi*wf>tY9ThLmrPISuV4x(=rNaV1p0$=~zTT$`uMHosw2`q-ROQ(qE_F5l&2CCWllHMnN{ZhehlfT~~ z!L7WmV1A9a5VthmN&G2|8ukn8pKdSL7#NXAp z4-W+F%Te}nj8jenc?+ZyjC z{+`B@#4l*PpZG~t~@ueESM0}&h=i-$QdCqFQkvLoAjo(bXRpWOOPig$? z#2?l87UF{%PZ2+?@m<6xHC`ZIv)DV&v1#~EiO<*cFA`s?@k7KP)cBjkqZe?#MUaSofm%&YHocn6H*el|_Rw>W&A zD+a538lEJ+XPH+&2)rKFCI1dX2HVN`)OkKW4bKzTS$tH zLV6}MnO=&K*p?PnJdsZ1wwom5Lq+qwV$5h3^c-dSVp(D3`Xj_lf44xUKPrugG~&`& zO-3MU1{_(NYX^FyfEH>7dX(OnYp-gRG24WZO3A6D@@dD$#5o~p(pfV=(X;NFdJ{bl z3t`qZQ?V2*Czs4njINH2p|1&5BpPiC2y;^glkJb?5<4lbBs-?1nRq-Gqo}T0F3Kf- zTAd^V*NlktS`i0KJt8P6Vmy-W88BfPVi9=gV6A#Pm#1x|{!~8c(MJ<~o^~qZjprtq z0yxKs+U^OGz{+GPjdDz9HzkPlWHX*&6LA(c6LB*hN#ILh^ROb_d<6*&K%2x2{Y5|&f#4G*9|jc z(TEjctT{K3vLfA3TUk+WmzEXVVX%7@GwMZL=kMHT7{b(I z>}Ig=#UcMXLMp#6mSKZ2=kMJ_Q~tRewZzzPdr$ea-Y8HIgTn`|ZMGTyQIjn}2p@bu jYSpbb|`CnZwR8%=Gy8nLxHtEtr literal 10376 zcmeI2U1(fI6vxkQHZdQo*=W^@0asl=Nn$=4v=D6~joeF<2Zg>Vm%G_bb8$by-MdMB zPz#ITWeHULz>3w12+}v9LaY{PR}&G9s4u}HMJO1kc}QPkt+Jk(IkWd>YVzWn&cNPt z<~L`~%>3u>E_-)g9G`e18i{}`QFsh^EiuZGxB`52uZ#c~g-4(Xuh&5fkBtRQ=*b?! zu2Gw`kPv{4(ac<`1C1x`olPQ6S{cXswXminyI@ImKr5gX&{W>=mh96Eu;S-i(>~uRL7*Oso>MKhv z{YL%lrEX*32g6@AH!mMKhhXL9TaX%l&3Ng2`J!3*9lSOk+>3ZAc0)TFp80d0-v8S4 zHzxd*&gPm~-Nh$oR`-ZWR{j7l9>jJwFEu}iYibV=&h9oOr&%hVfi3U1R@0BAYHXdD zbAPHeKy3Ndr;+&GDbvR$3=oQ#5!OXk9tc-9doY#*?1V{KlyS`1yt*CT70OiYP8oY^ zpECJ6U#qckgHgh5ukXdaX>H*X64J!o?!*4m2<>%dr%Dgv25GYyxY?|Ekw(=;)#q&$vuzd=0SHOf7CIl-L>bSeBK@jDcLiuj3dKg?A9YqVQXZ-+bdJ&nPc<6CY4`5AjD8K1}>c zh3_NoEBpZQ_Y{7R_(ux2h@VrqL;OdDd&E~2{sQrJh5N*tZrZBDtDNJbH+%>YF2^|E zsIvzW;qpG`O^{IHPd4~iI2=CShJV)Jk8g=z-iCiq{AhA({6*vmydUKG9hvL`=hx2j z66aBfEA#(};??|+E<3r*Lw28C%7az%Y}e~66s_!G$Ft__TsaH)8J4kT%U%iC#j?}n zWSm2egt=mIRy3EKLj~bYI|ZjSV^LTm3y$GZsOMVquH$8`LUumq6lkbSc~*>>aWN_H zSDeeb!Yj?&#H_)zK-OSJI<|DCr87*u01H#GY z@VNf@uY}5BG0pl>NVrDv7^)$Hi@LDy-5SIGk3lCVq>wgTNq$ZV&&L`xcM+8YM0pn Yp`uiw3)}vw|66o!P<-zP3Do|719=0 and next is a pointer in [data_start, data_end) + mov rax, [r12] ; len or int value + mov rbx, [r12 + 8] ; possible address + cmp rax, 0 + jl puts_print_int + lea r8, [rel data_start] + lea r9, [rel data_end] + cmp rbx, r8 + jl puts_print_int + cmp rbx, r9 + jge puts_print_int + ; treat as string: (addr below len) + mov rdx, rax ; len + mov rsi, rbx ; addr + add r12, 16 ; pop len + addr + test rdx, rdx + jz puts_str_newline_only + mov rax, 1 + mov rdi, 1 + syscall +puts_str_newline_only: + mov byte [rel print_buf], 10 + mov rax, 1 + mov rdi, 1 + lea rsi, [rel print_buf] + mov rdx, 1 + syscall + ret + +puts_print_int: mov rax, [r12] add r12, 8 mov rbx, rax @@ -65,25 +95,6 @@ puts_finish_digits: mov rsi, r9 syscall ret -word_puts_str: - ; expects (addr, len) on data stack - mov rdx, [r12] - add r12, 8 - mov rsi, [r12] - add r12, 8 - cmp rdx, 0 - je puts_str_write_newline - mov rax, 1 - mov rdi, 1 - syscall -puts_str_write_newline: - mov byte [rel print_buf], 10 - mov rax, 1 - mov rdi, 1 - lea rsi, [rel print_buf] - mov rdx, 1 - syscall - ret word_dup: mov rax, [r12] sub r12, 8 @@ -267,11 +278,13 @@ word_main: ; push 11 sub r12, 8 mov qword [r12], 11 - call word_puts_str + call word_puts ret section .data +data_start: str_0: db 104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100, 0 str_0_len equ 11 +data_end: section .bss align 16 dstack: resb DSTK_BYTES diff --git a/build/a.o b/build/a.o index 515fd45b099b0f4816b397f88b24eff192e4220c..fb710811f2c073eb05fec9e28f02eabecc2dba69 100644 GIT binary patch delta 1004 zcmZ{jO=uHA6oBVVtj(?)Fhv^gZKnGjX6`2U)X>iW6qMRm)Jp*G#0^g zG;!eW#XZr?AM5r0mNvNQ%Z=eb4AepPlBS6Ufe1ax6r1V{rr zqAdGIOKuZuAT||MVc4zsVU6!s{4|!M%)X@AqsoqAjoVqx$|ix#V}slGnjKWNUodVk zdsVYHlwHF#x3NfgP%)_}o4`?HFFeAs!IF;!TWN0jHXw>BgG-lcle9<%)a_h6Cg3*`mR&* z-J(x|nr<1LLf#`n<-GwktmAmf>du}}M+iC&`dV+w=cLA?YJGJB5B|#EP0Qo`WI^f?bjl$Px+G#XtuY9SW9bhF1`56cZ7Vet?V8 zCE+-@2+7b6r5!@n7Fu-{q#!yJ%_1&>&`DA3&Aq1qFZ2!nbMEhV4qPt0tL`(mT!p?$ zEe(s6lPtVP7h3rOvRywqnfkUnbbTaC0>8o&XEvzGIW{5fjED89jD0-GFF8)}emvnD zvG_o4ec#S~NU1uue#7t+Pc{62;C$z<@wPJt?Sw%jJV8T${{`@ky3{0z-k z4ZcA9yXMc@`VEQGHqp%%@q2^s5D(*oC8AMysOy-t1ePt^eQKC}+RI|y67F-u9+7>C zO=*jUy&$`ZQCskjfO&`qfc?Y~TjYKl!!dORc5Uz;;$8gVm4}EYv1SW**svM06L=`? zreP<^)({-w)(!iL>@Fsy{bkrSvd5U0_R_FrvH`3(gHXjoN5E%=0 and next is a pointer in [data_start, data_end) + mov rax, [r12] ; len or int value + mov rbx, [r12 + 8] ; possible address + cmp rax, 0 + jl puts_print_int + lea r8, [rel data_start] + lea r9, [rel data_end] + cmp rbx, r8 + jl puts_print_int + cmp rbx, r9 + jge puts_print_int + ; treat as string: (addr below len) + mov rdx, rax ; len + mov rsi, rbx ; addr + add r12, 16 ; pop len + addr + test rdx, rdx + jz puts_str_newline_only + mov rax, 1 + mov rdi, 1 + syscall +puts_str_newline_only: + mov byte [rel print_buf], 10 + mov rax, 1 + mov rdi, 1 + lea rsi, [rel print_buf] + mov rdx, 1 + syscall + ret + +puts_print_int: mov rax, [r12] add r12, 8 mov rbx, rax @@ -65,25 +95,6 @@ puts_finish_digits: mov rsi, r9 syscall ret -word_puts_str: - ; expects (addr, len) on data stack - mov rdx, [r12] - add r12, 8 - mov rsi, [r12] - add r12, 8 - cmp rdx, 0 - je puts_str_write_newline - mov rax, 1 - mov rdi, 1 - syscall -puts_str_write_newline: - mov byte [rel print_buf], 10 - mov rax, 1 - mov rdi, 1 - lea rsi, [rel print_buf] - mov rdx, 1 - syscall - ret word_dup: mov rax, [r12] sub r12, 8 @@ -296,6 +307,9 @@ word_foo: call word_rdrop call word_rdrop ret +section .data +data_start: +data_end: section .bss align 16 dstack: resb DSTK_BYTES diff --git a/build/call_syntax_parens.o b/build/call_syntax_parens.o index 4f2a189ad61abe3ddf49694765297ba3e8e3594e..4cfec6cc1283112073934f3ca22c12992eb6328c 100644 GIT binary patch delta 1249 zcmZ{jO=uHA6vt;ayUA|aV5}c&st{ueB~qvbMT-_2$sxg9`~X3eCD0;)7~5o3gtWB; zu|*1QpY&`FLW>}U3VM@hMWKS!i|C=KCzS}1fE296ncdfr4rE|w-uwUl`{sk0#lXY8 z_fNP~B3sdu)_A8jC=t6YTBR_hKKgBKcgf zQwsOqyVRw|i|eFtE;(bbD>>uizGVNa!eFw0W$bu-`el52Em2(d$M1ZARp~GslkP52 z*M2GdYolII6f0`tjoiiO-i-OOzIX6$1!Bs1c_?M3U`|O|w`Hg(v01m9x*+IIOqk5m z+%DP)B@dcK7N=2vD(E@XKMMMI3w;Xpn&Usv_-z(}Bpl%*IOEYnPmuNq^f~H%5cTLV z1E7*1Az0LR!cF?HxxrOeW8TW5pRHfnHs{e6x*ycS5QExn$ zH*-dI_+}=Z9X76IGq=ddbu({__8{rB~f?C@^ zps_#}Y;Kd!D8oRzKEWUUM%~#-46U4UCwpdgJKaLR(WLV_f3c2p-JSh5*MBDX3q-OX IJ<5dq2O9yhj{pDw delta 1150 zcmZ{j!E4iC6u`glOWGz~2DVH;qp~3#j$Wpf9fVEh#KR(+Y*G)xq>NE;;D)Rn^&qaJ z9vq4^ynkQ?CwdXbj^aTPJ&A${^B`I;6Lg?>sygeJBIRj_#lMq zpA7DbfsMR&K%_c%noXzj)o@iJW#PqHbA-vFItd7d^Ig z7RQBQ+)p@L3<1XTZTJjwm#m*dzDjr*`Qw0}Z0Xx5KD0=XtRZg_{s6fJwU|sK$V+_+ z%P|QbV}^Z{n74S}FmOZKW5jNuy#N_y3&b|iuE4aiYs3b7;Oq&whIHN&oAPVU8iXH4 zz8gPAe}uXWBG15gHS0LB<7g-0pegMYVrS6SU{cw2VoPY%J5u%yvA57}!n(5C#MaPi zP&XydLc{D^dgL>2p`U~gz@E3^FI)Wo=9_K!C*bbmFEaVEs1r{c`(!y*ppPSE@F3ry8H?DUiINY}eJ2mX%?LvbcOHO&@cheuo&i!ju Teif(J3IB!be-Iw_LCpRFw2+8O diff --git a/build/loops_and_cmp.asm b/build/loops_and_cmp.asm index 58926cf..02100b5 100644 --- a/build/loops_and_cmp.asm +++ b/build/loops_and_cmp.asm @@ -19,6 +19,36 @@ _start: mov rax, 60 syscall word_puts: + ; detects string if top is len>=0 and next is a pointer in [data_start, data_end) + mov rax, [r12] ; len or int value + mov rbx, [r12 + 8] ; possible address + cmp rax, 0 + jl puts_print_int + lea r8, [rel data_start] + lea r9, [rel data_end] + cmp rbx, r8 + jl puts_print_int + cmp rbx, r9 + jge puts_print_int + ; treat as string: (addr below len) + mov rdx, rax ; len + mov rsi, rbx ; addr + add r12, 16 ; pop len + addr + test rdx, rdx + jz puts_str_newline_only + mov rax, 1 + mov rdi, 1 + syscall +puts_str_newline_only: + mov byte [rel print_buf], 10 + mov rax, 1 + mov rdi, 1 + lea rsi, [rel print_buf] + mov rdx, 1 + syscall + ret + +puts_print_int: mov rax, [r12] add r12, 8 mov rbx, rax @@ -65,25 +95,6 @@ puts_finish_digits: mov rsi, r9 syscall ret -word_puts_str: - ; expects (addr, len) on data stack - mov rdx, [r12] - add r12, 8 - mov rsi, [r12] - add r12, 8 - cmp rdx, 0 - je puts_str_write_newline - mov rax, 1 - mov rdi, 1 - syscall -puts_str_write_newline: - mov byte [rel print_buf], 10 - mov rax, 1 - mov rdi, 1 - lea rsi, [rel print_buf] - mov rdx, 1 - syscall - ret word_dup: mov rax, [r12] sub r12, 8 @@ -305,6 +316,9 @@ L_for_end_1: sub r12, 8 mov qword [r12], 0 ret +section .data +data_start: +data_end: section .bss align 16 dstack: resb DSTK_BYTES diff --git a/build/loops_and_cmp.o b/build/loops_and_cmp.o index 8e4f71d7f4e537498834a2e3d5d3b95f83a19c04..9fbed6fe4a773f8cf92f92823478979ad0689e86 100644 GIT binary patch delta 1237 zcmZ{kPe>F|9LL{pX8+8nOQX5HHUr&O3PbuwQBtH^9#-0efACfe3%ihDo4S)CtZ7J; zgwXKoP|zVSp_d?xqHbG8RwwHad58=;L>&qb2^scg=C?~e*nye%exJ{G-kUeOZ+=ET z*WEm!YRqTHTkXp`^fraL$7_2g27mxt6(eBBx8VX95V8y0DVKLcjZj=S0$%zkMxh>d zVjOr=C$UAJ=bZA8I5n?i+o^4IMrdlN^vW$XFG&W)4zuPmf@4cSH1kM(rwcu6zOf^$*74I26@BHd^QdBl|R zAIbJ(LD(_LekY6gE69~O5dVZ)71&FRYCN(cg~M(Q>@Ri+84UokzY%HcxgH<2vtHldMfPq`IpsUG5T(N&G(XE}YRh z0ACqio=kl`{v1`m&ZOPJB>tYCc?92Q^{~m^mvoWHDzq zn3-%E_f?%Ny%lF7AC6V=ac8fuZ+Hu9r=>a8S?>CVcbqB1hyUZwIDcrI>k==H|3u<> JrqE}B#6LwGsZIa@ delta 1129 zcmZ{kO=uHA6o6-D^Rr3T!%B7B3JIZ7NiPy9;vuC(JtQJ%wcfPBL(oDgF-fVQXiE zDLaHQ8Fa{0;wIhUh%u0q4FVU^tvE*C!m1EtL`Jj)jEe#IBp&SVJ5pSDV;3I|>sVO$ z!{E6XZk4U`f`5h=;WU2*$=bHCVA_@e8p@wA+LaAwPhhojyV>Cy-~sjY)5W z*aF%y$Sd0*b^>h^ZYsM%Y!&TmXe#@G*!yTVU|rcZu}{%jz~j=(TAgW4Y@xjb+4#}x zZ*>+l(3@`QdJn$Q<$DkP*@L$YhhOm_NGDE1Baus0X6m(4tzKoFO=-3|SudBS%d=CH z)8*EyM4H2vlXHV$M9X#|9l7Qe-qy6gP8pT Dwc3AC diff --git a/build/main.asm b/build/main.asm index 0bd0700..031a9dd 100644 --- a/build/main.asm +++ b/build/main.asm @@ -19,6 +19,36 @@ _start: mov rax, 60 syscall word_puts: + ; detects string if top is len>=0 and next is a pointer in [data_start, data_end) + mov rax, [r12] ; len or int value + mov rbx, [r12 + 8] ; possible address + cmp rax, 0 + jl puts_print_int + lea r8, [rel data_start] + lea r9, [rel data_end] + cmp rbx, r8 + jl puts_print_int + cmp rbx, r9 + jge puts_print_int + ; treat as string: (addr below len) + mov rdx, rax ; len + mov rsi, rbx ; addr + add r12, 16 ; pop len + addr + test rdx, rdx + jz puts_str_newline_only + mov rax, 1 + mov rdi, 1 + syscall +puts_str_newline_only: + mov byte [rel print_buf], 10 + mov rax, 1 + mov rdi, 1 + lea rsi, [rel print_buf] + mov rdx, 1 + syscall + ret + +puts_print_int: mov rax, [r12] add r12, 8 mov rbx, rax @@ -277,6 +307,9 @@ word_foo: call word_rdrop call word_rdrop ret +section .data +data_start: +data_end: section .bss align 16 dstack: resb DSTK_BYTES diff --git a/build/main.o b/build/main.o index 1c4908253457c76047dbfa9daddc48a6f216fa53..b86790271f7dd3c0b9f676178184207224cd51d1 100644 GIT binary patch literal 3472 zcmbW3e`p*<6vt2CaXn6p9wXgIcf_yh2jXc{6WsH_yBK!-3s- z^O^6P_x8=)?!7S`d$vtcnAa5cH1kIuWo*JX(Vk#o77Eb+XF@Evb`bZ8HVMwOZ=dMh zK4kasG58Z1`?G@xaY!@X#d)}e|8a(ipg)bjyMZrAz4%X}pV!ga_VJ1B5u|bu3vvb% zhT#yuAXjL6Wyd1Cr_T;kzjR5#-y|RzvVJb3H4*;Z(*I-GF(@ba()h8`qo9~^e~*<0 zz^d%x>8uDgw&jGiVkn{&E`(KgePx`}o(@5ZuSCLX;SO6o5G#qDij`m|SZu7kI1wAW zwDgqfo>$##+_hIdamDFgf#6@mt*2v6cy#$lEscWnSvg(yW0ogHCTd}mEp@8ZtCPY9 zb2=Y7C+Q!-Y(t+vT?uB+*>hsqo)H?`6H~kp-36(z{yl3tQ9;2<$+>oZeK)m`BXi7O#v4y zpZ0igQ0?bh0k{)i6jbWFYIU<2-4j@;*cVa9%IDzWdrp=it{){h_jZf9_gc(-&|>cW z7IUZkIkm{}N#xkean5kJqBYv6oH?)fZTqJ+m+q_)M}NR zTeX@;;rx0ws4MVxsay&u_?VR|FV(o?0e(cMvN&JxvnE`8Ya9GdSA`xH7e+m$ z%T4$Xb-q3JwI;lRywU%%UJ_FTkLRtV`9#XF(orLqVtURoYzMn&I-@6!SdKn#B=ZTj zkg-iYn|E>yZd_^W>BK_PN+eTrW^&K4D8Mw_qUChvO3I!=`5#o-yYcqiBqn`bb?itYM@ZG?If zKFlVb?o!5CL5V1i$8TOG7OgryLvgy`YqK31Ztp=kPf-7lBvc)%JK=+4#b<{q#Jy1R zv18MZ-O6y5b;zpXey~v&DuCW6HYs6J9X%M!`yZdX4;>TXjq$kwRL#>coq5UjtOQA` zo=91>3rRD)I6n-uw<{uz5$Q8)%i`5;bLq;+JoaGD?Z)UY@ip>Q54_P(-DI{F7d8x< zt@FS1o0-dI__MY2=j=BC7LRWSYK9H-*p=#atM-=&x}|vl@IvCw9w=nyb25E+$qH|d zhl{;k4KB(J->8>(+uLijy}w4=M{BfwxJKItQJYy8G!wP8 z7LF_2A=huBzFE$Bf>vgtzKzyEm%FGwoSMfY3gHQ`CJPEpM{q;BW}JH1DL5?`20TMSLIQgT!sdA0=L9e3bYs6~8_wjboY zfQodfY!_zSz&@Ott`@|Rvgg>9YTyfe*||Ik$35t3I9)DRRI~3MEGaeRmR$dkO*Wau zsa8}v#{<7a<--L}DgQ{0m_3wN$R2XE$Z0X9#cmQ=$IiBGnMh|RwSnefXD4H=g-Guj z)HyRs6pMN&#cHXoaZTDOY0#dXrR-ibr;0oIqB44s#I;s%s$3QhEI61{VF$1po+7G{ tq~f`yz|L2vL|fT~l7suFj~|{A)GKu3-+_(rL|h&aq3+d)zrybPe*iSS7##or diff --git a/build/override_dup_compile_time.asm b/build/override_dup_compile_time.asm index 99c6ae4..98ad08c 100644 --- a/build/override_dup_compile_time.asm +++ b/build/override_dup_compile_time.asm @@ -19,6 +19,36 @@ _start: mov rax, 60 syscall word_puts: + ; detects string if top is len>=0 and next is a pointer in [data_start, data_end) + mov rax, [r12] ; len or int value + mov rbx, [r12 + 8] ; possible address + cmp rax, 0 + jl puts_print_int + lea r8, [rel data_start] + lea r9, [rel data_end] + cmp rbx, r8 + jl puts_print_int + cmp rbx, r9 + jge puts_print_int + ; treat as string: (addr below len) + mov rdx, rax ; len + mov rsi, rbx ; addr + add r12, 16 ; pop len + addr + test rdx, rdx + jz puts_str_newline_only + mov rax, 1 + mov rdi, 1 + syscall +puts_str_newline_only: + mov byte [rel print_buf], 10 + mov rax, 1 + mov rdi, 1 + lea rsi, [rel print_buf] + mov rdx, 1 + syscall + ret + +puts_print_int: mov rax, [r12] add r12, 8 mov rbx, rax @@ -65,25 +95,6 @@ puts_finish_digits: mov rsi, r9 syscall ret -word_puts_str: - ; expects (addr, len) on data stack - mov rdx, [r12] - add r12, 8 - mov rsi, [r12] - add r12, 8 - cmp rdx, 0 - je puts_str_write_newline - mov rax, 1 - mov rdi, 1 - syscall -puts_str_write_newline: - mov byte [rel print_buf], 10 - mov rax, 1 - mov rdi, 1 - lea rsi, [rel print_buf] - mov rdx, 1 - syscall - ret word_dup: mov rax, [r12] sub r12, 8 @@ -269,6 +280,9 @@ word_main: sub r12, 8 mov qword [r12], 0 ret +section .data +data_start: +data_end: section .bss align 16 dstack: resb DSTK_BYTES diff --git a/build/override_dup_compile_time.o b/build/override_dup_compile_time.o index 388f9ebc9575456b39efb6fa8518153e33277a75..2b38b61582802613fb04671eaac1c330628462f7 100644 GIT binary patch literal 3376 zcmbW3U1%It6vyu-yLFSMCP*pUBv&5hBDP&3GT@(GLD=3==_r8vl+Kz99ADKa74}M{7I8Cz>Nj<(HWM8<;TE zXM}$sS7?K>V=>;-y~9+#R|>kw;xzs+m(iMl=USiiKP@{3>3}bdpR61J#hm*~vT_it z>-%^*n}SX5I#IP8j;WV$|6*vi&oUE=)CnrB& zeME6DDDHRMbwF9a;`D7o@N@9hAK4Nfy*^SZ6X1MSPFMYy)r81IDebV;9;J3IA$(B& zA^0TDLZLuV+^f{LxAu%E_4B_CDWg{u_o`a^YwZFD+Z%Uss<>5U{aW!SmFMmB2=PIV zx5Bsg@-C2#`z@(`2KbF!y$cxwksZ zo$}|DGQ*w7hew6H+(A*lxpJS_^Bh)YuDl;>;Pr=aJQdsQflWqmtpMK}_mdmD>CC%Gb*3tM!4)qkO z4eO}od8Tu@Jg#9K%}Q&*%36hE8p=c{o}i3r*jz6VBrmPPl8#IpOG%`S8J?kg#)4-| zpfPS};|T~QF=<;H$JK3rPkC$p z1u3+BGoxEs25%xf5Mi2GgBkpQxL$Ue!wX|eB0E9k8KjB}tYK;3+uXb-7oIx!AG(Wg vDDiKQk9{s4I5vasz`>WlPDPXN6R8jK#eg2x->J)WHVEHE{sG}D#TcIUXT2d%9CFrFkw0JO5Xe;s75cN`{h$pKO_vadnbFZjX9Rihy`8b$-ga=`oOJm&U$vE8LgZwO%xs2tJ&8wbs(lPti zy_7|89B?|sUK?K8%ebv<=2;f|Lp z#|)l{#9mej2r=*v3cg`@?7L#k_gLF1{P10RC{&p3N!-4AdUlp}bI#TYzutwfAh$?; z3HcMk?;zjz_)JGXLUGg~Uho2Wi}07o?fuYXC`3NnTZn2Bwl&?HAm%eZmxQV&%~@ib zXqVuBgxH)GB5Z7hu3$deUe-nNIc_02??f05N9tX>wYl_%3 z+66eU?GCXkXshtkw!6e`p?w2ULz*9m1+<@F!L|)zpQBZvY>eD|RtG| z4nN)YV;BC_IY3fvFMMTh)txjosnlh%%J;raeX_#dqQMR>apV)h?${dX<^ diff --git a/build/string_puts.asm b/build/string_puts.asm index edace3c..e868593 100644 --- a/build/string_puts.asm +++ b/build/string_puts.asm @@ -19,6 +19,36 @@ _start: mov rax, 60 syscall word_puts: + ; detects string if top is len>=0 and next is a pointer in [data_start, data_end) + mov rax, [r12] ; len or int value + mov rbx, [r12 + 8] ; possible address + cmp rax, 0 + jl puts_print_int + lea r8, [rel data_start] + lea r9, [rel data_end] + cmp rbx, r8 + jl puts_print_int + cmp rbx, r9 + jge puts_print_int + ; treat as string: (addr below len) + mov rdx, rax ; len + mov rsi, rbx ; addr + add r12, 16 ; pop len + addr + test rdx, rdx + jz puts_str_newline_only + mov rax, 1 + mov rdi, 1 + syscall +puts_str_newline_only: + mov byte [rel print_buf], 10 + mov rax, 1 + mov rdi, 1 + lea rsi, [rel print_buf] + mov rdx, 1 + syscall + ret + +puts_print_int: mov rax, [r12] add r12, 8 mov rbx, rax @@ -65,25 +95,6 @@ puts_finish_digits: mov rsi, r9 syscall ret -word_puts_str: - ; expects (addr, len) on data stack - mov rdx, [r12] - add r12, 8 - mov rsi, [r12] - add r12, 8 - cmp rdx, 0 - je puts_str_write_newline - mov rax, 1 - mov rdi, 1 - syscall -puts_str_write_newline: - mov byte [rel print_buf], 10 - mov rax, 1 - mov rdi, 1 - lea rsi, [rel print_buf] - mov rdx, 1 - syscall - ret word_dup: mov rax, [r12] sub r12, 8 @@ -267,32 +278,34 @@ word_main: ; push 11 sub r12, 8 mov qword [r12], 11 - call word_puts_str + call word_puts ; push str_1 sub r12, 8 mov qword [r12], str_1 ; push 11 sub r12, 8 mov qword [r12], 11 - call word_puts_str + call word_puts ; push str_2 sub r12, 8 mov qword [r12], str_2 ; push 0 sub r12, 8 mov qword [r12], 0 - call word_puts_str + call word_puts ; push 0 sub r12, 8 mov qword [r12], 0 ret section .data +data_start: str_0: db 104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100, 0 str_0_len equ 11 str_1: db 108, 105, 110, 101, 49, 10, 108, 105, 110, 101, 50, 0 str_1_len equ 11 str_2: db 0 str_2_len equ 0 +data_end: section .bss align 16 dstack: resb DSTK_BYTES diff --git a/build/string_puts.o b/build/string_puts.o index 8b8d1c850f5b543a973f4c7dc06ea708c1bf51ca..a845dafff1818bcfa15293aee2c375cd61579f8c 100644 GIT binary patch delta 1163 zcmZ{iPiWIn7{K#VYumH|ci6H}rN{;rCTL_jhDhBIX)%{MFTylN*2A#Gu8q#YhL$nr z7=xA1gLn`<$qphTih>83e@=p0VaP7J>See6y9}+=mzU2_pDd6s-~0XE_uluCti*5a zn|nZ}$`8B9r}A=&tb?ha~c&9PdQl2Nk;41_~3N${JU# z+^CShW*3coVaT!#dV?PAb(|<6(x7RZM$tA4HaM{(A$OFu2H{8SMB{NGA#0ga*sHs- z+fS|TU1vDnjN|JKd>74s)!Cti+fb4f@*MhPMeV@%?{3!kDblbYE3H}1w&IF^0I$=a AJ^%m! delta 1003 zcmZ{jO-NKx6oB8klf9XFJ{=>wK1^~@aH35w23%we1W5yJCUPMtL&PXTh&UtSrW_n&wY!#*i-9X zS%b+^c@UnLHdF8kJ&o6GUb#?U?8UfapZ`{maLwzhv}J5MML+0`WJRUkvnJ65j)&lZV9j4E}_8E0%5E(E*3`Yb@Fv zYj)T>XP6E8E`<>0-W9{v$d02gY~HXx$u8q{VILVbs%o&_VJXbh-wb<_>~Di7h<7q| zco34recTbVE*N&0YzE^I?kyX3jBFV*!d47BL-suuh5c;UJ7m9NMc9U6SILI39vOhA z7>{!Ag<{NV4eqX!SIVxF?K12~EJite!HS4mSQl|yM!%u@L!$fe=-vNthNqnc{NN0o znwcx)v-!fTb&zD|XQv9e>~wDa=G1hq+H`EdcGt(WdmdNZvoM13HV$>%ak>ACt|y1e dC-`?y&9fYN6S3qYq*T=j%(U^YONKr8$$gskfrkJ9 diff --git a/build/test.asm b/build/test.asm index 81c4db2..522ba94 100644 --- a/build/test.asm +++ b/build/test.asm @@ -19,6 +19,36 @@ _start: mov rax, 60 syscall word_puts: + ; detects string if top is len>=0 and next is a pointer in [data_start, data_end) + mov rax, [r12] ; len or int value + mov rbx, [r12 + 8] ; possible address + cmp rax, 0 + jl puts_print_int + lea r8, [rel data_start] + lea r9, [rel data_end] + cmp rbx, r8 + jl puts_print_int + cmp rbx, r9 + jge puts_print_int + ; treat as string: (addr below len) + mov rdx, rax ; len + mov rsi, rbx ; addr + add r12, 16 ; pop len + addr + test rdx, rdx + jz puts_str_newline_only + mov rax, 1 + mov rdi, 1 + syscall +puts_str_newline_only: + mov byte [rel print_buf], 10 + mov rax, 1 + mov rdi, 1 + lea rsi, [rel print_buf] + mov rdx, 1 + syscall + ret + +puts_print_int: mov rax, [r12] add r12, 8 mov rbx, rax @@ -730,6 +760,9 @@ word_main: sub r12, 8 mov qword [r12], 0 ret +section .data +data_start: +data_end: section .bss align 16 dstack: resb DSTK_BYTES diff --git a/build/test.o b/build/test.o index 03b5da4bd1e078463d7837c5793d2d3f969ea25a..b4a5541657f9f05e68828bd3341d013da1177cc0 100644 GIT binary patch literal 6784 zcmbW5dyG_99mmhGyY2E=zygIPSbVHat+4Eahig$6W#LXbo6wgHq3v~cXNFGMnOWzt zuoT$pN@TKGZQ5>{nm$a7ru7eM+9ri6|*f9KAb zAG`a9H<@#P=X1Wl-}#-#J#%LUJ0t6-g+j_)A@vnisTrzNN5y2jL)EKVi~fHm`oiZL z;odRL2hB688|GG5)wNWIe~sXMvjpI(%(#JgJ$)wge^_xM>@WMjZUSFOP5-Oe&)nqP zE~bX+9(?7`IsZN+M;GR26MeX<76H=LNFSLy_@@@2RBBWVSoXh^G(w{N4&R_}>ac%P zb##ZX>_0N{IVie{e~XMPgXO(6U8((=wO`5Chlgt$!$ZHScZy^C*ASgkr^)cWjrGpZ zMYZ$J$OuBK$Ou+KMcPX{J0k6G?z+_}9(9VR$aSu>=R|(iesq2a#hkih+G9oqIU_6K z{Hotvs`Ob}t21$iE~{PBo$-@vwGYb=z-R5N*kBM8W;*5L$F6C1%16#Fc3Mt2#dpKw z|9to;f#Z9xC+ZYS&YqKnzl168{B$i|M)+9m>=|^kvMK&1T>LOnJU*w6Q#n^3F4i`d zFb_o5HP(lR48rtaGQ!2hjo~6S1=)u~aN+3-f8MT)FD0!8FP0{x36m8E;(e`wu%^6la5`XiAkymk%p1-c)S$fP} zJTqOx^LY-;eFfLoH14OZh#lw8mBnY;e2v!g?yStk&0UH^be&!fV`K!@Huif;fOI&T^} z{2IAc(Q|NKk6>@WDp3)1Zx0xUxK|6^>C2V`Po{~7GtN7Ig(SbUB{&w1L`QiSk|%A+ zT~cxkl73rqx0D=!d>av|O^BzQ( zLul%Nm4X$feoaVp<-Gv9jM{^2@T7UO;qeU=3(3QqhcPw4x*k@IoxQ#MdP43cH*?xK zdk*L4nGQ3EJa(yEKKluSP6544DCi#Z>;1q=Q}4?9$zrxboMt`Xqiaob)-Fr{3wm`t=j-K6q3}6gR5vxhh@@6#s6-_O$ z9)DE@@^~1XliucB+P}~E>Axi;26Hmuj3B}Wv z!hRI=CR+~0LzcqMLmx2>P;8n?aV-?9EyY#6ypLH~U@7cgbRMUnxbRVBwDvis6$hbs z+frN=;}s}guoU)u=oq6=jF2LDOzc$kak-dwo%bLlUJuM~qj(m@K@=xZTtcxBi`<0b zb`;xCD4YUcKv6(ZMzIl3`oB;-f?`M0=F>1y*7bz8Lu!fOKVrUA@Sibn z5!}x^q`oTnYplOR@G<7D;J;_yEBGIo?-KkB^Tz}~%lvu4$CoT^@Vl8G5!|2Oka}D2Bo6NTg?yp}+Z5R9!>-PvgQ;#R4 zMg{*Q^PdRb#{5OWZ)1K)aDQDx>Mg-DtUoRIZssjG&8_SE%{U=nSb1f?ub{8B$rn{ry3UgKt3VTFLrm!PhZQ34RCj z-Gcl3CZq-h&$IrB;NM|BF8CwN>+!W|T~AHIpJP5-==U>UBlt1q_Y3|9<}tzl&iqlq zFEW2l@H)M&A+=BNMa&z_A3Hp@o0*2aLU$qA8(W@_=kiU_TuQmQd^DTqTT?pY#xg}{ldo!6n zj*;Aw_N_!RoyDAOO$`c`gRl$qPw?IX7}W{jvY62@4`MqA8n z3uG-7yRF9vc%W`ukJTEl*ejY%%og8BrA#WRLOQT9aY0BjZci0@tMsvCe^ot|sg75fU=9#$ zC$3j^kOBEjmZ#D58LXxO(VlFks@r5jMcibZYys&c8%-yn9#4P z^8TXb-EP^dtGY~NveZVUiwDVVYvvj{ZR0uSP9bWI?TAy-wnwY&!F!24=&3IB@b+NT zlj0}M)G1^l?WdHACesQ(cKG1XCMBX`bdb=#_HS;U9^kA`{F^5JSFc&hc)!IF|8m)nvsdsd%wG|FC;!H}i4&Fi F{0}=G&-wrW literal 6352 zcmbW5e{9re9mk)8vK82%1nd^AOkJH$M``b1QbUwVfje!H8RtS^`Fgz{>|F1zxgRZ^ zj$$q(yHqkahY4{Tn|~}Z7)|_E3@6s&-?j)p6~a$ z&)UZLP44-Ap4apKe4fwq^LicI(zkU%D5T62QlC>n%}}K_1t!~@)U|4%MgKn&ec^MB zbYI|s$;FKgEsa&mL8)f?$V`5>)D!Mk9Ekm-|8=wYLTdcG*w4J=+_X|dV-KFP1%c_g ziUjFdM4zwH2f5<8(R-=Y^p?4!sb!TX*xls4O)2}og&KrJONY3Fud^dG@Rj}d9sD>H z{nbl-2iL%I@1Pk!rdjt)sW~>@)E=vxXpUA-9otBB`J#Z-dbBQDnO65Nj!vEHIffph z2iL>nd1g4i8H7}Ldn`70c_8PJz(%aq~s~Cjj$9EH{ zwzbEq)Wj|)nqwij@Ze&%+Lfu>NUH%kQBbI&hoe)|bJ0~+r17@)Xm{;d41W0|HS`s+K$ZA_V_$)j|FYfam6F?mNtgGsyFKS>mR>PkGY>`rhj}D&w+Wbp_$AH2D;IF6prH)=iaonS61muXS9C<0qltnz}jW>g{Sr9o5wlC_!!_WqW9c#We6 zakPTEZaCG{o*+njf>cz2#Mn3i?!Vuy*Zo%934R65euZpRbFb9vb+<+y?!xFGL^1Ng^7U<-IWyI0Bm`80XqBwxi!$&;k*^WUW8Sn z!tdT5Fm52X3A&ycOM;VW;^78zuTZPI+Lqu_HWD4>EF{y@RutT64U&_PoV6u)O386Z zerZeWTyXKZYaw~qmS9u4OM$yl4BKtEfK3t@xw{Y&48`3Jo%<(@ev(Y1`X*H83Ak@V zbrHqQc1UXXLn_)J#t}1R?2lPCt&krazV6Qua+lR*H)ZC216@|ov0@#tX5blvSwX=Jt4cv&D?g;1HUP)G-Jpk@~!0i+6sd% z0JYlTFu(4DM2tl5%I3LZh9UpsI}~%9yVLU0Va@>X?b475zFpiS@bWX+3iKU9?oD<& zMEy0;8{LGXua146it*Lbkn1Ad>lPKQzldvR>~FYp+%5|3&l$Fa@zFilQCFL&?jiEQ zrDY;r(UC4)#Wowl;_QKd?;Sn6!x+FRH1%0cdX{&g=~Xl#6}{ozM=6y1JlMmq?t=9I z!keIa$kxT?j=?uYlGzma;&<*#qCOS$Vjl&)$<{(~-cs0^ z>MQ1YD4v~9aV->wEyeqKxkyR6BbLJMMd$GsDDJcr_C2N*6Hr7f#rtAB4aEveVb6z- zaR`bx-nJITPE}u*ZM5s$mmqNyFu#rB2#N_5=TN+Z;sz{o2Z}pTjG$1s1wM_UjG~TW z2TuCGP<$6fMO->HTC1s1qj*oTR4By<$QsRhZ>|?ogKL+XhDX{*3|LU7y?h;v%-1I%9*{6XgD1wYLEAAJt1U>$eGhhIvA8TvHhDnBbR~|3GkWJR$Y8;4`d$Met@_52-fmEzIv0d;{~W;9q2Zzu-HW zzbtr$`CEdIGXDVXZR@Er-yry5=DP&{5%Yb5Kg0Yv@m) zS;M?d@NVWG7W~W19l^cz3#mhb-^==^1Rt4$SD61;=)cGO z&w@Y6d`9q}FkgT#TI+d%d8gp7FyAWpUzzs_{!ivd1z)JwFQj_K|D{@)?-BeXn(M{1 zvQ+95KGz4zZwt@CyM5jmt9K5*o%wA4|7w}z`&uV4P|ge{*OpSnQb)X)RZg)KFO>Mz zk;^-&y_u3T93L#F)JVRNbcV{MqC(-s2iQnv_GAnk%;$%^=3-_~&a={)T&8%B!!jKu zSswDjB@3k2C_kJkcvf*F&ddo9c*qGSjS)9S+8FEEh$NkeFY5~INWuts3{E6rwWb1l zU8jlJ5nfo}dA$#Yf`E27zrwW0mz{nU|H@v*p1CeKIrLP|xNY;{_AU0sQU6^C0d2g+&XTMi|xuNQr-l7(9g_6+}`xL&u~+`AXOzuN=;E&fe$ Lg0I0Kj;H@Gk?4tb diff --git a/hello.sl b/hello.sl index 5ce78b8..9f3cb37 100644 --- a/hello.sl +++ b/hello.sl @@ -1,5 +1,5 @@ import stdlib.sl : main - "hello world" puts_str + "hello world" puts ; \ No newline at end of file diff --git a/main.py b/main.py index 1ea71d1..dd0d125 100644 --- a/main.py +++ b/main.py @@ -1114,13 +1114,25 @@ class Assembler: for definition in runtime_defs: self._emit_definition(definition, emission.text) + if self._data_section is not None: + if not self._data_section: + self._data_section.append("data_start:") + if not self._data_section or self._data_section[-1] != "data_end:": + self._data_section.append("data_end:") emission.bss.extend(self._bss_layout()) self._data_section = None return emission + def _ensure_data_start(self) -> None: + if self._data_section is None: + raise CompileError("data section is not initialized") + if not self._data_section: + self._data_section.append("data_start:") + def _intern_string_literal(self, value: str) -> Tuple[str, int]: if self._data_section is None: raise CompileError("string literal emission requested without data section") + self._ensure_data_start() if value in self._string_literals: return self._string_literals[value] label = f"str_{len(self._string_literals)}" diff --git a/stdlib.sl b/stdlib.sl index d7b2c85..25a96b6 100644 --- a/stdlib.sl +++ b/stdlib.sl @@ -1,4 +1,34 @@ :asm puts { + ; detects string if top is len>=0 and next is a pointer in [data_start, data_end) + mov rax, [r12] ; len or int value + mov rbx, [r12 + 8] ; possible address + cmp rax, 0 + jl puts_print_int + lea r8, [rel data_start] + lea r9, [rel data_end] + cmp rbx, r8 + jl puts_print_int + cmp rbx, r9 + jge puts_print_int + ; treat as string: (addr below len) + mov rdx, rax ; len + mov rsi, rbx ; addr + add r12, 16 ; pop len + addr + test rdx, rdx + jz puts_str_newline_only + mov rax, 1 + mov rdi, 1 + syscall +puts_str_newline_only: + mov byte [rel print_buf], 10 + mov rax, 1 + mov rdi, 1 + lea rsi, [rel print_buf] + mov rdx, 1 + syscall + ret + +puts_print_int: mov rax, [r12] add r12, 8 mov rbx, rax @@ -47,27 +77,6 @@ puts_finish_digits: } ; -:asm puts_str { - ; expects (addr, len) on data stack - mov rdx, [r12] - add r12, 8 - mov rsi, [r12] - add r12, 8 - cmp rdx, 0 - je puts_str_write_newline - mov rax, 1 - mov rdi, 1 - syscall -puts_str_write_newline: - mov byte [rel print_buf], 10 - mov rax, 1 - mov rdi, 1 - lea rsi, [rel print_buf] - mov rdx, 1 - syscall -} -; - :asm dup { mov rax, [r12] sub r12, 8 diff --git a/tests/run_tests.py b/tests/run_tests.py index 4578995..cb66aa3 100644 --- a/tests/run_tests.py +++ b/tests/run_tests.py @@ -105,9 +105,9 @@ compile-only import {ROOT / 'stdlib.sl'} : main - \"hello world\" puts_str - \"line1\\nline2\" puts_str - \"\" puts_str + \"hello world\" puts + \"line1\\nline2\" puts + \"\" puts 0 ; """,