1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
%ifndef _STDIO_ASM
%define _STDIO_ASM
%include "console.asm"
puts:
; Write string buffer at cursor position
push bp
mov bp, sp
pusha
mov si, [bp + 4] ; address of string buffer
mov bx, 0000h ;
mov ah, 0eh ; BIOS - teletype
.loop:
lodsb ; load byte at [si] into al
or al, 0 ; 0 | 0 = 0 (detect null terminator)
je .end
call putc
jmp .loop
.end:
popa
mov sp, bp
pop bp
ret
printi:
push bp
mov bp, sp
mov ax, [bp + 4] ; integer WORD
mov cx, 0 ; counter
cmp ax, 0
je .write_no_pop
.divide:
xor dx, dx
mov di, 10 ; divisor
div di
push dx
inc cx
cmp ax, 0
jne .divide
jmp .write
.write_no_pop:
or al, 30h
call putc
jmp .return
.write:
pop ax
or al, 30h
call putc
dec cx
jne .write
.return:
mov sp, bp
pop bp
ret
printh:
push bp
mov bp, sp
mov ax, [bp + 4] ; integer WORD
mov cx, 0 ; counter
cmp ax, 0
je .write_no_pop
.divide:
xor dx, dx
mov di, 16 ; divisor
div di
push dx
inc cx
cmp ax, 0
jne .divide
jmp .write
.write_no_pop:
or al, 30h
call putc
jmp .return
.write:
pop ax
cmp al, 10
jge .alpha
or al, 30h
jmp .decimal
.alpha:
sub al, 10
add al, 'A'
.decimal:
call putc
dec cx
jne .write
.return:
mov sp, bp
pop bp
ret
%endif
|