section .bss
stdout:
resb 4
section .text
extern _GetStdHandle@4
extern _WriteFile@20
err:
ud2
global _initstdout
_initstdout:
push -11
call _GetStdHandle@4
cmp eax, -1
je err
mov [stdout], eax
ret
divq10: ; edx:eax <- edx:eax / 10, ecx <- remainder
push ebx
mov ecx, eax
mov eax, edx
xor edx, edx
mov ebx, 10
div ebx
mov ebx, eax
mov eax, ecx
mov ecx, 10
div ecx
mov ecx, edx
mov edx, ebx
pop ebx
ret
llu2str: ; edx:eax -> *ecx (string), eax <- count
push ebx
push edi
push esi
push ebp
mov edi, eax
mov esi, edx
mov ebp, ecx
xor ebx, ebx
.0:
inc ebx
call divq10
mov ecx, eax
or ecx, edx
jnz .0
mov eax, edi
mov edx, esi
mov edi, ebx
.1:
call divq10
add ecx, '0'
dec ebx
mov [ebp + ebx], cl
jnz .1
mov eax, edi
pop ebp
pop esi
pop edi
pop ebx
ret
global _printf
_printf:
push ebx
push edi
push esi
push ebp
lea ebp, [esp + 24]
mov esi, [ebp - 4]
sub esp, 1024
mov edi, esp
.start:
mov bl, [esi]
test bl, bl
jz .end
cmp bl, '%'
jne .copy
inc esi
mov bl, [esi]
cmp bl, 'u'
jne .d0
mov eax, [ebp]
add ebp, 4
xor edx, edx
.u1:
mov ecx, edi
call llu2str
add edi, eax
jmp .next
.d0:
mov bl, [esi]
cmp bl, 'd'
jne .ll
mov eax, [ebp]
add ebp, 4
cdq
.d1:
mov ecx, edx
shr ecx, 31
jz .u1
mov byte [edi], '-'
inc edi
neg eax
adc edx, 0
neg edx
jmp .u1
.ll:
mov bl, [esi]
cmp bl, 'l'
jne err
inc esi
mov bl, [esi]
cmp bl, 'l'
jne err
inc esi
mov eax, [ebp]
mov edx, [ebp + 4]
add ebp, 8
mov bl, [esi]
cmp bl, 'u'
je .u1
cmp bl, 'd'
je .d1
jmp err
.copy:
mov [edi], bl
inc edi
.next:
inc esi
jmp .start
.end:
mov eax, esp
push 0
push edi
sub edi, eax
push edi
push eax
push dword [stdout]
call _WriteFile@20
test eax, eax
jz err
add esp, 1024
pop ebp
pop esi
pop edi
pop ebx
ret
Became Hot Network Question