From 980b66cae97fb183785d7291947f7881fbceb715 Mon Sep 17 00:00:00 2001 From: victor Date: Mon, 14 Apr 2025 23:42:00 +0200 Subject: [PATCH] count words --- lang/Makefile | 17 +++++--- lang/asem.s | 49 ----------------------- lang/debug | Bin 9712 -> 0 bytes lang/obj/asem.o | Bin 2528 -> 3088 bytes lang/obj/balloc.o | Bin 0 -> 2032 bytes lang/obj/split.o | Bin 0 -> 2144 bytes lang/out | Bin 16208 -> 0 bytes lang/src/asem.s | 100 ++++++++++++++++++++++++++++++++++++++++++++++ lang/src/balloc.s | 26 ++++++++++++ lang/src/split.s | 43 ++++++++++++++++++++ 10 files changed, 181 insertions(+), 54 deletions(-) delete mode 100644 lang/asem.s delete mode 100755 lang/debug create mode 100644 lang/obj/balloc.o create mode 100644 lang/obj/split.o delete mode 100755 lang/out create mode 100644 lang/src/asem.s create mode 100644 lang/src/balloc.s create mode 100644 lang/src/split.s diff --git a/lang/Makefile b/lang/Makefile index 8b4ffd8..3f76ebb 100644 --- a/lang/Makefile +++ b/lang/Makefile @@ -1,9 +1,16 @@ -SRC := asem.s - +SRCDIR := src +SRC := $(addprefix $(SRCDIR)/, $(addsuffix .s, asem balloc split)) OBJDIR := obj -OBJ := $(OBJDIR)/$(SRC:.s=.o) +OBJ := $(addprefix $(OBJDIR)/, $(notdir $(SRC:.s=.o))) -all: - nasm -felf64 -g $(SRC) -o $(OBJ) +$(shell mkdir -p $(OBJDIR)) + +all: $(OBJ) ld -o debug $(OBJ) -nostdlib -static + +$(OBJDIR)/%.o: $(SRCDIR)/%.s + nasm -felf64 -g $< -o $@ + +clean: + rm -rf $(OBJDIR) debug diff --git a/lang/asem.s b/lang/asem.s deleted file mode 100644 index 3834db9..0000000 --- a/lang/asem.s +++ /dev/null @@ -1,49 +0,0 @@ -%define DEF_BUFFER_LEN 4096 -%define INPUT_LENGTH 64 - -; rax -- syscall - -; type widths - -section .data - message: db "Hello World!", 0xA, 0 ; hello - message_length: equ $-message - -section .bss - arr: resb DEF_BUFFER_LEN - -section .text - global _start - -print_string: - push rbp - push rdx - mov rbp, rsp ; set up stack frame - - mov rax, 1 ; sys_write - - pop rdx - pop rbp - -exit: - mov rax, 60 - syscall - -strlen: - push rcx - xor rcx, rcx -.loop: - cmp byte [rdi + rcx], 0 - jz .done - inc rcx - jmp .loop -.done: - mov rax, rcx - pop rcx - ret - -_start: - mov rdi, message ; prepare first arg -> string addr to rdi - call strlen - mov rdi, rax - call exit diff --git a/lang/debug b/lang/debug deleted file mode 100755 index 583635e26b5f4ca7c6b83f5b5d14dc47506bc941..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9712 zcmeHNOKa3n6h6sx%CzbwznB=^^{osyi7$BPo zbs+DO)nE{p0JS;h3hV}ypaG{~oW+g|yU=O~kLv^BNevbUXpS{v!tbFpd-Zd6LE*XB;l$%1yTV3O@(&RlfKNubf#M z{SuEiiZA!_OFrU37WUi>yp5z6dRyHWd6IfjH}}v;;>?SKe&oT@t)~y|EAIStw{{hb z9a9ce%w7;ZvUtY6|0!!f?rkPz2m3-rP)3!)H&ZpC3g$~PcLQ`k(q{k)ass3HiryE&kZ z{X)5Ml59%5lk`Jqwc1&R2|=1eE9?Y$fU4gCaI;svJZPiNQ?56pm519oxGdJiY&666 z%cvEkxCO()?e^D`qO09b!!7B>U7YwIv>68QjNWfJt{`QZ*7vm9t7OtQjJ|kSj8xE-zEvL#8n~HSn|!HcW77+w;zdwF?7fA k5YJIKCqfCA+zW`QwOQ`PM?tjJ`6m%OF8{O05B`$>3!}!N$^ZZW diff --git a/lang/obj/asem.o b/lang/obj/asem.o index a4b0676797683a4c368d92b995b7aba5bbf410d7..9af0979d4701be824d8b3445951505c8ba81c376 100644 GIT binary patch literal 3088 zcmbVO-D@0G6hD(`>NaYV)DOfD$Tk!z$jqiieXzU4hn9g_Y4IUUsw}g+cQ@P4&TMBU zB|*hN`?3#(JcVi3JTPY6=BdE=*}J!wER9q5sdMzUZ@!@OwuD@VtRbI7gpAtAd{ye_s*j zaw<0ztk9>>p#G04Kx!4gZ{S9AI0qu$pusoO0;w4e>Pwd@R?M8pf8U6ol{^|N$qPck z>!{5($u(yVNb*hY`G1LzWSmlF{1tSR<-aBS-;jZnzgjDTRQ@fr%{Ix;$*5l8m7*}Y zLv)!Ku@|T_lp8|jrOEvWJ!ScSA>&n^l>ZEV=KSA5%xn`OxF_Su)@zg}OT5Yb z3ggYaPi?FIf1`>fX8hOao6`Ks+?I)+mQLFD&*7)?SM%~6Vx|4lWTAX3R9>3>-$hT^ z{BJ!eLbhcj%|G>H_V2MUj2BkoBlMq1vVVXQvN#DVQ|5P>)|k?Tvo) zM*rNUoOY=o|2eL&cuT)-otuSh+MDeE@uxTX#Xs;US1#kd$zt`++ zahSSc5cOQ*!Mkt2cWL2_v-E~jI}6rU**??rQ#N%<_cDo@-?IYFaW(FjB~IhikKP9c zUsiKv&Eww*YwoCBd8u-$@(j+=lmqkDvP@=xOdG0LTGn63pT?3umY9|W+FbDVj^zWi z=dD$D5&wNG8+G5WE&5B<#znVYt5+9yR_oQ1J3cygR{dMIs}29;YTduun3~4s^UQ?d z$U5QrI^{H{6J!B6tuzHEV;dPb9oAa!HG>3~fgzZ%FfcJe8LqdYU_cyE??>JE5MKbY zy;dt>Hx)JPN9+()0D{_0u+^Lyx4}u*(k#h>7FwGFp=F(C$MeodRBDLvKQNC2=h}QX zJRWA3-fXmi66cd0Io`0op)Zv;=07uJ+AN#iPsb$^~Vx_)4*>_{4E3Dmbl2b zaDFNA?+b`qbl%Mz$?-YIZMaC4GSLoUIt=?6;D%0v9#gs*vZ$A>LAM{WVIYlWJB~6I zWzE)lx62ZUhb(Fm1KMGnGGQhx=y0pq+QerChDjeIa3lAl9(NhXy;5lt2(;if)}OR_@iUaU4iVBl(he5m32E*A3*K+h)O^yZL!DpZcEIacp7 N^-1sg-}uy!JOa2xF-ZUb delta 534 zcmZ8eJ4*vW5Z>9l+ju61^LdA;;Y{#JGyx?DW|MS5K}3=wQNaib7DCWJprxJ1G-{*y z13s{^)XGj`sUReUU>R$Rxc9(d26n!0zIp5pdur5rPp=?oRT5CO-co8+CXR75Apsf| zAO&eWhZHR^0d08y2?715NMIc@)gTSqfjx{9)+t|%QIL9Km!6Mdb2OhCBaC~AR$YY(QhL*$>i3|%5@DuD3 z9_+#50Kv3RAL#+p;}U)ulx diff --git a/lang/obj/balloc.o b/lang/obj/balloc.o new file mode 100644 index 0000000000000000000000000000000000000000..38ad05f3f9c26f889c40a99319ea09be9aac6ff8 GIT binary patch literal 2032 zcmbVMJ#Q015S{fU#zZ7>!iSIm31Mg=bY}vhKyqXXA{T*%B1#%_=bRlYXJ5EGN1-Bu z3Q<5!ML|hHK|x1BK}*R`NC`ECnYrD)k71!;E${BUd2e=hZ)cz0+gPs%0lEoTgWS?6 zKs%qRc^ektQ~~|JDXm5SDwoelV1?mzW}iUYly6h%n~cx7=g_aHCFUchpGR*6|24%r zuSUv`$0XNlQ&0osSB8_-5+u+%)EvM0HUfFInTCHuTB2Y;b{T}jtrE==*#6L{H z-toQ3pzB6>l70+!!xCQtDxT*>{(+_j!?9nYNFrNBu8myx&LEA`<;QGQxnB9z5sOY#V?sFEl|akL+Q-QUZ>nab!&QI ut}0yLo7BXP-rG9nL+_ojl|H%`?RERZ@lF?y)!hSG7;3Q7DsdCP6y`TgmX#d< literal 0 HcmV?d00001 diff --git a/lang/obj/split.o b/lang/obj/split.o new file mode 100644 index 0000000000000000000000000000000000000000..3abbb491c02dfd36e18208dadb8aebf45a485232 GIT binary patch literal 2144 zcmbVN&ubG=5S~qHjbf8jMa3$#DPBZ&Qxz#KM8ZrjjpHtudpJz4aW zlb$_!@aVyV|A6G=*^A&=5bQzE3UOxNdz-h@_2LV=Z|0ltn>X**=GnsXV#Y8)H3O?0w=>M5C7Cqx!J|=*9h8LNC82!|GrM}GgoO=r6lA2(4nSKJJ8GLe* zbw>6VvFAA{^d>E73io;nrt3X&w8qC;#8}!;#X~~0E45TVLA?G4i1C~xc_sDd$^(cepbUDJ}uxla&FtzRApwa!#O)z0gGo{|$GC?7abgpTyW19*uBuZd#+(sS-> zZS-T(4vaL?|4vtR6weg8Zh4(PANVaR=(_FD48Yp-wjFDy-3mS5+GvLs8lD?iZlkkd z5fN_RtlyfxY|dRX%U8hI(+84i_4@R4slIf)zLQd?a5e995~q2}s}LcN8DF|_XH4Sn zxKSL>=B9ENawkxmF=5iE$-?d+GYchr8^-Va1iqt>Hx6%rz7|o!Bk=@J&s3^Q){<4N zlq)l{GqvT1mD22TDPv%Qcx*B(>8bf7g5;Q?vm1iB<}`a7s|_EQ)(OD$9k;9xQNHiOU)8%?yHZi`;{2j-9h z(0s?>*Dxi7>z!O9#mOdiR-v>%^sjWVW!0tBLiAlr`vRSnIL}1)jrjDxrMGJ27%-)S tXy3)Bi2P}W$F6>8T3)Xcu141>0NpWN&+8_UV5`lLH4nEd6358_{sN_2vl9RS literal 0 HcmV?d00001 diff --git a/lang/out b/lang/out deleted file mode 100755 index 75736712384abb133cb529002ba2b40b1b2fe2cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16208 zcmeHOZ)_Y#6`wuF$)&CT#7&Bugk%#OFVrTpHH0c zth;sUM3w3)1u3dpwE`jWg??!zgg{CqBqESnM-CBGd`N^;BEDb{krJSgs0F1IWqEJs z{m$!&-6DjLKs(XRZ{C~tdo%lHc0HS&d2aCF{+MMcq#E_OVkyD$#pQVmMcUy z@l|O6i27=KHj^pYL0-iRA_Bua?#kIVZE&_{InKniJlCWVJXSMrUU>7u11jMG5l@Z@ z|Ar-=CfZcT$qsU*Oy0EcOl%Q*Ah*GZk$PBj#&!O3S$Kp>G$vb8=rpzbFkg3J-e7^S#<1&*kvg|16}(qk%0ih4i== zSbrs?=Q)bB7}77hUsBp)9f3R|K#4GlKoo%}0#O8_2t*NxA`nI3e=q{?H*EWR`t+aT z=@)CyCzVQnZQhIdm(r&%#213A@w?t3wZH2Zls9ZoQHkYAuDibI`#$qK-Wxh|`RVkT z-=$Cg{>JdgV8?vN&(kmU{F-e1O;3{f2NQ{g?JorWNdG2j(l6D1kKy54-X?1LaV}HS z>;1)s?Q?9nAV~Jl2lid37#_HtK64{|{?EPX^S5f!*2VPY+ulZUP$v%J{^CT#_JJin z_iwJJhpN@g?&ImxJ%310F@5H$SC@XVr=IlwrYoenHcl6Fv34UVtgkFA^><-nsm#~U z{;uc9_Bi=C$34Av{kHE1CE~quju+=|bC!M!?*KopBe9`&;oM_{Pc+m9#&1(uJx$U= z;4>J5YSg(dN>K!&2t*NxA`nF&ia->BC<0Lgq6kD0h$0Y0;6E1u{?27>sd>~Um;8Na z>kZ!@A$*LGUst0iJ=R~hc9eHDGkb&hM`YO$I$O9Vn>@e zg9Lx~i452#1-x5+Atb>ND=^#<49EdJ?Ba3EtG=ruNw*Gm0|BEuir`EO%&|G3d` zH#WG69{WwxZlO@Jzg#L8vODfN(BJ=v-Ab?C57-@hXajDC-PzvR)!y0uIrR|n^cd+# z56e8;ZL|Y%j0$>;;}&dB3x{no6?ZC8QOU{Dl$$(}ANNY-WG?R|sZc6Zl7&n$msE%Q zjvcb88{LWa-O8Ga!4Vo!)&~05WHqj>iEoMTir-6v5lg5IR*GlI0R3vzrzy9rkLv3v z56(Z(2wG@9aJ0Vaw`PMiI{MlZ$=}S}J-=`IxR2qF|F6YT_p66eS_AtB1F=q-A!!$VArxy?b&1|H^sHW~pO28< zQk#@HpZWtojcSb@6sp;msASPyiu)NA1u8T_2;mtj+aVdni-Epb#Z%B|e1l*mKR+UU zBgJ!9O4}iSiwaG#`s(u#`U_NGd(;1A(%Uc!;Ubkc#F`cE7gW8+dPSpYYYp!Ee~{Qn z2hh>EqfXd*dui;;kmPv2a!vZOFO+YS$Oy-Rv6=8F?0lrv*vW%mRm zIw<2BGx^^Wc|F8y2&_ABE(vHGZn3_Ans=9l`O~tX0k*(U5YGpw`=~&-V72|#&c(r= zZNrJr^Zbq09O(a9X&;F79Q{QMlG*=bq~$dl_?Lta{H~@c{zJ-bgOByplcZw`_*fSL zu?{4YAesFiCoQk3z{ffYST8*EA9lcLs^>KtWUSMG`tP7VV;AnfxK+f%u`9%+lH0>b+e;|B}-x}})Tc|#qz=Q55 zRNzYlztz??z-P5s%`tvZ{FDme`~P)Y*8oM-O3Kale@Qx?<8s?o-_vjo(QFSg@HfQe zwIuj>k2}{!N=mTP(vl4QAE|=p9{5=2;XEn=gZT*_=D`QV<@iT8KGu!bgl|`wx&R)KR_4q2SkJ}VwLLHU!wEd-;>2ei`j7S0F5$; string addr to rdi + call print_string + + mov rdi, rax + push rax ; save rax + push rdi ; save rdi since arg comes into it + + mov rdi, filepath ; filepath for open call + mov rsi, 0 ; O_RDONLY flag + call open_file + + mov rbx, rax ; mov new fd to rbx + + mov rdi, rbx ; first arg: mov fd to rdi for read call + mov rsi, file_content_buffer ; 2nd arg: buffer + mov rdx, 15 ; 3rd arg: read len + + call read_file_bytes + mov byte [file_content_buffer + 15], 0xA ; newline + mov byte [file_content_buffer + 16], 0x0 ; 0 terminate string + + push rdi ; save fd + mov rdi, rsi ; stdout fd + + call print_string + pop rdi ; restore fd + + call close_file + + mov rdi, rsi + mov rsi, 0x20 ; ' ' space character + call split + +.exit_early: + mov rdi, rax + + call exit diff --git a/lang/src/balloc.s b/lang/src/balloc.s new file mode 100644 index 0000000..f8a0663 --- /dev/null +++ b/lang/src/balloc.s @@ -0,0 +1,26 @@ +global balloc + +brk_find_break: ; RAX: long brk(0) + mov rdi, 0x0 + mov rax, 0xC ; sys_brk + syscall + ret + +balloc: ; RAX: long basic_malloc(RDI: size_t n, RSI void **heap_begin_ptr) + cmp dword [rsi], 0 ; check if heap_begin_ptr exist + jne .allocate ; allocate normally if exists + + push rdi + + call brk_find_break + + mov qword [rsi], rax ; get heap beginning + pop rdi + +.allocate: + mov rax, qword [rsi] + add rdi, rax + mov rax, 0xC ; sys_brk + + syscall + ret diff --git a/lang/src/split.s b/lang/src/split.s new file mode 100644 index 0000000..7105820 --- /dev/null +++ b/lang/src/split.s @@ -0,0 +1,43 @@ +global split ; export split + +section .text + +count_splits: ; RAX: int count_splits(RDI: char *, RSI: int c) + push rbx + xor rcx, rcx + xor rbx, rbx +.loop: + cmp byte [rdi + rcx], 0 + jz .done + cmp byte [rdi + rcx], sil + jne .skip + inc rbx +.skip: + inc rcx + jmp .loop +.done: + mov rax, rbx + pop rbx + ret + +split: ; RAX: char ** split(RDI: char *str, RSI: int c) + push rbp + mov rbp, rsp ; save base pointer + + ; int count = [ rbp - 4 ] + + sub rsp, 4 ; allocate local vars + + call count_splits + + mov rsp, rbp + pop rbp + + ret + + ; count = count_splits() + mov [rbp - 4], rax + + pop rbp + + ret