87 lines
1,004 B
NASM
87 lines
1,004 B
NASM
cpu 8086
|
|
org 0x3000
|
|
|
|
xor dx, dx
|
|
|
|
cmp byte [si], 0
|
|
jne atoi
|
|
|
|
mov ah, 2
|
|
mov si, overflow_msg
|
|
int 0x21
|
|
int 0x20
|
|
|
|
atoi:
|
|
lodsb
|
|
|
|
cmp al, 0
|
|
je .end
|
|
|
|
cmp al, '0'
|
|
jl .notdigit
|
|
|
|
cmp al, '9'
|
|
jg .notdigit
|
|
|
|
xor ah, ah
|
|
sub al, '0'
|
|
mov cx, ax
|
|
|
|
mov ax, dx
|
|
mul word [ten]
|
|
test dx, dx
|
|
jnz .overflow
|
|
|
|
mov dx, ax
|
|
add dx, cx
|
|
jc .overflow
|
|
|
|
jmp atoi
|
|
|
|
.notdigit:
|
|
mov byte [char_slot], al
|
|
mov si, notdigit_msg
|
|
mov ah, 2
|
|
int 0x21
|
|
int 0x20
|
|
|
|
.overflow:
|
|
mov si, overflow_msg
|
|
mov ah, 2
|
|
int 0x21
|
|
int 0x20
|
|
|
|
.end:
|
|
|
|
std
|
|
mov di, hexstring+3
|
|
xor bh, bh
|
|
mov cx, 4
|
|
itoh:
|
|
mov bl, 0xf
|
|
and bl, dl
|
|
mov al, [hexdigits + bx]
|
|
stosb
|
|
|
|
shr dx, 1
|
|
shr dx, 1
|
|
shr dx, 1
|
|
shr dx, 1
|
|
|
|
loop itoh
|
|
|
|
cld
|
|
|
|
mov si, hexstring
|
|
mov ah, 2
|
|
int 0x21
|
|
int 0x20
|
|
|
|
notdigit_msg db "Not a digit '"
|
|
char_slot db 0, "'", 0
|
|
overflow_msg db "Value must be in range 0 to 65535", 0
|
|
|
|
hexstring db "xxxx", 0
|
|
|
|
hexdigits db "0123456789abcdef"
|
|
ten dw 10
|