From 72cb28157b9a89d16ef602857708b9da71287231 Mon Sep 17 00:00:00 2001 From: igor Date: Fri, 19 Dec 2025 11:32:12 +0100 Subject: [PATCH] fix for reading stdin --- build/call_syntax_parens.asm | 15 ++- build/call_syntax_parens.o | Bin 5440 -> 5504 bytes build/loops_and_cmp.asm | 15 ++- build/loops_and_cmp.o | Bin 5504 -> 5568 bytes build/override_dup_compile_time.asm | 15 ++- build/override_dup_compile_time.o | Bin 5296 -> 5376 bytes build/string_puts.asm | 15 ++- build/string_puts.o | Bin 5648 -> 5712 bytes build/test_read_stdin.asm | 186 ++++++++++++++-------------- build/test_read_stdin.o | Bin 5520 -> 5584 bytes readstdin | Bin 11592 -> 11648 bytes stdlib/io.sl | 15 ++- 12 files changed, 139 insertions(+), 122 deletions(-) diff --git a/build/call_syntax_parens.asm b/build/call_syntax_parens.asm index 08535fb..1c290da 100644 --- a/build/call_syntax_parens.asm +++ b/build/call_syntax_parens.asm @@ -446,26 +446,29 @@ word_read_stdin: cmp rax, -4095 jae .fail_mmap mov rbx, rax ; buffer addr - xor rcx, rcx ; bytes_read = 0 + xor r9, r9 ; bytes_read = 0 .read_loop: mov rax, 0 ; syscall: read mov rdi, 0 ; fd = stdin - lea rsi, [rbx + rcx] ; buf + offset + lea rsi, [rbx + r9] ; buf + offset mov rdx, r14 - sub rdx, rcx ; remaining = max_len - bytes_read + sub rdx, r9 ; remaining = max_len - bytes_read syscall cmp rax, 0 je .done_read js .read_error - add rcx, rax - cmp rcx, r14 + add r9, rax jl .read_loop .done_read: ; push len (rcx) then addr (rbx) + cmp r9, r14 + je .done_no_null + mov byte [rbx + r9], 0 +.done_no_null: sub r12, 16 - mov [r12], rcx + mov [r12], r9 mov [r12 + 8], rbx ret diff --git a/build/call_syntax_parens.o b/build/call_syntax_parens.o index 5f6143ae670264047e6def211ae7d05fa647b4b1..aed5fd1d58f3f3315dacb2e656ae1e8d72090408 100644 GIT binary patch delta 732 zcmX@0)u26L0i)Q&h2~5NoD&_zCVtRhOqeXmXb&VK8SO<;N0Mr(-PK44%zz1bjDlum>|TuAh8|!@?!z&;S1~!hr-(hQsqX ziwek~7fnb4j39wRkTS1dK*ATq@&FQtK`Oyuvp;7fYrO+2j1Qq#Gl6JE1}`-66HxI8 zH1Wq!@hmj)zfkc;G;wxji1~*h;`I<)fut-{;xU>A9jG`nD0Gp4DO6kyP23TOxHnYX z2}OM}14AfOA`nG_fguAbo`)u04i)c26K{ly-$E1bn*5PpoN+3coHtofK%8;u!i!EM z0Y;EO1xQ)oFCY;DV)+A!!<*wdBU$U6SwT7wU^Nqn&BzdlCVmVmo{T2`04iRECjJU4 zz6VX5ff-`{9f){6+-82L#2+*b5>Rn@P-r3n6&&JvP;qNC^%hWZFBI{~^Z2W`@a*jG~MklM{hrlfmSy$rFL>rC@UXsUQduc{=$aqdAj+=wvA-3&!Hj!A#7o zmcbsKhkXrC?f|LS4^{ak3$&qFDd0|Nmda|NH+RD9_<}oJ9p>+~LjnoRO^c4y+&! z0xV+!u^Ab>(8Lcz#Us$f??J`0(8Pa0#T(JYnV2EwABKq6!)=y;N<2o>pbiyh1_c`u zFo24yp^4kz5O;%$JE5ot+8+Rw2t<)!U`U3F=b?!gLB%`K#A~49+tI{3q2f2u#HWJ9 zC%Xy=GcK6yC?L+fl9^$$BcmwehRKBj;*7h&X)FBRCM* Qpss<5*D!!13@isC0FQ-aK>z>% delta 643 zcmX@0-Jm^T0i(vmh5va2*crfp4M_S$sh<3IWhSmqdC(Bk;zg_7K}NYgPE9F zjeI;h4|^D%+yPRtA4GWcnsEDce)7;f#n0-|{DYx{t3u3!@t}|8$C_K7&2I!eH}|ub zGBQq?%*tuRxMQ*fr=sk%U;qEVi2wKhKTw{-^EitN$ehC<0thzeb4Ie(JF`M~Fmf3a zh{ebdh$emzDxQocej6%Yg(m(KD!vCz{5Mqm4n({jW-kL5GsNOQXc~l};_{$iLjv+R z#5JMf)@bUDq2gXB;*;0$b48}32r)2(LX|e5iN{05H=v2*`PIH0ps$C3(c86a7=U*oA^P4@xx?EMtdL`$!ITXz{vmx7VHq34M_P+UdyP> zSs(xrxiR@6qd8;1WJxAV#^TMvOw6p7!5*E5eGO0U04dlHBD{J{xP3Z5`DmWvXZ2|Q z!BE0pA?wL_u;#9><;N0Mr(-PK44%zz1bjDlutzd-fOLSs<_8=Rto0785FU)&!~|k7 zGI*hhpNEP^pozbNif5sTvoJ%9Yvg$)w0fr_i4 ziF@D>4}yw2p{Vy}V2FWA1fobVFyuqU^U%cWpyHiq;vJJ4`NbJ0gGlB%%nXwq8ATZv zPu>U=TL&h$PJRev9{`i5CJPD}Obp=I>?m-Mi6K sCK-x|GtL5&M<*wWh+ABT1`R04S%CP@e@1YCut8k{6R%+aM+!W!0J2$H>Hq)$ delta 580 zcmZqB+MqdM0po&+3(c7xa7=U*oA^P4@xf$CMtdL`$!IUCz{vmx3hWS?4M=%UUdyP> z=^y|R***Coqd6nPWJxAV#+=Q;Ow6oCJ|3NiJq%Co04dlHB0PFcxP3Z5d1#*EXZ2|Q z!BE0gA?Cq&(8uy)%`MO7Hv*oU``IHIH-F>^XRUW;1?fP5O-vv*BSRpX_*tlUGMe~v zsCX5c_(!Pt9yD=wW{CNBAma6Ko5i3Kf6z3@L&fDmVSxm+afq8j#jVlQ+e5{@P{b$e z@pEaWqX;oDBtn%op^0Ztp2#oGSOzBRCm#f|+a`Ymk`uw?jLC`u;*5*Izp6BJG?K>X)FBiMKU(Zp*Qz#$3u FIRN@DQqKSY diff --git a/build/string_puts.asm b/build/string_puts.asm index c2882b4..87e60db 100644 --- a/build/string_puts.asm +++ b/build/string_puts.asm @@ -446,26 +446,29 @@ word_read_stdin: cmp rax, -4095 jae .fail_mmap mov rbx, rax ; buffer addr - xor rcx, rcx ; bytes_read = 0 + xor r9, r9 ; bytes_read = 0 .read_loop: mov rax, 0 ; syscall: read mov rdi, 0 ; fd = stdin - lea rsi, [rbx + rcx] ; buf + offset + lea rsi, [rbx + r9] ; buf + offset mov rdx, r14 - sub rdx, rcx ; remaining = max_len - bytes_read + sub rdx, r9 ; remaining = max_len - bytes_read syscall cmp rax, 0 je .done_read js .read_error - add rcx, rax - cmp rcx, r14 + add r9, rax jl .read_loop .done_read: ; push len (rcx) then addr (rbx) + cmp r9, r14 + je .done_no_null + mov byte [rbx + r9], 0 +.done_no_null: sub r12, 16 - mov [r12], rcx + mov [r12], r9 mov [r12 + 8], rbx ret diff --git a/build/string_puts.o b/build/string_puts.o index 9035e65f96635884c9a20c7119979c329c84544f..febf51b9113299fd49da23694dadc7fe9f3e02a4 100644 GIT binary patch delta 767 zcmbQBb3tdq0>-x!7yjox!Oj2%Y(O$-@>)i1&ICb-$gjx{8O<3JCQC9|G8S(RW@2Ww z4EE?e>}z;(2S~ww5aHEp!tK-f$w%`PKdVRc4~7!<3RzFagEe=3EkBm9Ivr!-X7Fr& zBjCHagMA_6W&_R&)_Mn4kVXVp!USS7GI*hhAB2iWpo!msif5sTe}jrQqKPvwL(D%6 z5wC~aEC!W$jHW>qD$WcF5+tAp6<0$Ox56Rr0u^^cQSZ&b;0KimM3G=%NQ8>#p@|nj z#XHf&t0sTs7iVk*k&@kDH6Ql^MWL1+o!lrY?s*+amIWyD=RYG@o(<}A lkS>sT4Ffo`874x-LB0li0<4;WVcq11qT&*#(PSl{vH+;&Xa@iQ delta 717 zcmcbhGeKv<0>)<(7yjqnz|H^$Y(O$_@>)i1P6t7V$lb{g8O<3LCQC9|GUjX!W@2VF z^6}_A>|uCv2S~ww5aH2l!tK-f$wTuLKdVRc4~7!13Na7HgFcoYYi@ZqzY*}<+|Ry{ zkp-l5vo2>fYrQioh>ZYCm_TeshCnp&{ZR2_H1V5I@hUX&$58P-XyQMi;&&k8^>CXx zm?0MbLDL`z6_*DE2ojLRA+8P;w?=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 - mov r8, 0 - cmp rbx, 0 - jge puts_abs - neg rbx - mov r8, 1 -puts_abs: - lea rsi, [rel print_buf_end] - mov rcx, 0 - mov r10, 10 - cmp rbx, 0 - jne puts_digits - dec rsi - mov byte [rsi], '0' - inc rcx - jmp puts_sign -puts_digits: -puts_loop: - xor rdx, rdx - mov rax, rbx - div r10 - add dl, '0' - dec rsi - mov [rsi], dl - inc rcx - mov rbx, rax - test rbx, rbx - jne puts_loop -puts_sign: - cmp r8, 0 - je puts_finish_digits - dec rsi - mov byte [rsi], '-' - inc rcx -puts_finish_digits: - mov byte [rsi + rcx], 10 - inc rcx - mov rax, 1 - mov rdi, 1 - mov rdx, rcx - mov r9, rsi - mov rsi, r9 - syscall - ret word_dup: mov rax, [r12] sub r12, 8 mov [r12], rax ret -word_write_buf: - mov rdx, [r12] ; len - mov rsi, [r12 + 8] ; addr - add r12, 16 ; pop len + addr - mov rax, 1 ; syscall: write - mov rdi, 1 ; fd = stdout - syscall - ret - ret word_drop: add r12, 8 ret @@ -532,26 +446,29 @@ word_read_stdin: cmp rax, -4095 jae .fail_mmap mov rbx, rax ; buffer addr - xor rcx, rcx ; bytes_read = 0 + xor r9, r9 ; bytes_read = 0 .read_loop: mov rax, 0 ; syscall: read mov rdi, 0 ; fd = stdin - lea rsi, [rbx + rcx] ; buf + offset + lea rsi, [rbx + r9] ; buf + offset mov rdx, r14 - sub rdx, rcx ; remaining = max_len - bytes_read + sub rdx, r9 ; remaining = max_len - bytes_read syscall cmp rax, 0 je .done_read js .read_error - add rcx, rax - cmp rcx, r14 + add r9, rax jl .read_loop .done_read: ; push len (rcx) then addr (rbx) + cmp r9, r14 + je .done_no_null + mov byte [rbx + r9], 0 +.done_no_null: sub r12, 16 - mov [r12], rcx + mov [r12], r9 mov [r12 + 8], rbx ret @@ -568,6 +485,91 @@ word_read_stdin: mov qword [r12 + 8], 0 ret ret +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 + mov r8, 0 + cmp rbx, 0 + jge puts_abs + neg rbx + mov r8, 1 +puts_abs: + lea rsi, [rel print_buf_end] + mov rcx, 0 + mov r10, 10 + cmp rbx, 0 + jne puts_digits + dec rsi + mov byte [rsi], '0' + inc rcx + jmp puts_sign +puts_digits: +puts_loop: + xor rdx, rdx + mov rax, rbx + div r10 + add dl, '0' + dec rsi + mov [rsi], dl + inc rcx + mov rbx, rax + test rbx, rbx + jne puts_loop +puts_sign: + cmp r8, 0 + je puts_finish_digits + dec rsi + mov byte [rsi], '-' + inc rcx +puts_finish_digits: + mov byte [rsi + rcx], 10 + inc rcx + mov rax, 1 + mov rdi, 1 + mov rdx, rcx + mov r9, rsi + mov rsi, r9 + syscall + ret +word_write_buf: + mov rdx, [r12] ; len + mov rsi, [r12 + 8] ; addr + add r12, 16 ; pop len + addr + mov rax, 1 ; syscall: write + mov rdi, 1 ; fd = stdout + syscall + ret + ret word_main: ; push 1024 sub r12, 8 diff --git a/build/test_read_stdin.o b/build/test_read_stdin.o index 05acd01766c59c3b9f5a94ec308d9dee22a1604d..27caafde38952d3a34fb595d63bef1b2b239eacc 100644 GIT binary patch delta 1967 zcmZwIT}V_x6ae6vyI0-K(A``UH7P+P@xjtSO;GWnc1=sOB8^f+#Zp$W6)VJ579Tb- zTqb;wD1(RsD{CR@B@?yQLJEA)5Fx2xDGTh6N@<&!d(`Wpd6=2~&N(ypfBRBjr}hof zpWf@4G~fFsk5;i*D*AGo7d>bqvUP@OV<;aEu{$)?w8NswC$>N{6>~I;Q?lq;R;HAM zxfhLgkDBCrU>H)f%WR&p;@y*vMD~d23VZj27kR!GrM!p?vAKT{XV|#}I~{GGFV0?a zh7>$g!-?I!Xf9@b#te2%`N9Sa@%#9S&($QN5)wG@Hy8|z{0;_rmZp5sK*=(P9yQ7C z9yi*$pE|b&hJq;N$1>YwijVS&`e~j%CXPlnUz(|ux=zVCB@LjfLp^x&D!|wR-hsRw z+>5*${4R1WkGjZ96c~VlS>!jsza!TcrX+%H3_OPXDCFbdd!@V9i(WzCC@Rnngpz9H z3y|N0{3CcL@^9e%dKdezKwwB8;AWJ+De)t>g1<+e08SLS;98dqz72UgcfLO*StyVT z1xJwY2d_e20`5d!0X~ep4&1MZ{dKJw0<);#JUB7vlKHd?d?)gY;5o=IgBPti?0*#k zC)WbnMz_JMk^8{gkUs(MMLq={$KPdr`|N^1HVTBwD?rIX}4A$S1&$BYz8iM)URi{|5qHs6dsMl9Dmxap3Qer+^#8 zS6kQ8!IL*Q-#_=i0YYrx1se(oISgKkycXPn+zIYM-XYw|U%zP-=wVBdF|=RyS6HGs zCibRWLLpmp=Od=~SgARNK4e|IACS~#?^444P?^Orv`qUWwlxFehE_Df zavdV}P-yicwx@~gt%*`75rcfGhcJB^VueLfY23~|_hZu!IuGZb`}@A{oV#=XEK%BD z+CM(tr|rS}){ zS-bKSI##!PvHJrrw|m(A%<>w2p4YOA$b=+MYMPde{?RlsyRN(?y~`Z#>Pt?Tm0NLN zUh*+ck^eG>rNHX{&Fg1*`gpX;a)_#4y`E4qAdczIFNT!F(7ft%>+K=?oY z%Ew2Ucf?GPIVuOdLVil`C;%jRtg8?h zK?ObF3FP;{7mz;!H=9yZi@^Z6YnAi$UqE2*ssJG|@Keagz*~_|fp;UH29F^Z_fh5V zMgj%qp8 z0WZ!-UB0pYIS5pz10v%F_%Y;R@DAid;0fdt;B&}7N@9IVKBK@FDA=NZk5@F~p`xS~ zd9k=vlr$jU1Ky7OICxJ93N%6B4f0E@%)ijre zS%_CW7yU3B37VjDV+30mgqr`r! z-^Ri@K4#B#s~xb2zAgId`~xpq0C_f?KV9MaL$IWYXOxT}Uk0B;-c7^}Ak)S+IEalW Jh@TCK{{RQR(3t=L diff --git a/readstdin b/readstdin index 6541ca6e9088c72b796ca3032961d42a9edd2af7..5f6fb0700da3d45394c4c7f01e4c3123584f170d 100755 GIT binary patch delta 1917 zcmZwFUr19?90%}ox0!m)oX)n?B(345(+8QAi;vlNu9z$V@Aw*17loH2u*Ye)sVCp5OU%@BBq=#TSfR zpEuPWKD&%azuB(NBT?K@s!`iQU6WxJw@TmL80}MK7n9e2npo<2?hhb zzk)%wfvl`4V4GtgZsd9%W7#rVn&Y@!=Pf`kedN0)%j+ zMlDFA`BEkgIMRT;2D}w{6Sx<7EBIaH=VW)1*C?RSFoOIV_;=*D!B<2J(rCUs0M{UY z3cgu#=lpa+{1EIx4R68Ak$(iYBOe8CLp}-KvDn4^XCUw`4w!M`KZ1Q4Kk`WMG2~is z5+jI>3%@nstC5?Sv;8@;2?bfuup7Ameh9e*+=09h{66whaDR-j=>4~LJJCQ#F-;ewQc(v^R zzW+1?CsD(1@B!o+rFbxoj3QqPuG9+h$)TFSQ7DLSFPnLf_Otp#s{M3|jo*kh z?!DBdBsY?Bm%NFyG})kw8)K=OC`l4p^D8Yd=(t<7%22JWXlm%T8H*LmE9~`$OY7~W z^-Z<4^lDlT9X8a^9mXj7E^V5=Fs4d2_vMp5JD1<$%^kKRw{E9)AA9Nx;i`^+X G!|)f@qv}rp delta 1850 zcmZ|PT}V@57zgn8%wx`loK4*sV$>$f`7tB=q`PGoowY$m5;_$t{8*Z4rl@4hluWUK z?j=IdsHmW;5F=&~Y6eymC|-niBT2LiZLGSmP}Y0So;mhFyLisa@BcpU$2qX>@^`MG z9Ik&jw<$TegDAh?_`|CLcbTSXi^ahTvs&uiAYEsj-o!fsAx>|~J%NtubJIHo718)P z)-oj*$$Qu>&?S9=YEqzT(XHXl_TDwMeSkO9MsfE$J@;*~?k-Ud? zItPAAxgUf?d7oBIhbVC~&SRmjW!A2>)6@EcC*^hKcr)P%3An=HaA4wZIIOHLEBghi zHW>`cTfS9Gx29Xgz!;vwZ_x!YQ`7c`^?zm4XU9XjWS?=`Q!1}OIPySiQ%2EpMHz5p z8u<!xH>KV+9TlRIA{Amfxs3Q5Hb#4 zf&3M?8~H4F7xGWwe&kECd)UXFN5LvItRP^Jy+0d=>d; zm9jra)=}^s8up6YCshu_CCCqsIFM(8mmxm_-hjLqye9_*E(ks%ucH^T4P1*{Gdh$x zp|DOlQmpjQVU`XmX#z1CZLx@rd~}AbFs9VUG{nZwl{!gH7DGk@>(a7|5%j-1N6)Zy zQAt%K6|LDvZ(8c> gol0>hMNXB-9uB&0%}?&OL}Zzo3XXCvT2^5B2Wj`_H~;_u diff --git a/stdlib/io.sl b/stdlib/io.sl index a480b15..8ebdc89 100644 --- a/stdlib/io.sl +++ b/stdlib/io.sl @@ -151,26 +151,29 @@ cmp rax, -4095 jae .fail_mmap mov rbx, rax ; buffer addr - xor rcx, rcx ; bytes_read = 0 + xor r9, r9 ; bytes_read = 0 .read_loop: mov rax, 0 ; syscall: read mov rdi, 0 ; fd = stdin - lea rsi, [rbx + rcx] ; buf + offset + lea rsi, [rbx + r9] ; buf + offset mov rdx, r14 - sub rdx, rcx ; remaining = max_len - bytes_read + sub rdx, r9 ; remaining = max_len - bytes_read syscall cmp rax, 0 je .done_read js .read_error - add rcx, rax - cmp rcx, r14 + add r9, rax jl .read_loop .done_read: ; push len (rcx) then addr (rbx) + cmp r9, r14 + je .done_no_null + mov byte [rbx + r9], 0 +.done_no_null: sub r12, 16 - mov [r12], rcx + mov [r12], r9 mov [r12 + 8], rbx ret