rendered paste body_printf: ;;;void _cdecl _printf(fmt, ...)
.fmt: equ 8
.curparam: equ 20
.minlen: equ 24
push ebp
mov ebp, esp
sub esp, 24
and dword [ebp - .curparam], 0
mov ebx, dword [ebp + .fmt]
.loop_top:
mov al, byte [ebx]
test al, al
jz near .loop_done
cmp al, '%'
jne near .not_marker
mov dword [ebp - .minlen], 8
inc ebx
mov al, byte [ebx]
sub al, '0'
cmp al, '9' - '0'
jg .not_numeric
movzx eax, al
mov dword [ebp - .minlen], eax
inc ebx
mov al, byte [ebx]
.not_numeric:
mov al, byte [ebx]
sub al, 'c'
cmp al, 'x' - 'c'
jg near .loop_cont
movzx eax, al
movzx eax, byte [.jmp_table + eax]
jmp dword [.jmp_table2 + eax * 4]
.default:
jmp .loop_cont
.case_c:
mov ecx, dword [ebp - .curparam]
mov cl, byte [ebp + ecx * 4 + 0Ch]
mov ch, 07h
call _putc
inc dword [ebp - .curparam]
jmp .loop_cont
.case_d:
.case_i:
push ebx
mov eax, dword [ebp - .curparam]
mov eax, dword [ebp + eax * 4 + 0Ch]
mov ecx, 10
lea edi, [ebp - 16]
call _itoa
pop ebx
mov ch, 07h
lea esi, [ebp - 16]
call _printstr
inc dword [ebp - .curparam]
jmp .loop_cont
.case_o:
push ebx
mov eax, dword [ebp - .curparam]
mov eax, dword [ebp + eax * 4 + 0Ch]
mov ecx, 8
lea edi, [ebp - 16]
call _itoa
pop ebx
mov ch, 07h
lea esi, [ebp - 16]
call _printstr
inc dword [ebp - .curparam]
jmp .loop_cont
.case_s:
mov ch, 07h
mov esi, dword [ebp - .curparam]
mov esi, dword [ebp + esi * 4 + 0Ch]
call _printstr
inc dword [ebp - .curparam]
jmp .loop_cont
.case_x:
push ebx
;;;xchg bx,bx;;;;
mov ebx, dword [ebp - .curparam]
mov ebx, dword [ebp + ebx * 4 + 0Ch]
mov ecx, dword [ebp - .minlen] ;8
.hitoa_top:
mov eax, 0x0F
push ecx
dec ecx
shl ecx, 2
shl eax, cl
mov edx, ebx
and edx, eax
shr edx, cl
mov ch, 07h
mov cl, byte [itoastr + edx]
call _putc
pop ecx
dec ecx
jnz .hitoa_top
pop ebx
inc dword [ebp - .curparam]
jmp .loop_cont
.not_marker:
mov cl, al
mov ch, 07h
call _putc ;eax and edx thrashed
.loop_cont:
inc ebx
jmp .loop_top
.loop_done:
mov esp, ebp
pop ebp
ret