global _putint global putcharhex global _putcharhex global putstr global _putstr _putint: push bp mov bp, sp mov ax, word [bp+4] ; ax=argument sub sp, 8 ; 5 bytes - printing buffer pusha mov di, -1 ; dest index mov si, 10 ; divisor, ax=dividend putint_divloop: mov dx, 0 ; clear upper bits div si add dx, '0' mov byte [bp+di], dl dec di cmp ax, 0 ja putint_divloop mov ah, 0x0e mov bx, 0x0007 putint_print: inc di mov al, byte [bp+di] int 0x10 cmp di, -1 jl putint_print popa mov sp, bp pop bp ret _putcharhex: push bp mov bp, sp mov cl, byte [bp+4] call putcharhex mov sp, bp pop bp ret putcharhex: ; cl=argument mov dx, bx ; preserve bx mov ah, 0x0e mov bx, 0x0007 mov al, cl and al, 0xf0 shr al, 4 call fourbit2hex int 0x10 mov al, cl and al, 0x0f call fourbit2hex int 0x10 mov bx, dx ; restore bx ret fourbit2hex: ; al=argument=result cmp al, 10 jae fourbit2hex_alpha add al, '0' ret fourbit2hex_alpha: add al, 'A' - 10 ret _putstr: push bp mov bp, sp mov dx, word [bp+4] call putstr mov sp, bp pop bp ret putstr: ; dx=argument mov cx, bx ; we must preserve bx putstr_start: mov bx, dx ; [dx] is not a effective address mov al, byte [bx] test al, al jz putstr_end mov ah, 0x0e mov bx, 0x0007 int 0x10 inc dx jmp putstr_start putstr_end: mov bx, cx ret