printf: cld pop si push bp mov bp, sp .loop: mov al, [cs:si] inc si cmp al, 0x00 je .end cmp al, 0x25 je .handle_25h .literal: call putc jmp .loop .end: pop bp push si ret .handle_25h: mov al, [cs:si] inc si cmp al, 0x25 je .literal cmp al, 0x58 ; 'X' je .printhex cmp al, 0x55 ; 'U' je .printdec cmp al, 0x53 ; 'S' je .printstr mov al, 0x3F jmp .literal .printhex: add bp, 2 mov ax, [bp] mov bx, 0x0010 call print_number jmp .loop .printdec: add bp, 2 mov ax, [bp] mov bx, 0x000A call print_number jmp .loop .printstr: add bp, 2 mov ax, [bp] call print_string jmp .loop print_number: xor dx, dx div bx ; ax = dx:ax / 10, dx = dx:ax % 10 and ax, ax jz .print push dx call print_number pop dx .print: mov al, dl add al, 0x30 cmp al, 0x3A jl .noadj add al, 0x07 .noadj: call putc ret print_string: push si mov si, ax .loop: lodsb cmp al, 0x00 je .end call putc jmp .loop .end: pop si ret