implement Lprintf in asm; fix int to aint in runtime

This commit is contained in:
danyaberezun 2024-02-05 16:48:27 +01:00 committed by Roman Venediktov
parent e0189d5654
commit d76d2a02ea
3 changed files with 89 additions and 125 deletions

View file

@ -12,79 +12,40 @@
.extern cnt_percentage_sign
Lprintf:
pushq %rbp
movq %rsp, %rbp
movq %rdi, -40(%rbp)
movq %rsi, -48(%rbp)
movq -48(%rbp), %rax
movq %rax, -16(%rbp)
movl $0, -4(%rbp)
jmp .L2
.L5:
movq -40(%rbp), %rax
movzbl (%rax), %eax
cmpb $37, %al
jne .L3
movl -4(%rbp), %eax
cltq
leaq 0(,%rax,8), %rdx
movq -16(%rbp), %rax
addq %rdx, %rax
movq (%rax), %rax
movq %rax, -24(%rbp)
movq -24(%rbp), %rax
andl $1, %eax
testq %rax, %rax
je .L4
movl -4(%rbp), %eax
cltq
leaq 0(,%rax,8), %rdx
movq -16(%rbp), %rax
addq %rdx, %rax
movq -24(%rbp), %rdx
sarq %rdx
movq %rdx, (%rax)
.L4:
addl $1, -4(%rbp)
.L3:
addq $1, -40(%rbp)
.L2:
movq -40(%rbp), %rax
movzbl (%rax), %eax
testb %al, %al
jne .L5
movq -40(%rbp), %rax
movq %rax, %rdi
cmpl $0, -4(%rbp)
jle .L6
movq -16(%rbp), %rax
movq (%rax), %rax
movq %rax, %rsi
.L6:
cmpl $1, -4(%rbp)
jle .L7
movq -16(%rbp), %rax
movq 8(%rax), %rax
movq %rax, %rdx
.L7:
cmpl $2, -4(%rbp)
jle .L8
movq -16(%rbp), %rax
movq 16(%rax), %rax
movq %rax, %rcx
.L8:
cmpl $3, -4(%rbp)
jle .L9
movq -16(%rbp), %rax
movq 24(%rax), %rax
movq %rax, %r8
.L9:
cmpl $4, -4(%rbp)
jle .L11
movq -16(%rbp), %rax
movq 32(%rax), %rax
movq %rax, %r9
.L11:
nop
popq %rbp
# save return address
popq %r14
pushq %r9
pushq %r8
pushq %rcx
pushq %rdx
pushq %rsi
movq %rsp, %rax
# pushq %rsi
# rdi --- format string
# r11 --- number of arguments except format string
loop:
movq $0, %r12
cmpq %r11, %r12
jz continue
decq %r11
movq (%rax), %r10
testq $1, %r10
jz jmpCont
# unbox value
sarq %r10
movq %r10, (%rax)
jmpCont:
addq $8, %rax
jmp loop
continue:
popq %rsi
popq %rdx
popq %rcx
popq %r8
popq %r9
# restore return address
pushq %r14
jmp printf