From b37704eac5ea3da2ea912fc4b354c2e30da49724 Mon Sep 17 00:00:00 2001 From: Joe Tretter Date: Mon, 17 Aug 2026 14:17:35 -0500 Subject: [PATCH] add factorial assembler program --- gnu-asm/factorial1/factorial1 | Bin 0 -> 9448 bytes gnu-asm/factorial1/factorial1.o | Bin 0 -> 1808 bytes gnu-asm/factorial1/factorial1.s | 85 +++++++++++++++++++++++++ gnu-asm/factorial1/factorial1.stripped | Bin 0 -> 8720 bytes gnu-asm/factorial1/run.sh | 7 ++ 5 files changed, 92 insertions(+) create mode 100755 gnu-asm/factorial1/factorial1 create mode 100644 gnu-asm/factorial1/factorial1.o create mode 100644 gnu-asm/factorial1/factorial1.s create mode 100755 gnu-asm/factorial1/factorial1.stripped create mode 100755 gnu-asm/factorial1/run.sh diff --git a/gnu-asm/factorial1/factorial1 b/gnu-asm/factorial1/factorial1 new file mode 100755 index 0000000000000000000000000000000000000000..5d1bdfab95d30cc93d779c9c5fe573a60f573821 GIT binary patch literal 9448 zcmeI2OKTHR6vs~<)7DaKiXeiI#^Rzy7*bFyB05T|Q;=Gplp>@_Gkwuy!sMnHT-c3Z zDT<##zko}Ztpy`4T)1~5h{bL!E(AC6+{c;5iwhN(XCU`~?(d#+@8sXiVtVg`v8$Jp zi3HGJHQUG1MC1hzz(nj>;OB!4*X9C{B>tMi?8=fI4Q7=mNNbU?_+E-0>rK~w0QAE1&dFKTVeZbE4egN2c<~KLaVc-w9dL94q=_J;_ z?&$WLoAQ<3Z*Fy~!T0|6Z>z6ze(T+%gMMq%f4EWqf|WX_sbuYKud{{8e6a)U06V}A zumkJ>JHQUG1MC1hzz(nj?7$y7Aor-V_>p_@S0--betu#@GWn)0ucX!Q(Kv1?kAU4L zZmY~o!*0vw@_z*YDWH9M8b4t8h}pL%e#mgo;ztbkEuJ-e(&8r!pR)K6@&w-LjN!T- z;Ec*oz)Hqb5jCTR_gLIF{G!FL8@^=mJBHu2__X0qEWUs|BmZg^pH+PC{#7|Pq2j6d zdl6qzJPoTkkC4{6!mJ3R#lrHi8^ZWRy$qwOxzvEMXdbRr0+5W>2s)-3JZm00h2dwfjb*kR)R=CK3}ZW@- z;MN*tQ7EE{Nb3ScBDg2Ot%M?Q=PPx$8iiGyssXMlcX7gBzr{cI4r8VK&B`+*>LQ;r zx*MNUF~jzAa2$Cjev)P!;&Uq+#OGDaIGrP*^ivqfIa3DE^AVqCp+uwh`e%{LIjNq0 z&ofzFU_^JYwbz&P#rGa(0Z{!Lv!L{+x2;}3p8)%i(b{e0FgT!l_uC=HX1bX6Vf4HD N=cfKboT&r5{wFSBp=baA literal 0 HcmV?d00001 diff --git a/gnu-asm/factorial1/factorial1.o b/gnu-asm/factorial1/factorial1.o new file mode 100644 index 0000000000000000000000000000000000000000..1114fe560fe3537a9e91a6a5b0290133df1ee774 GIT binary patch literal 1808 zcmbW1&1(};5Wr`XrnOZ}MW})bIfzs%OIr{XMWQsiMUADXl%j-<-L^`y8#Zr?Iq5}c z5j}hMFYxFwwP3)5i2sCQE`kR=2yy1^On39zUL45I%Y_t?L=f0uc+YK;j7n z_%e{#MQs*g81{klGDqI`C-`C8+0aP5Z0z;J2@PAB?r8~&3FoST*0=6EseKS@ci%dl z_GM}^)ywCcSLe`#kAovlXOpJubhbwH;8*AOujd~oo!;m5F{iibyl6*1Ff)$nXtnVv zpW8Y>`6)5iZ2GkP0{&>;H_G=Q16G@u#94-qLwiaVvb&CDA+^aI5!c@tKd8sEcmn;h zpZRD%hCK7520zTaVDKZ%#|?fQeJeH30*{~3+JZIqMV)7E?)N3;S0#}340F0qX_?iI z1rO2??c2;>8~i@{quZyG8k{Xhb(qngYb_{+D{#m6V9^T$2qM*pRHYg%FMA<0!pFX< z_))!zPPw!I^disG!nRE-Dl`sSMh5cC=q4@%{teo0$LY z#WJQx6D~L4gu!M1P8wY5PZ(U{rwuNBFB)9p2cx#WD85 zZno;mt)f<8tXIVfy_#z)@2LWN$yF}c)n*fHKTw{%;zxEP3>tU{QdtWApDth;om>3A zk{U%e-zP|0@%v05t%vrYm>_M<@x{2n2~?j0!jn7LGEf&0H!^q6JBZ8k?^dUJZ V;d0yL5L&zCuk*!}`z;A({y*7ziSz&f literal 0 HcmV?d00001 diff --git a/gnu-asm/factorial1/factorial1.s b/gnu-asm/factorial1/factorial1.s new file mode 100644 index 0000000..9d6be99 --- /dev/null +++ b/gnu-asm/factorial1/factorial1.s @@ -0,0 +1,85 @@ +.intel_syntax noprefix + +.section .data +INum: .quad 12 +DNum: .quad 0 +DBy: .quad 1 +Erg: .quad 0 +One: .quad 1 +Zero: .quad 0 + +.section .bss +.lcomm output_buffer, 32 + +.section .text +.global _start + +_start: + mov rax, [rip + One] # LDA One + call print_number # OUT + +NEX: + mov rax, [rip + INum] # LDA INum + mov [rip + DNum], rax # STA DNum + + mov rax, [rip + DBy] # LDA DBy + add rax, [rip + One] # ADD One + mov [rip + DBy], rax # STA DBy + + mov rax, [rip + INum] # LDA INum + sub rax, [rip + DBy] # SUB DBy + + jns mod_loop # BRP mod_loop + jmp halt # HLT + +mod_loop: + mov rax, [rip + DNum] # LDA DNum + sub rax, [rip + DBy] # SUB DBy + mov [rip + DNum], rax # STA DNum + + jz PRT # BRZ PRT + jns mod_loop # BRP mod_loop + jmp NEX # BRA NEX + +PRT: + mov rax, [rip + DBy] # LDA DBy + call print_number # OUT + jmp NEX # BRA NEX + +halt: + mov rax, 60 # Linux exit syscall + xor rdi, rdi # Exit status 0 + syscall + + +# ------------------------------------------------------------ +# print_number +# +# Input: +# RAX = unsigned integer to print +# +# Output: +# Number followed by a newline +# ------------------------------------------------------------ +print_number: + lea rsi, [rip + output_buffer + 31] + mov byte ptr [rsi], 10 # Newline + mov rcx, 1 # Output length + mov rbx, 10 + +.convert: + xor rdx, rdx + div rbx # RAX / 10; remainder in RDX + add dl, '0' + dec rsi + mov [rsi], dl + inc rcx + + test rax, rax + jne .convert + + mov rax, 1 # Linux write syscall + mov rdi, 1 # stdout + mov rdx, rcx # Number of bytes + syscall + ret diff --git a/gnu-asm/factorial1/factorial1.stripped b/gnu-asm/factorial1/factorial1.stripped new file mode 100755 index 0000000000000000000000000000000000000000..66db5a5fdc2722e722a7bf5c6225f7fe9d1e4322 GIT binary patch literal 8720 zcmeHNu}UOC5UriH*F#0!#LRO71J8qTE)WbvCQ(~BL^#Y{aZxT%*=^xA(nN3(!Ef*j z3=LNW7cRKK{E~x1ag!4R!DO$hyLwzEQZcNCnOF7dRoC#cp?i1s>s*k_fnNd4fXxOI zOSw0|acEQKrl0@`KFVslo=X@doH;z^tv$k^D-*3K?b&3}{|3n9Smcia@?VT^TMeIz(kBLsOh=E$NWpGJ`Utn!%Eg4QRL{d3Gc zL0$bpFkQ8q)+v^LV{+RM0Id_SE?91sV@0dYVa5C_BoaX=gp2gCt!KpYSUUg!Xw zQHS`@S^WIsGM?w>8pP3`Hmx9&_c=O!dz~k;IYiZss;QXLDnzFI!$7pTWy;a|=1#O- z+1f5wObw#7k|{y7TCMtB-j2Q4O5Z?d{dT4I3S64rC*X4SdyB|-;}dWl()$IDNbePJ z-Jkb+`6vdoXP$}lenIGnY=3tCILc^G-@n556jr#O0Tpg#=XcKb8baSc(Me*Qo&O(M CGF*HB literal 0 HcmV?d00001 diff --git a/gnu-asm/factorial1/run.sh b/gnu-asm/factorial1/run.sh new file mode 100755 index 0000000..6837d8c --- /dev/null +++ b/gnu-asm/factorial1/run.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +as --64 -o factorial1.o factorial1.s +ld -o factorial1 factorial1.o +cp factorial1 factorial1.stripped +strip --strip-all factorial1.stripped +./factorial1.stripped +