; Процедура перевода числа из ASCII в двоичный формат
; Адрес строки - в StrIn; Результат в регистре EAX
ASC_TO_BIN PROC StrIn:DWORD
PUSH EBX
PUSH EDX
PUSH ESI
PUSH EDI
XOR EAX,EAX
MOV EDI,10 ; Множитель 10
MOV EBX,StrIn
XOR ESI,ESI ; В ESI - признак знака
числа
SPACE: CMP BYTE PTR [EBX],32 ; Это пробел ?
JNE MINUS
INC EBX
JMP SPACE
MINUS: CMP BYTE PTR [EBX],'-' ; Проверка
знака
JNE PLUS
MOV ESI,01
JMP NEXT
PLUS: CMP BYTE PTR [EBX],'+'
JNE DIGIT
NEXT: INC EBX
DIGIT: CMP BYTE PTR [EBX],'0' ; Это цифра ?
JB MAGN
CMP BYTE PTR [EBX],'9'
JA MAGN
XOR EDX,EDX
MUL EDI ; EAX = EAX*10
MOV DL,[EBX] ; DL <= код ASCII цифры
SUB DL,'0' ; DL = число 0-9
ADD EAX,EDX ; EAX = EAX+цифра
JMP NEXT
MAGN: CLC ; CF <= 0
CMP EAX,7FFFFFFFH ; Предел для EAX
JBE SIGN
STC ; Плохое число CF=1
JMP DONE
SIGN: OR ESI,ESI ; Проверка ESI
JZ DONE ; Если EAX было положительно
NEG EAX ; Если отрицательно сменить
CLC ; знак и CF=0
DONE: POP EDI
POP ESI
POP EDX
POP EBX
RET
ASC_TO_BIN ENDP