From 543766bad1a0dbec4eaebe296629625ec340f43f Mon Sep 17 00:00:00 2001 From: german Date: Sun, 8 Mar 2026 18:38:59 +0400 Subject: [PATCH] Addres BAG --- EXAMPLES.md | 22 ++++++++++++++++++++++ asm-savers.h | 9 +++++++-- dump.bin | Bin 32 -> 32 bytes example.asm | 2 +- input.asm | 10 ++++++++++ input.exe | Bin 0 -> 28 bytes ntfiles.h | 10 ++++++++++ ntsys | Bin 39912 -> 39960 bytes 8 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 EXAMPLES.md create mode 100644 input.asm create mode 100644 input.exe diff --git a/EXAMPLES.md b/EXAMPLES.md new file mode 100644 index 0000000..74239ff --- /dev/null +++ b/EXAMPLES.md @@ -0,0 +1,22 @@ +# Примеры на ассемблере NTSYS +Это небольшой набор примеров для ассемблера NTSYS. +## Hello, world! +```asm +main: ; Метка main + push.string "Hello, world!\n" ; Записываем строку + push byte, 0x00 ; Запись номера SYSCALL + syscall ; Системный вызов +``` +## Читаем имя пользователя +```asm +main: + push.string "Введите ваше имя: " ; Строка + push byte, 0x00 + syscall +getch: + push db getch + push byte, 0x01 + syscall + push byte, 0x0A + neq byte +``` \ No newline at end of file diff --git a/asm-savers.h b/asm-savers.h index 3dce9ff..62e85ba 100644 --- a/asm-savers.h +++ b/asm-savers.h @@ -74,8 +74,9 @@ static void __str_slice(char* str) { char* ntsys_get_arg(ntsys_asm_cache_t save) { char* str = save->cache; + printf("Cache : %s\n", save->cache); while (1) { - if (!is_space(str[0]) || str[0] == '\0') { + if ((!is_space(str[0])) || str[0] == '\0') { break; } str ++; @@ -90,9 +91,12 @@ char* ntsys_get_arg(ntsys_asm_cache_t save) { } n_p ++; } - save->cache = &str[n_p + 1]; + byte_t t = 1; + if (n_p + t > strlen(str)) t = 0; + save->cache = &str[n_p + t]; str[n_p] = '\0'; } + printf("Switch : %s\n", save->cache); if (str[strlen(str) - 1] == '\n' || str[strlen(str) - 1] == '\r') str[strlen(str) - 1] = '\0'; if (strlen(str) == 0) { str = NULL; @@ -134,6 +138,7 @@ char* ntsys_get_arg(ntsys_asm_cache_t save) { } } save->string = str; + printf("Loading : %s\n", str); return str; } diff --git a/dump.bin b/dump.bin index 0d2b7c6fd767e5d3da7f111adaaa4ed76a31d6bc..cf6abf9dd3eb1197e7e33de59b54fef77997b5db 100644 GIT binary patch delta 7 OcmY#Tm>|c*zyJUQ^#Jhz delta 7 OcmY#Tm>|c*#Q*>W2>|;5 diff --git a/example.asm b/example.asm index b977192..72a4c97 100644 --- a/example.asm +++ b/example.asm @@ -1,4 +1,4 @@ main: ; Метка main push.string "Hello, world!\n" ; Записываем строку - push byte, 0x00 ; Запись номера SYSCALL + push byte 0x00 ; Запись номера SYSCALL syscall ; Системный вызов \ No newline at end of file diff --git a/input.asm b/input.asm new file mode 100644 index 0000000..74d2d3a --- /dev/null +++ b/input.asm @@ -0,0 +1,10 @@ +main: + push.string "Введите ваше имя: " ; Строка + push byte 0x00 + syscall +getch: + push db getch + push byte 0x01 + syscall + push byte 0x0A + neq byte diff --git a/input.exe b/input.exe new file mode 100644 index 0000000000000000000000000000000000000000..65b9e18bdb75bd843faead1e3c7aa455ffa93f6f GIT binary patch literal 28 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¥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 Vf_N^hmMkFB%LRM^+52+m{|DNIr``Yn delta 12022 zcmZu%3s_Xu+TMF$!ywE}7zd2xHVTLeqact_430XZLxJ}c6)&MBnHpqu)EOPn*^SeW zt@4sx^sn=G^K`rv+9`FsqWxX)QmJWS$7)YlYMP>%^S^6flrzu2pNI9X@BO~@t#4iT zn$23bQzh(BH76RHGZ^tHlYq%uo&8pf*C0vW)u(d19nF)3qj{t|JHWbFBZ&$!dP!yh zQTV&GSdzn0h?MwBvWzu#XO>9PT_o?aUl`1_5`6~=ubP$??n;sM5t6l@#6&!i5Pa|S z-Z$QvG|AOeJuWKn;MbSmF>NQSBC?WFV5LOIFq;@Rt7j;eMm~=iN=|Z#Br7tJ?MtkY zCXxtgeq0N%N`^aE|<8Y64?{P5NTrfi0N>#WPnR#*HW2WLfIPp zZA96kC_DST$hJpCl7z?vb{yFnmCG(C=b}v97DSOwwyNTZK6=IWSED0X^13>M98hPu zu0SRCEK{HKXbi(}%wIB>@aUr$gh(a^t)ey`tX_kjk6_|uxuGYuS24Y4tMMrPrItiy zzFEq2%0s2_c`~ndGh}W|Z*~P)9b-y*VY+0U=ax{h-az(3yIIzjg=s$|m!aJ)Yb(RF ztt73R$<-!nYr?drWPVN<|AWlW592#z{^>COip;yi_*)X+m+^)vxEYN2G>7qVdrM+sn0DiR5}z8zZ;|<|Fg_sjd0~8; z%om06TQWueq&3cvRFf;!We>BNPcGB=W$nZ;Z8J&Jn36Wi+Bsp`0IAZL9Qqu|^V4D4 zRGD{&@$P)d-W$d@ldY($M%Jzi)6OU7P}fFT`*xUii_C8c<14eIx^{-~dSca@lFIr> z+QVU5H(8)HsZz7abJ}vYJNX=@_ez#x+Ub%6y7i`#zqBR`-P)ArlI)BFk*1J9wOlG1 zd6rDknMk!RPLtS$<%l2bDzI5y*l4l~>?dH0y09_iSFjhr+Pko^|I?(D+$B#(ow1ADj&n@nCcnAl$1w?6LCzL1(8eQYYjgnFOYo}Kz0n;+`k3u3J< z#l|pKbiHmup7Nh^k1$y~WxJ5Jn2iX|&LMAQ^c|T|%`jJM2k257#dg{Kr3QGk`?+ou ziaYC#b{`i7BYRVzJ|@(zOL0@f{W8M-9BQ!p3r>@J%*pImq{!SWdlx9CA!nT3Q@U+3 zvUdK*`Z&9kh3acP0hZ@xiDq$82&;j#n|sc_pQ?SDp#afffM}4`}XCA6w=H zU;ItO5g!+=*xyFu_BYes^Kri;@2_NeW01DkXZ#JIYl&2`+yyedw^6rGq)S@?HlOA& zY3iND`pEmelX^B$P1BM3N5mLriska75oA3%*E`8|zgVzfC_oBQG$=tU3LZcfK~e+u zYbi+Z#Ye>;75m%hx&6&ne^rP#($Ubh#8KxF$a>@S9bes@0zU31*rM@21N@b@dE?iU z86)FOF!;F7LFrmFt)hXkl|0`kvG4y#!ds#$PUY1!h&h{z^>TA*b_X{Tz;jDTTb~|9 zwaCNyY|$v+fWh(vRAt_R0U|NhfDsystk>9!5<9pa0G>;pOnPM|KBR)+)98_+-3EZz z*B2&H*?1X%@z>gDhuitXW!}<5px|ED;?%OX?0{F(LTz?v-Usj;x<9i|^gGD=3O0~! znP$rjg4TPQjGPu4o6vCvGb`>8t9JJGS?_|IjD}Ph$)PdC0XDkF@km6K6V?MRwzqIlH z>+t83hHQiC+63awPE%c(K;FyluX9GmeQ*6@YcD zmH%@b;vK^qzl4l{PmrxS@%lDu!ymKre_%%WHS5WVoIcveKo0YpRhEE_@7+Yy{pP!_ zj>Co=%l$}!=Y9hCxOSwm+%cp)cLFI^^5+y{x!n|aZV$l58&8V5drtv|@h9v}*L00K z6&*V6HLCGz)&k1Ckr{T+ZC2NKg=LtX_`_T)qf=uOv}!v4S)cKF66$9w%?49Di0es# z=k5XcI3vZh~a+G?jR+3J`n?@2xWTUus?BtG7d;j*l=3 z#o)VfIY_-+e`?boHsI5cAIQavym1V9IJa;A;Ak<_(}3fhUXEf=13!|-eNwptU=h|? zvL$y$RxJc9nZE(BWNwH{W;6uMzzNij?mj-_*wN&^yfl?zG?|i@q7kZ~VE6Jzcnvq2 z@OcC9Lf)A-GI|F1B5oFmv5Zt3#C&`enQXDdpRAM?O+3qMt|IT{TFL8{{Pgw67jZtM z{HMAX0v*X#_f2(!7vtdqXD{aFlRqr!(<&ff&5fnSA4T44EJ4~B&^11e7d*zIAH>N# zR}9!sUFe$3P{2(*7`RCQ=w1wTye=uDCFQk;MCEnz)W9nBs}O37x!1^-0|%;SN&;Fk zC_g4s60#m5!w2QME>EHR|3JO(7mYX8xW}Jq{P1%2u_vwJrW8 zpgqN10hD_a^udLoA#bNN%Y6U{ju0)mjg&%TMdZ2lRMk(i_ES|3x0C|Uxg0pT2fItE zCn>kye*FO`X44`!F}jEgi=Z9-jj9}AvBVbw=>E=fWz_6A%)nO5tiLoJIjKD!+MX2_ ztP;u3I>}EA3@pb`Cd+ZJ<=;ba0 zgN>rmPspyn{s7ONrQCeU?g+K({l7@Pobw<6L4OCJQ!}_$vUy*$*(lolH_~8%=x;5u zmSfiodCpJCRBF7NTZX)Dw`L)^a^D1P4}8PegZDDdmchXSnK&e6!oi;~m-z23zdBkE z+}?p7JTLwn3OV?L9kI#}C(l6^20}jp$EX17>C`T|;LyEsVBt>~Nd7mf+JqwZCd}85 z=qUS_u)-7Miy{5lqvY0*VX9F-k)b7-My;9Z3NGTisT_i!`dg?9sI3v zW2AH2G_|fJ-d`RnNm-PD;~e>|B+>OgT$iLS8ckz8V)xr(SqE=3s}DtEHh(X;e?$cS zu@M+7RY|w{`Vvk3d|gWf4wO%pr0W`&p|FEbHq-N;oj*BwinZE0#X8kG4TnLLKWRB) zxz?;}sl)*hhh5KJG`Q7$Grc~+eKU2@&t;9*>RtZEV-4SRtdvftl_CDR=Q``YS*;s( zy`xp`sY5DkCaAN)Z~3-kb!{_se9dyC&o|9-HW4cSL+%J!NVc!o%|n8zpFHa{u5qC(T+Ifv}zZJ<`;YRX}jka9Mbpc zJU8IUy@aW5__uWzJTM*I(ZX^ZHv41iu=Ni)#3C1kDmZc!A6$6;kc|r=>|snvp04pc zN_d3nB}VjnOTaNRa;1~)yr2G-cDbR#_!+a(?~I@2Ta4$~G=vq2?hn3(&E(K9CYCnw z%D+KO#p(wULx~?KQ6Ui;N*tv`i9~dxM1T@G5)nshZ;x~ch%bqGwJXkwrRG|*}^J9rIiA92yX6-H4HEhr(Lw8@?adXCHhW#=!7 z9V7IB;PltvH~P>bC;zkEr$;W!>F?Jjya$zoA0~cpD0T8b*y&%=9^79xW z4g`J^I_;kQ7~yKOzTs6`m%rc*%m>Bcq94dg>(rj6b13ZTWS@H2?pth5{FgYb`0s>0 z?IdKqN4p$qhp$1c+ubSjI7hO|v)Io_Re7@EAt?$%$v6>EFEuisg1(0HEZN*4)15HKa-5}WY!wR{wba00;J@c?aR2y@R1GV2 z(Tan^v1y|T2cU*kZWpVEs5%pB^p{#VdX{F!*{Ogni&qI3!C(wq{tSiOrI$3yhDb6ZUBb*`D;REk^2g=}d)NA)IHmBY#C^VlX&ks*iJ${yK9iGl(#?AQW7e)?6 zDp17E?-zDc6<#K(4lG|*6b@E2g>;RRs3|Q&=G#rGVOI!mPu48DO08S*iWHou$u@hR z!3jmwPb+niCCok@3XSrYJmBCD2p=O~>(I?RfmamOChB^OMUtIh7WAiy*6~80erR{C zT{jP(W)9Wr>H@U3rYF!BDB<+??_Y?nns|yFa{L#&h-`8sWX=$E7lmg}(xX?sIhAf= zrKiLK!XuP~Jmn-=Ju)@<&u>6`_G1-wH2gxB)i0EwJA=?pJ|9_l&)ZbS+p}H7i^54+ zpDKJoQbwiUJD18`9ZZr95{1fd$kb6il8eNW-wX3ayeQ0(4N`@v-;m}}X|6xN?&6~3 zd0`Ya@EaR@qRadRtnuzLNJH>6m>5_D>uEFnMlbX*JDqUX>?T!@gZj>=CW-&A7rPqkE_>UI&@qLK-h;+o%}E2)OPac z#1ZBGD4+)WF&6vtVe`dTSY^j7*IK#Hpr8**AE7qbqqC&LLF6EOzvYep1ZxeAJ&139 zZ&HIH1)C`Fzb`yPn>iMqd>n})%zuWSB#P>0F z5vF6K*mfs>!^z)-(Wfx71jLQi=`Y=dl7bqxHvY1W|6QbEv|BV1E{gR;nw|Vb8((k^ zZF2ex7C?t~d`nxn6b4S-h52$$>i0hi+5nv&?F-0Y2jls>i1~{I)Vj;HRIjlmW9_g`+n!+Qy$7 z#*& zQEb=GLi=$#vq}Y8}?W@vk%CWnlu$=LpMO_^#U z!$f26zJ_hm-R1AcF8Qv!l0Olq-!IGCWZd-acJ0hV?Dzv6Xr=sjqD!7~Z-&W~TP1TJ z{69LyPhH3MzK;xGUAI1h4=kX~ABRGp0Y3qr2UhRG*R5!VsROQ}^6pUR7Vs8OkN0}N zJ)w{pm>dX&ih$KXC-40^Gbm6go`j^o0W$U8(@y z0>&Lg1$f7l9Dzfi6IcVR2G#@XfL`EY;48pYz%9U%FG8V{Kqv45uo{SK4NM&{0k{~L z1zZIz0losPjGPSx=9rr*fG<)7@NM8`;3vROfNj7t!1KU<*hW(EKhV#xH`f6d<3;l} zu(~}I>IBB&;Fy5_peEz|KMVL7ej^?ryJlywC&{_lCa!WP0w#Zna@rhIQX58KBYIYO zFzc9A_?t+o=ERqt|0ERZEvu;J1DeN}{L+OxjQkmJ*s#Ti+MU6lnrxaA@5;xBStW&d z!6OoN%?I~d7cNmA*|lA`e&D<*aSKyHOAF!=8wsuxT&zSfI59A^Bd+cxPdz%=bp}}hlc8&o zOW@9jagmrb?O|LZxHDl~KX50zaAs6j2JQs7_b{$<+)Xs@VX-Qb^O(jp2m0zy?}kXj zUJPy`xUO+EgBu&hy$P-|jN1v$8OD7E&fbOVhdSE9***=C9gk(Z=wi6~<$u;^26rip zD*|^RjH3%k2;=BtIu8z~4e_DfP8SySXGi}s!?k+9s$846D#EHwT|uVJP3uM%Sme=A z=w%gIT4&PPw0SF{tlA<^v`t&4T1d9eHOARu#R0qp%ZcRZ+`_0L^yz2EiMDPe=S8-f zOsO+Py@}kV)8yH@kx^HX-SQpzv~ChN7R!bq*^e)ZX+tidB@~Lmf6NPY*k|oY$^|3k zLJUD?Ye&fzpZC z+v$UiPJ9xHVd+EcVKRMb3hO4zmd;i&OK_#C#|y4Da?)jYt(Y#^Dc6`b$g*;A=|fpo zt}3<4vT`{|xs0S-K2k0lDVK}n%S8B^E7cPxqkLP)#iYnYri>ODl`BEzvaDPJnjp){ zwVyg!RxbT4m1U_q{4O&~xm0=2Q7-sM7kY34QEu=kH+Ga8I`WMirY2W%FkeQujLkA` zlrhjpvQzHZ+__VOBMN<*Wvr2LK1G}hnT;~BMMmW!j6RbV!;+RAyJf^>mt)Ib!)Pv8 zZc0*`rR=D*wJK~zm1GmNN>ODWr8Q8kn;eB!iP%bO!7~(pRI4Yf$CRYBU)ez)l(m(_ z;xV~WvuO#25%*0Xoffogo6L**Cb&mrUg;HOk9kbym0nV|%y}}OmxBzRepplVp_85Z zmq&xNdJIX*h$uekJ4R~VWsk|BjE|ySFKdNa(rHrkj{Ycg-L#yz+WnLL-g|CL5BFe5_@jAPSSXQPO)O3R2QA@z| zB-2->sLDo>jd1igg6)s^LM!)lpD?R zX2Kj3%bpk0+hS@W%Y3G!&t*UE49QQ71WX3m3T+7{C~eoJ`z3m_taXUm$+ET`pPA^R zyqIT;+Gn9PsFIkI%OtImuAo|OBebdX(l7fjvS5{oI|^C61k7F_n^u|F->DTFL5?DC zAi-6S^_*8ft@g=jPd@YH%;|M?%#25#oi=0MBhS*z_Q(Am)%J+y=E&{qUaVo+JaXfu zT!UVIH!Ao9DPEInaLa?Ppp87UCO77=%pN9N*A&Ji%AJr%F0U!P^Qu)|x${Z!S{J*8 ze6%(hmK-X0o;6?eCLRu92NBBnU_OsJ9%b9 VVT?d`OFU-s(S|}cj$Gc5`F|MC7-0Ya