Изучение основных операций ввода-вывода, работы с регистрами, работы с текстовыми данными (Лабораторная работа № 4), страница 2

            call  _putch                  ;вывели символ

            pop         eax

            pop         ecx                     ;забрали счетчик из стека

            loop  r                       ;всю строку вывели?

;формирование числа в десятичном виде

            inc         counter                 ;увеличили счетчик числа символов

            mov         ebx,  eax

            sub         ebx,  '0'         ;взяли считанную цифру

            cmp         ebx,  10

            jl          @4

            sub         ebx,  39

@4:         mov         eax,  number      ;взяли старую часть

            mov         edx,  16          ;базу системы счисления

            mul         edx                     ;и перемножили

            add         eax,  ebx         ;добавили новую цифру

            mov         number, eax       ;сформировали число в number

            call  putDec     

            cmp         counter, 6        ;ограничение в 6 цифр

            jl          more              ;можно читать ещё

q:          call  putDec     

            mov         eax, number       ;сформированное десятичное число

            ret

readhex endp

;основная рабочая процедура. считывает два числа,

;производит их суммирование  

working     proc NEAR

            ;получим нужные хэндлы

            call  getHandles

            ;позицию текста

            mov         CRD.X,      0

            mov         CRD.Y,      1

            push  CRD

            push  STDOUT

            call  SetConsoleCursorPosition@8

            ;приглашение к вводу

            push  0                            

            push  offset      lens       

            push  g1len                  

            push  offset      get1       

            push  STDOUT                       

            call  WriteConsoleA@20 

            ;новую позицию

            mov         CRD.X,      20

            push  CRD

            push  STDOUT

            call  SetConsoleCursorPosition@8

            ;обработка считывания первого числа

            call  readhex                       ;считать первое число

            push  number

            pop         num1                    ;сохранили число

            mov         esi,  ptr1

            mov         edi,  num1ptr

            mov         ecx,  counter

            rep         movsb                   ;сохранили строковое представление числа

            ;позицию текста

            mov         CRD.X,      0

            inc         CRD.Y

            push  CRD

            push  STDOUT

            call  SetConsoleCursorPosition@8

            ;приглашение к вводу

            push  0                            

            push  offset      lens       

            push  g2len                  

            push  offset      get2       

            push  STDOUT                       

            call  WriteConsoleA@20 

            ;позицию текста

            mov         CRD.X,20

            push  CRD

            push  STDOUT

            call  SetConsoleCursorPosition@8

            ;обработка считывания первого числа

            call  readhex                       ;считать второе число

            push  number

            pop         num2                    ;сохранили число

            mov         esi,  ptr1

            mov         edi,  num2ptr

            mov         ecx,  counter

            rep         movsb                   ;сохранили строковое представление числа

            ;позицию текста

            mov         CRD.X,      0

            add         CRD.Y,      2                 ;перешли на новую строку

            push  CRD

            push  STDOUT

            call  SetConsoleCursorPosition@8

            ;текстовая отбивка

            push  0                            

            push  offset      lens       

            push  sumlen                       

            push  offset      sump       

            push  STDOUT                       

            call  WriteConsoleA@20 

            ;просуммировали числа

            mov         eax,  num2

            add         eax,  num1

            mov         number,     eax

            mov         nsum, eax

            call  putDec

            call  putHex

            mov         esi,  ptr1

            mov         edi,  sumptr

            mov         ecx,  10

            rep         movsb                   ;сохранили строковое представление числа

            mov         CRD.X,0

            inc         CRD.Y                   ;перешли на новую строку