day 15 part1&2
This commit is contained in:
1 parent
5b6a60a62a
commit
9ecb520b5c
6 files changed
+467
No files matched your search
@@ -0,0 +1,3 @@
|
||||
all:
|
||||
nasm -g -felf32 main.s && ld -melf_i386 -g main.o
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
kff-,skp-,ff=5,rgr-,kgt-,mmv=2,lmr=2,xrq=3,jrs-,jccx=6,qprx=1,bsr=6,dnb=3,mgft-,cdj-,hf=7,fdrgdv-,hm-,kc=6,cvc-,mm-,pm=9,kstfh=8,rlqh-,jq=1,ljk=3,cx-,bbp-,dkpnb=4,mg=4,dpq-,ts=8,vgsn-,pvs=5,gbpzd-,xr=6,vj-,vtphg=5,fvz-,cpz-,cgm-,lvr=1,sfq-,ksd-,mj=9,kldxjm=9,qmj-,fqrh-,jn=3,czlss-,cpl=7,fh-,bsm-,nt-,bbp-,hj=6,ks-,tf-,hpbbfq-,fgrb-,rsz-,fjh-,zxm-,dczd=9,zsp-,qg=6,qfnxg=3,hf-,dn=5,gvm-,jxhht-,lxj=8,lt-,rch=4,pdb=9,xqm=4,drg=4,vrm=7,flkj=4,mm=5,fkkc=7,vc=6,jmd-,qbss-,trlmql=8,zg=4,rch-,msdnpt-,xctl-,ksbtkp=3,ptrq=5,tgl=8,rgr-,np=4,hqkr-,hgcvx=5,shdr-,rqlzm=5,ts-,hkrg=1,fl-,rsz=5,xrsj=6,lt=2,zcv=6,kldxjm-,bjhnm=7,tg=9,cn=4,xnx=1,zg=7,rrl=6,kqkm-,jmn-,fc-,mltqq-,rct-,cnsq=6,nrbv-,zn=9,gp=7,zsp-,zr-,pbpsp=3,dj-,cgdmm-,fl=9,xnx-,dkg=2,lm=6,fgrb=5,cznv-,sn-,rrf-,tld=8,rvmf=8,vq=7,msf=1,ncrtf=5,jhb-,mpb=3,phf-,bhl=9,mj-,nz=3,tr-,lj=5,zcv=6,vmd-,slb=6,clzljg-,mpzq-,tk-,tld-,vkm-,hqf-,jmd=1,chk=9,zr-,zdf=3,bm-,rfn-,qck=4,bqv=4,xjhbf-,zjxnb-,gn=1,fh-,klt-,jm-,qsr-,ft-,jrs-,xtr-,mgnh=7,jf=3,csr=7,cf=2,kbxm-,jmn-,fqrh-,qq-,jhnlt-,vk=9,jz-,vkm-,fzj=7,bqvq=8,lmr-,vhljvf-,zcm=7,jnn=3,ncrtf=4,jhnlt=7,vzvr-,rhtt-,gm=3,lk-,cpz=1,pq-,bb-,ct=4,qd=7,zcm=5,rh-,lvr-,sc=2,pf-,gtz-,mgft-,fjh-,gl=6,zxrrl=5,jq-,spq=7,xnjlqp-,xnjlqp=1,lhzng=6,dhdx=7,sj-,dhdx=6,jbjjms=4,ggnd-,qkz-,hqf=9,ts=8,qhtp-,zg-,rj-,dm=1,cvc-,dqs=9,hqkr=5,qfvt-,fknrgk=7,dfv-,zlm=6,kksttq-,rj-,bhl-,psgr=4,dkpnb-,vtvr-,qmms=7,vhljvf=6,rh=7,fvz-,fp=1,qfvt-,vmr-,ksd-,xrsj-,rhtt-,lvr-,qq-,knc-,kbxm-,xpvg-,zjxnb-,zgk=9,rsz=1,qprx-,gjs=5,lmr-,pjp-,rdkhx-,jtnf=6,zcx=4,fjtbp-,cxgtt=9,xqm-,cm=8,crhp-,xvp=9,skp=8,trm-,zrj-,ks=8,csgd-,nqg-,fxxtp=5,zn-,xqm=1,hmt-,mrn-,brpr-,gcth-,hj-,cr=6,vp-,srjg-,vq=3,hvt-,trlmql=5,dsqj=8,dj=5,msf-,gtp-,rch=4,fd-,rpkx=2,cx=7,mxvrm=1,mh-,tk-,fss=4,sgkj-,xtd=5,zl=8,vp-,qfnxg-,lhp=2,srjg=9,svl-,tvd=6,shdr-,rt-,dhdx-,pfp-,rct=2,zz-,nj-,xfr=7,cx=1,bqlxm=3,pf-,qh=8,lsm=7,xqpqd-,prg-,pnntc-,fxxtp-,gvm=5,xh-,mrn-,lsm=9,fc=4,kbb=8,fxxtp-,rrl=6,dqzfx-,ms-,fkkc=9,ncrtf-,tbpmh=8,pdd=7,rgr-,djgb=5,kldxjm=5,kbb=6,rns=7,gbpzd=1,ztvk=9,nggs=2,hkrg-,lqcv-,qbss-,vp=3,srvd-,sdvrn-,vxp=9,hpbbfq-,zrj-,tzs=3,rbn=3,kbb=8,gtz-,gsc-,nffffr=7,qqv-,jbjjms-,hh=4,np=5,rfn-,fzj-,jccx-,kstfh-,xqpqd-,qck-,np-,ph-,zxrrl=1,sxxxr=4,phf-,jccx-,nhxp=8,srjg-,cj-,rqb=5,lq-,zr-,cq-,vq-,zv-,fv-,lf-,qqv=7,dsdsqj-,tkt=7,md-,cxgtt-,kstfh-,cvc=3,ct=2,qqv=1,zrj-,sdkz-,spl=7,hqkr=9,kc-,sbq-,dvf-,jxhht-,hq-,rlr-,pvs-,bb-,kvxx=6,kcb-,qsb=3,hq-,lk-,fg=1,vmf-,rh-,hxr-,kzd=8,bm-,zg-,vhljvf=5,gfhkm-,tcxq=7,zkbh=4,mxfc-,pm-,zv-,sr-,jxd-,qhtp=2,vtclbc=9,cpl-,hvb=8,qxpk-,xctl-,knm-,vp=6,zxrrl=9,hmt=6,zv=5,sr=9,trm=7,dhdx-,cpl-,fd-,cn=6,hpbbfq=6,sdr-,pqqb-,crhp-,nqg=3,hmxm=6,pdd=8,xnjlqp=7,xr-,vpx=2,jq-,dvf=1,qprx=5,kc=4,prg-,xctl-,cxlx-,qx-,rlr-,zcx-,cnsq=9,kp=8,xtt-,xrsj-,fh-,pv-,ft-,ckt-,fvz-,ps-,sr=5,tkt-,fjk=2,tvz=7,kkb-,dhdx=9,psgr=4,zl-,pqqb=5,bqv=6,vmf=9,dvf-,bnr=4,fl=7,qg-,tlpts=7,dvf-,lhzng-,zz-,qkz-,pjp=1,hmxm-,stp=3,kksttq-,bc=6,sgkj=8,cjj-,jbjjms-,clzljg-,xcrs-,mj=4,dkg=3,vds=9,nfkn=5,hnr=9,rbn-,zjxnb-,ht=2,kxgc=5,nj-,kd-,kxn-,bn=9,lhp-,zgk=5,dz-,nrx-,nz-,ch=3,fgrb=5,cpl-,dqm-,dx-,xr=1,nqg=6,gn-,jxhht=5,fr=7,qck-,jrs-,fkkc=4,nnv=4,vpx-,kvxx-,sdvrn-,bnvgz=6,gxd-,cznv=9,vtphg=6,msf=3,vtv=3,zd=3,xrsj-,tf-,vj-,fh=2,prg-,rpkx-,pm=8,jnq=7,lj=1,vds-,np-,tld-,xctl=9,lq=1,qxxs=9,hmxm-,gh-,nffffr-,lm-,fjk-,ztp-,cdktcd-,llmrl-,cdktcd-,sn=1,lj-,mm-,dsxc=3,nhxp=8,tx-,zxm=4,tcxq=5,dczd-,tbpmh=9,fknrgk=5,kp=3,qxk-,cm=9,qs-,qfvt=4,rqb=4,rj-,nggs=1,ks=4,mk-,csr-,rt=2,cn-,qq=3,nfkn-,vj=1,pjp=6,pnntc-,vgtk=8,qjc-,cdls=1,fxxtp=6,vbn-,vk-,prg=9,dn=7,pvs=7,lmr-,hrm=9,sc-,rrsls=9,dsxc-,rrf=8,nz-,sxxxr=6,qmd=8,fp-,gl=4,tb-,zqv=1,dv=7,nrbv-,kc-,cgm=3,vkm=4,pbpsp-,ct-,zcx=1,pncctm=2,lvj-,qprx-,tzs=6,tjt=6,qmd=4,brpr-,rlqh-,dgcmk-,fgrb=5,zj=4,ptrq-,xr=6,zrfd-,dsqj=7,qt-,fj-,xrq=3,mmv-,fxxtp=8,zn=7,xh-,pfp-,zrj=7,dp=5,sn=1,ftb=9,rhtt=1,qt=4,lzs=7,xgjsm=8,fg-,zrj-,hh=7,lt=9,dm-,kkb=1,tgpg=5,ts=4,vp-,srjg=4,vtv=2,srvd=2,jf=8,qp=4,qb=5,np-,bjhnm=6,vk-,jb=7,rqb=7,lvj-,lk-,ph=9,dx=2,rh=8,vrm=5,ndf-,km-,ttp-,cpz=1,bjhnm-,rmdpjc=4,qp-,hrm-,ms-,tlvcnc-,vk=9,bf-,rrf=7,tlvcnc-,mxrp-,qmms-,rgr=8,vj-,ts-,bsm-,cr-,mh=4,trlmql=5,tjt-,gl=5,lr-,pgbg=9,tx=6,rj-,bsm=5,fpbz=9,cdls=2,nhxp-,zn-,qrc=3,lj=2,kxn-,ccn-,vbn=3,tgpg=6,dph=9,bgvt=6,bl=7,vq-,lxj=4,zdf-,rx-,xc=8,jmn-,lsqj-,sbq=3,dsqj=6,mk-,fl=4,clsd=4,vtphg-,qs=2,jxhht=2,tgpg=7,mp-,nffffr-,rs-,pnntc=6,jmb-,ph-,hvt-,xtd=9,srjg=5,tld=2,tvz=1,nhxp-,vgtk=9,xrq=3,dng=8,nnv=3,rns=9,qq-,rrsls=7,qp-,rgr-,kzd=3,ct=8,dfv-,rt-,sxxxr=4,xj-,qxxs-,klt-,df-,qcz=5,dczd=8,md-,qsr=1,rj-,sll-,dp-,ht-,zv-,tlpts-,clzljg=4,cjj=6,pdd=1,xtt=5,fvz=6,zcm=8,cdktcd-,kksttq-,xpvg=2,sdvrn-,knm=2,lmr-,qgfmp-,ng-,fvz=6,dqm-,kgt=6,lqcv-,xr=7,qmd=3,tn-,smffl=9,lzs-,llmrl=3,mtpc-,kgt=8,jl-,bsf=4,hrm=8,nt-,cgdmm-,mtpc-,bgvt-,lqcv=8,zqv=1,xctl-,hnr=7,jnq-,mp-,bm=4,qlm-,pv-,jbtf=6,pvs-,dmgc-,rgt-,kxn=7,zv=1,svl-,clsd=9,ljk=6,brpr-,nfkn=9,fg-,dl=3,sc-,skp-,dn=6,zrj-,gbpzd-,nrbv-,lxj-,rqlzm=7,pdb=6,lzs=9,cfc=7,qrk-,xj-,tcxq=3,gxbm=8,fqrh-,rgt=4,gr-,qd-,rlqh=8,sjjxn-,tf=2,qck=9,lhzng-,trm-,vmjq=9,ztp-,tk=5,bq-,pq-,kLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
rn=1,cm-,qp=3,cm=2,qp-,pc=4,ot=9,ab=5,pc-,pc=6,ot=7
|
||||
@@ -0,0 +1,160 @@
|
||||
global _start
|
||||
[bits 32]
|
||||
[section .text]
|
||||
|
||||
%include "utils.s"
|
||||
|
||||
_start:
|
||||
|
||||
; HASH
|
||||
mov esi, file
|
||||
xor ebx, ebx ; current value
|
||||
xor edi, edi ; current label high
|
||||
xor ecx, ecx ; current label low
|
||||
mov ebp, 17 ; mul value
|
||||
hash:
|
||||
movzx eax, byte [esi]
|
||||
inc esi
|
||||
cmp al, 10
|
||||
je next_seq
|
||||
cmp al, '-'
|
||||
je minus
|
||||
cmp al, '='
|
||||
je equals
|
||||
; save label
|
||||
cmp ecx, 0x00ffffff
|
||||
ja .needs_high
|
||||
shl ecx, 8
|
||||
mov cl, al
|
||||
jmp .do_hash
|
||||
.needs_high:
|
||||
xchg eax, edi
|
||||
shl eax, 8
|
||||
mov al, cl
|
||||
xchg eax, edi
|
||||
mov cl, al
|
||||
.do_hash:
|
||||
; do HASH
|
||||
; current += new
|
||||
add eax, ebx
|
||||
; current *= 17
|
||||
mul ebp
|
||||
; current %= 256
|
||||
movzx ebx, al
|
||||
jmp hash
|
||||
; i'm not using a linked list whatever
|
||||
minus:
|
||||
; box *box = boxes+current*1024
|
||||
shl ebx, 10
|
||||
lea ebp, [ebx+boxes]
|
||||
lea ebx, [ebx+boxes+4]
|
||||
; box->max
|
||||
mov eax, [ebp]
|
||||
.find_eq:
|
||||
test eax, eax
|
||||
jz .done
|
||||
dec eax
|
||||
cmp [ebx], ecx
|
||||
jne .cont
|
||||
cmp [ebx+4], edi
|
||||
jne .cont
|
||||
xchg esi, edx
|
||||
; remove match, move others down
|
||||
mov edi, ebx
|
||||
lea esi, [ebx+12]
|
||||
; len = eax*8 + eax*4
|
||||
mov ecx, eax
|
||||
shl ecx, 3
|
||||
shl eax, 2
|
||||
add ecx, eax
|
||||
rep movsd
|
||||
xchg esi, edx
|
||||
; decrease max
|
||||
dec dword [ebp]
|
||||
jmp .done
|
||||
.cont:
|
||||
add ebx, 12
|
||||
jmp .find_eq
|
||||
.done:
|
||||
inc esi
|
||||
jmp next_seq
|
||||
equals:
|
||||
; box *box = boxes+current*1024
|
||||
shl ebx, 10
|
||||
lea ebp, [ebx+boxes]
|
||||
lea ebx, [ebx+boxes+4]
|
||||
; box->max
|
||||
mov eax, [ebp]
|
||||
.find_eq:
|
||||
test eax, eax
|
||||
jz .no_match
|
||||
dec eax
|
||||
cmp [ebx], ecx
|
||||
jne .cont
|
||||
cmp [ebx+4], edi
|
||||
jne .cont
|
||||
; update match
|
||||
mov al, [esi] ; ascii num
|
||||
sub al, '0' ; to binary
|
||||
mov [ebx+8], al
|
||||
jmp .done
|
||||
.cont:
|
||||
add ebx, 12
|
||||
jmp .find_eq
|
||||
.no_match:
|
||||
; new entry
|
||||
mov [ebx], ecx
|
||||
mov [ebx+4], edi
|
||||
mov al, [esi]
|
||||
sub al, '0'
|
||||
mov [ebx+8], al
|
||||
; inc max
|
||||
inc dword [ebp]
|
||||
.done:
|
||||
add esi, 2
|
||||
next_seq:
|
||||
xor ebx, ebx ; current value
|
||||
xor edi, edi ; current label high
|
||||
xor ecx, ecx ; current label low
|
||||
mov ebp, 17 ; mul value
|
||||
cmp esi, file.over
|
||||
jb hash
|
||||
|
||||
mov esi, boxes
|
||||
calc_shit:
|
||||
cmp dword [esi], 0
|
||||
je .cont
|
||||
mov edi, esi
|
||||
sub edi, boxes
|
||||
shr edi, 10 ; box idx
|
||||
inc edi ; box num
|
||||
mov ecx, 1 ; slot num
|
||||
lea ebx, [esi+4] ; lenses
|
||||
.inner:
|
||||
mov eax, edi ; box num
|
||||
mul ecx ; slot num
|
||||
mul dword [ebx+8] ; focal length
|
||||
add [final_value], eax
|
||||
add ebx, 12
|
||||
inc ecx
|
||||
cmp ecx, [esi]
|
||||
jbe .inner
|
||||
.cont:
|
||||
add esi, 1024
|
||||
cmp esi, boxes.end
|
||||
jb calc_shit
|
||||
|
||||
game_over:
|
||||
mov eax, [final_value]
|
||||
call print_dec
|
||||
call newline
|
||||
jmp exit
|
||||
|
||||
[section .data]
|
||||
final_value: dd 0
|
||||
file: incbin "input"
|
||||
.over:
|
||||
|
||||
[section .bss]
|
||||
boxes: resb 256*1024
|
||||
.end:
|
||||
@@ -0,0 +1,44 @@
|
||||
global _start
|
||||
[bits 32]
|
||||
[section .text]
|
||||
|
||||
%include "utils.s"
|
||||
|
||||
_start:
|
||||
|
||||
; HASH
|
||||
mov esi, file
|
||||
xor ebx, ebx ; current value
|
||||
mov ebp, 17 ; mul value
|
||||
hash:
|
||||
movzx eax, byte [esi]
|
||||
inc esi
|
||||
cmp al, ','
|
||||
jle .next_seq
|
||||
; do HASH
|
||||
; current += new
|
||||
add eax, ebx
|
||||
; current *= 17
|
||||
mul ebp
|
||||
; current %= 256
|
||||
movzx ebx, al
|
||||
jmp hash
|
||||
.next_seq:
|
||||
add [final_value], ebx
|
||||
xor ebx, ebx
|
||||
cmp esi, file.over
|
||||
jb hash
|
||||
|
||||
|
||||
game_over:
|
||||
mov eax, [final_value]
|
||||
call print_dec
|
||||
call newline
|
||||
jmp exit
|
||||
|
||||
[section .data]
|
||||
final_value: dd 0
|
||||
file: incbin "input"
|
||||
.over:
|
||||
|
||||
[section .bss]
|
||||
+258
@@ -0,0 +1,258 @@
|
||||
; call # val val2
|
||||
; int $0x80 eax eax edx -
|
||||
;
|
||||
; arg1 arg2 arg3 arg4 arg5 arg6 arg7
|
||||
; ebx ecx edx esi edi ebp -
|
||||
|
||||
exit:
|
||||
mov eax, 1 ; exit
|
||||
int 0x80
|
||||
|
||||
; filename in EBX
|
||||
; return handle in EBX
|
||||
; read only
|
||||
open_file:
|
||||
push eax
|
||||
push ecx
|
||||
mov eax, 5 ; open
|
||||
xor ecx, ecx ; read only
|
||||
int 0x80
|
||||
mov ebx, eax
|
||||
pop ecx
|
||||
pop eax
|
||||
ret
|
||||
|
||||
; file handle in EBX
|
||||
; buffer in ECX
|
||||
; count of bytes to read in EDX
|
||||
; return bytes actually read in EAX
|
||||
; exits on error
|
||||
read_file:
|
||||
mov eax, 3 ; read
|
||||
int 0x80
|
||||
test eax, eax
|
||||
js .err
|
||||
ret
|
||||
.err:
|
||||
mov eax, 4 ; write
|
||||
mov ebx, 1 ; stdout
|
||||
mov ecx, .err_str
|
||||
mov edx, 21
|
||||
int 0x80
|
||||
jmp exit
|
||||
.err_str: db `Could not read file.\n`
|
||||
|
||||
; string input in ESI
|
||||
; value in EAX
|
||||
; CF set if none, clear if some
|
||||
; ESI set past checked area
|
||||
dec_parse:
|
||||
push ebx
|
||||
push edx
|
||||
push edi
|
||||
xor eax, eax
|
||||
xor edi, edi
|
||||
mov ebx, 10 ; base
|
||||
lodsb
|
||||
sub al, '0'
|
||||
js .no_input
|
||||
cmp al, 9
|
||||
jle .got_char
|
||||
.no_input:
|
||||
stc ; set CF
|
||||
jmp .done
|
||||
.loop:
|
||||
xor eax,eax
|
||||
lodsb
|
||||
sub al, '0'
|
||||
js .dec_done
|
||||
cmp al, 9
|
||||
jg .dec_done
|
||||
.got_char:
|
||||
xchg edi,eax
|
||||
mul ebx
|
||||
add edi,eax
|
||||
jmp .loop
|
||||
.dec_done:
|
||||
clc ; clear CF
|
||||
.done:
|
||||
mov eax,edi
|
||||
pop edi
|
||||
pop edx
|
||||
pop ebx
|
||||
ret
|
||||
|
||||
; string input in ESI
|
||||
; value in EAX
|
||||
; CF set if none, clear if some
|
||||
; ESI set past checked area
|
||||
sign_dec_parse:
|
||||
push ebx
|
||||
push ecx
|
||||
push edx
|
||||
push edi
|
||||
xor eax, eax
|
||||
xor edi, edi
|
||||
xor ecx, ecx ; neg flag
|
||||
mov ebx, 10 ; base
|
||||
cmp byte [esi], '-'
|
||||
jne .no_minus
|
||||
inc esi
|
||||
mov cl, 1
|
||||
.no_minus:
|
||||
lodsb
|
||||
sub al, '0'
|
||||
js .no_input
|
||||
cmp al, 9
|
||||
jle .got_char
|
||||
.no_input:
|
||||
stc ; set CF
|
||||
jmp .done
|
||||
.loop:
|
||||
xor eax,eax
|
||||
lodsb
|
||||
sub al, '0'
|
||||
js .dec_done
|
||||
cmp al, 9
|
||||
jg .dec_done
|
||||
.got_char:
|
||||
xchg edi,eax
|
||||
mul ebx
|
||||
add edi,eax
|
||||
jmp .loop
|
||||
.dec_done:
|
||||
test ecx, ecx
|
||||
jz .not_neg
|
||||
neg edi
|
||||
.not_neg:
|
||||
clc ; clear CF
|
||||
.done:
|
||||
mov eax,edi
|
||||
pop edi
|
||||
pop edx
|
||||
pop ecx
|
||||
pop ebx
|
||||
ret
|
||||
|
||||
; modifies no regs
|
||||
newline:
|
||||
pushad
|
||||
push 10
|
||||
mov eax, 4 ; write
|
||||
mov ebx, 1 ; stdout
|
||||
mov ecx, esp ; string
|
||||
mov edx, 1 ; length
|
||||
int 0x80
|
||||
add esp, 4
|
||||
popad
|
||||
ret
|
||||
; modifies no regs
|
||||
space:
|
||||
pushad
|
||||
push 9
|
||||
mov eax, 4 ; write
|
||||
mov ebx, 1 ; stdout
|
||||
mov ecx, esp ; string
|
||||
mov edx, 1 ; length
|
||||
int 0x80
|
||||
add esp, 4
|
||||
popad
|
||||
ret
|
||||
|
||||
; input in EAX, all regs unmodified
|
||||
print_dec:
|
||||
pushad ; save regs
|
||||
; max 4294967296 is 10 chars
|
||||
; round to nearest 32-bit boundary
|
||||
sub esp, 12
|
||||
; string in ECX, length in EDX
|
||||
lea ecx, [esp+11] ; last possible byte
|
||||
; check for 0
|
||||
test eax, eax
|
||||
jz .zero
|
||||
mov ebx, 10 ; base 10
|
||||
xor esi, esi ; counter
|
||||
.div_shit:
|
||||
xor edx, edx
|
||||
; divide
|
||||
div ebx
|
||||
dec ecx ; next char
|
||||
inc esi
|
||||
; store
|
||||
add dl, '0'
|
||||
mov byte [ecx], dl
|
||||
; check if done
|
||||
test eax, eax
|
||||
jnz .div_shit ; continue
|
||||
mov edx, esi ; counter in edx
|
||||
jmp .write
|
||||
.zero:
|
||||
mov byte [ecx], '0'
|
||||
mov edx, 1 ; length
|
||||
.write:
|
||||
mov eax, 4 ; write
|
||||
mov ebx, 1 ; stdout
|
||||
int 0x80
|
||||
add esp, 12 ; restore stack
|
||||
popad ; restore regs
|
||||
ret
|
||||
|
||||
; input in EAX, all regs unmodified
|
||||
print_sign_dec:
|
||||
pushad ; save regs
|
||||
; range -2147483648 to 2147483647 is 11 chars
|
||||
; round to nearest 32-bit boundary
|
||||
sub esp, 12
|
||||
; string in ECX, length in EDX
|
||||
lea ecx, [esp+11] ; last possible byte
|
||||
; check for 0, negative
|
||||
xor ebp, ebp
|
||||
test eax, eax
|
||||
jz .zero
|
||||
jns .positive
|
||||
neg eax
|
||||
mov ebp, 1
|
||||
.positive:
|
||||
mov ebx, 10 ; base 10
|
||||
xor esi, esi ; counter
|
||||
.div_shit:
|
||||
xor edx, edx
|
||||
; divide
|
||||
div ebx
|
||||
dec ecx ; next char
|
||||
inc esi
|
||||
; store
|
||||
add dl, '0'
|
||||
mov byte [ecx], dl
|
||||
; check if done
|
||||
test eax, eax
|
||||
jnz .div_shit ; continue
|
||||
mov edx, esi ; counter in edx
|
||||
jmp .write
|
||||
.zero:
|
||||
mov byte [ecx], '0'
|
||||
mov edx, 1 ; length
|
||||
.write:
|
||||
test ebp, ebp
|
||||
jz .no_minus
|
||||
dec ecx
|
||||
inc edx
|
||||
mov byte [ecx], '-'
|
||||
.no_minus:
|
||||
mov eax, 4 ; write
|
||||
mov ebx, 1 ; stdout
|
||||
int 0x80
|
||||
add esp, 12 ; restore stack
|
||||
popad ; restore regs
|
||||
ret
|
||||
|
||||
; input in ESI, len in ECX, all regs unmodified
|
||||
print_string:
|
||||
pushad ; save regs
|
||||
mov eax, 4 ; write
|
||||
mov ebx, 1 ; stdout
|
||||
mov edx, ecx ; length
|
||||
mov ecx, esi ; string
|
||||
int 0x80
|
||||
popad ; restore regs
|
||||
ret
|
||||
Reference in new issue
Block a user