I wrote a lib with some C like basic IO functions, take a look to get an idea of what is NASM:
Code:
%ifndef _IO
%define _IO
;BYTE COLOR VALUES
%define BLACK 00000000b
%define BLUE 00000001b
%define GREEN 00000010b
%define CYAN 00000011b
%define RED 00000100b
%define MAGENTA 00000101b
%define BROWN 00000110b
%define WHITE 00000111b
%define GRAY 00001000b
%define LIGHTBLUE 00001001b
%define LIGHTGREEN 00001010b
%define LIGHTCYAN 00001011b
%define LIGHTRED 00001100b
%define LIGHTMAGENTA 00001101b
%define YELLOW 00001110b
%define LIGHTWHITE 00001111b
SECTION .data
txtatt: db WHITE
c_x: dw 0
c_y: dw 0
SECTION .code
itoa:
push bp
mov bp, sp
mov bx, word [bp+4]
mov ax, word [bp+6]
.loop:
mov dx, 0
mov cx, 10
div cx
cmp ax, 0
je .end
add dx, 48
mov [bx], dx
inc bx
jmp .loop
.end:
add dx, 48
mov [bx], dx
inc bx
mov byte [bx], 0
push word [bp+4]
call near reverse
pop bp
retn 4
reverse:
push bp
mov bp, sp
sub sp, 5 ;alloc 5 bytes
mov byte [bp-1], 0 ;c
mov word [bp-3], 0 ;i
push word [bp+4]
call near strlen
mov bx, word [bp+4]
dec ax
mov word [bp-5], ax ;j
.loop:
mov ax, word [bp-3]
cmp ax, word [bp-5]
jae .end
mov si, word [bp-3]
mov al, byte [bx+si]
mov [bp-1], al ;c = bx[i]
mov si, word [bp-5]
mov al, byte [bx+si]
mov si, word [bp-3]
mov [bx+si], al ;bx[i] = bx[j]
mov si, word [bp-5]
mov al, byte [bp-1]
mov [bx+si], al ;bx[j] = c
inc word [bp-3]
dec word [bp-5]
jmp .loop
.end:
mov sp, bp
pop bp
retn 2
strcmp:
push bp
mov bp, sp
mov si, word [bp+6]
mov di, word [bp+4]
.loop:
mov al, byte [di]
cmp al, byte [si]
jne .end
cmp byte [si], 0
je .end
inc si
inc di
jmp .loop
.end:
mov al, [si]
sub al, byte [di]
pop bp
retn 4
strlen:
push bp
mov bp, sp
mov bx, [bp+4]
mov cx, 0
.loop:
cmp byte [bx], 0
je .end
inc bx
inc cx
jmp .loop
.end:
mov ax, cx
pop bp
retn 2
strcpy:
push bp
mov bp, sp
mov si, [bp+6]
mov di, [bp+4]
.loop:
cmp byte [si], 0
je .end
mov al, byte [si]
mov byte [di], al
inc si
inc di
jmp .loop
.end:
mov byte [di], 0
pop bp
retn 4
cprint:
push bp
mov bp, sp
mov si, [bp+4]
.loop:
cmp byte [si], 0
je .end
mov ah, 09h
mov al, byte [si]
mov bh, 0
mov bl, byte [txtatt]
mov cx, 1
int 10h
mov ah, 03h
mov bh, 0
int 10h
mov ah, 02h
mov bh, 0
inc dl
mov dh, dh
mov dl, dl
int 10h
inc si
jmp .loop
.end:
pop bp
retn 2
cputc:
push bp
mov bp, sp
mov si, [bp+4]
mov ah, 09h
mov al, [si]
mov bh, 0
mov bl, [txtatt]
mov cx, 1
int 10h
pop bp
retn 2
txtcl:
push bp
mov bp, sp
mov ah, [bp+4] ;save new color attrib
mov al, [txtatt] ;save current atrib
shr al, 4
shl al, 4 ;discard old text color nibble
xor al, ah ;set color nibble
mov [txtatt], al
pop bp
retn 2
txtbg:
push bp
mov bp, sp
mov ah, [bp+4] ;save new color attrib
shl ah, 4 ;move LO nibble to HO nibble
mov al, [txtatt] ;save current atrib
shl al, 4
shr al, 4 ;discard old bg color bits nibble
xor al, ah ;set new bg nibble
mov [txtatt], al
pop bp
retn 2
getxy:
push bp
mov bp, sp
mov ah, 03h
mov bh, 0
int 10h
mov si, [bp+6]
mov byte [si], dl
mov si, [bp+4]
mov byte [si], dh
pop bp
retn 4
setxy:
push bp
mov bp, sp
mov ah, 02h
mov bh, 0
mov dh, byte [bp+4]
mov dl, byte [bp+6]
int 10h
pop bp
retn 4
input:
push bp
mov bp, sp
mov si, [bp+4]
.loop:
mov ah, 00h
int 16h
cmp al, 1Bh ;if ESC key
je .loop
cmp al, 09h ;if TAB key
je .loop
cmp al, 4800h ;if UP ARROW key
je .loop
cmp al, 4B00h ;if LEFT ARROW key
je .loop
cmp al, 5000h ;if DOWN ARROW key
je .loop
cmp al, 4D00h ;if RIGHT ARROW key
je .loop
cmp al, 08h ;if BS key
je .back_one
cmp al, 0Dh ;if RETURN key
je .end
mov ah, 0Eh
mov al, al
xor bx, bx
int 10h
mov [si], al
inc si
jmp .loop
.back_one:
cmp byte [si-1], 0
je .loop
mov ah, 0Eh
mov al, al
xor bx, bx
int 10h
mov ah, 0Ah
mov al, ' '
xor bx, bx
mov cx, 1
int 10h
dec si
mov byte [si], 0
jmp .loop
.end:
mov byte [si], 0
pop bp
retn 2
getch:
mov ah, 00h
int 16h
retn
getchar:
push bp
mov bp, sp
mov ah, 00h
int 16h
mov si, [bp+4]
mov [si+0], al
mov ah, 0Eh
mov al, al
xor bx, bx
int 10h
pop bp
retn 2
putch:
push bp
mov bp, sp
mov ah, 0Ah
mov al, [bp+4]
xor bx, bx
mov cx, 1
int 10h
pop bp
retn 2
putchar:
push bp
mov bp, sp
mov ah, 0Eh
mov al, [bp+4]
xor bx, bx
int 10h
pop bp
retn 2
print:
push bp
mov bp, sp
mov si, [bp+4]
.loop:
cmp byte [si], 0
je .end
mov ah, 0Eh
mov al, [si]
xor bx, bx
int 10h
inc si
jmp .loop
.end:
pop bp
retn 2
%endif ;_IO
And finally, there's also an operating system build purely with NASM code ! named dynatOS, take a look: