mirror of
https://github.com/ProgramSnail/Lama.git
synced 2025-12-28 17:48:47 +00:00
implement Lprintf in asm; fix int to aint in runtime
This commit is contained in:
parent
e0189d5654
commit
d76d2a02ea
3 changed files with 89 additions and 125 deletions
111
runtime/printf.s
111
runtime/printf.s
|
|
@ -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
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue