_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