опубликован 06-11-2001 22:53 MSK
Мог бы.....
Только это для 16 бит.....;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Преобразование строки IP-адреса в число (by 7in) ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.MODEL Tiny,Pascal ; Обратите внимание!
.486
.CODE
ORG 100h ; COM-программа
SMART
Start:
;
; Пример преобразует строку в число и выводит байты в виде символов на экран
;
;-- Начало примера ----------------------------------------------------------;
push ds
lea ax,IP
push ax
call ProcessIP
jnc Ok
xor eax,eax ; Если ошибка, просто заносим нули...
Ok:
int 29h ; Выводит на экран символ с кодом AL
mov al,ah
int 29h
shr eax,16
int 29h
mov al,ah
int 29h
int 20h ; Выходим из программы
IP DB '1.2.3.4',0
;-- Конец примера :) --------------------------------------------------------;
; На входе: адрес ASCIIZ-строки (в стеке)
; На выходе: IP-адрес в EAX (первое число в AL) и флаг CF сброшен
; ...или... флаг CF установлен, если ошибка
ProcessIP proc
arg String:DWORD ; В 32-х битах здесь будет :PWORD (вроде)
uses DS ; Если DS жалко терять :)
cld
lds si,String ; В 32-х: lds esi,String
xor edx,edx ; Здесь временно будет IP
mov cx,10
mov ax,'.' ; Чтобы сработала ошибка, если в начале точка
@@NextNumber:
cmp ah,'.'
je @@Error ; В начале (или после точки) не может быть точки
ror edx,8 ; Следующий байт
xor bx,bx ; BX - текущее число
inc ch ; CH - счетчик чисел
@@NextDigit:
mov dl,bl ; Сохраним пока то число, которое есть
mov ah,al ; Сохраняем предыдущий байт
lodsb ; Читаем следующий байт в AL
or al,al
jz @@End ; Если это ноль, то на завершение
cmp al,'.'
je @@NextNumber ; Если точка, то начинаем следующее число
; Переводим новую цифру
sub al,'0' ; AL=0..9 (если это цифра)
cmp al,9
ja @@Error ; Это не цифра...
xchg ax,bx ; AH,AL сохраняем в BX, а BX -> AX
mul cl ; Умножаем AL на 10
or ah,ah
jnz @@Error ; Если число >= 260, то ошибка
xchg bx,ax ; Меняем BX и AX
add bl,al ; Добавляем цифру
jc @@Error ; Если число = 256..259, то ошибка
jmp @@NextDigit ; Следующая цифра
@@End:
cmp ah,'.'
je @@Error ; В конце не может быть точки
cmp ch,4
jne @@Error ; Чисел должно быть 4 !
ror edx,8 ; Прокручиваем последний раз
xchg eax,edx ; Записываем IP в EAX
clc ; CF=NC=0 - ошибки нет
mov dl,? ; Это просто небольшой трюк...
ORG $-1 ; ...аналогично jmp @@Exit, но на байт меньше :)
@@Error: stc ; CF=CY=1 - ошибка есть
@@Exit: ret
ProcessIP endp
END Start