All pastes #2090226 Raw Edit

Unnamed

public text v1 · immutable
#2090226 ·published 2011-10-15 05:40 UTC
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