Загрузка данных


; Процедура перевода числа из 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