Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
Roman legionnaire vs Knight Artorias
Ghost-Skeleton in DSR
Expedition SCP-432-4
Expedition SCP-432-3 DATA EXPUNGED

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Различные авторы Весь текст 2311.07 Kb

Программирование и кодирование

Предыдущая страница Следующая страница
1 ... 185 186 187 188 189 190 191  192 193 194 195 196 197 198
         ;
         ; Основной цикл деления - получить десятичный разряд.
         ; Повторять, пока остаются разряды.
         more_dec:
                  xor     dx,dx                ; очистить
                  div     bx                   ; разделить на 10
                  push    dx                   ; сохранить остаток
                  inc     cl          ; добавить к значению счетчика
                                      ; разрядов единицу
                  or      ax,ax       ; проверить  частное
                  jnz     more_dec    ; продолжить, если больше
         ;
         ; Основной цикл печати разрядов - обратный порядок.
                  sub     ch,cl       ; минимальное число разрядов
                                      ; получено?
                  jle     morechr     ; да, начать отображение
                  xor     dx,dx       ; нет, начать вставлять "нули"
         morezero:
                  push    dx
                  inc     cl          ; добавить к значению счетчика
                                      ; разрядов единицу
                  dec     ch          ; проверить на совпадение
                  jnz     morezero    ; нет - продолжать вставку
         morechr:
                  pop     dx          ; восстановить последний разряд
                  add     dl,30h      ; преобразовать в код ASCII

                                      - П-31 -
                  @DisChr dl          ; разряд результата
                  dec     cl          ; вычесть из счетчика разрядов
                                      ; единицу
                  jnz     morechr     ; продолжить,  если больше
         ;
                  pop     dx    ; восстановить содержимое регистров
                  pop     cx
                  pop     bx
                  pop     ax
                  ret

         ;
         bin2dec  ENDP
         ;
         ;
         ;+++++++++++++++++++++++++++++++++++++++++++++++++++
         ; BIN2DEC2 - Преобразование из двоичной в десятичную систе-
         ;   му  счисления;  отображает  32-разрядное число. Создает
         ;   два десятичных числа, которые отображаются через  обра-
         ;   щения к BIN2DEC.
         ;       Может быть указано минимальное число разрядов, под-
         ;   лежащих  отображению.  Если минимальное количество ука-
         ;   занных разрядов больше фактического числа разрядов, вы-
         ;   ходное число дополняется начальными нулями.
         ;       Примечание:  сдвоенных регистров, содержащих число,
         ;   разбивается в лучшем случае, наименьшая значащая  часть
         ;   числа составляет 9.999. Оно никогда не будет отображено
         ;   как отрицательное число.
         ;
         ; Вход :   DX: AX = число, подлежащее отображению
         ;          CH = минимальное число разрядов, подлежащих
         ;                отображению
         ;
         ; Выход : (регистры AX : DX восстанавливаются)
         ;
         ; Вызываемые стандартные программы: BIN2DEC (вывод
         ;            16-разрядного числа в десятичном виде)
         ;- - - - - - - - - - - - - - - - - - - - - - - - - - - -
         PUBLIC  BIN2DEC2    ; библиотечная стандартная  программа
         ;
         bin2dec2 PROC    NEAR
         ;EXTRN  bin2dec2:NEAR   ; ссылка на стандартную программу
                                 ; BIN2DEC
                  push    ax     ; сохранить содержимое регистров
                  push    bx
                  push    cx
                  push    dx
         ;
         ;   Проверить на отрицательное число.  Если  отрицательное,
         ; сделать положительным.
                  or      dx,dx       ; число положительное ?
                  jnl     bd2_pos  ; да, игнорировать "отрицательное"
                  not     ax          ; сделать число положительным
                  not     dx
                  add     ax,1        ; (точное) дополнение в двоич-
                                      ; ной системе счисления (допол-
                                      ; нительный код), реализуемое

                                      - П-32 -
                                      ; аппаратным способом
                  adc     dx,0
                  push    dx
                  push    ax
                  @DisChr '-'
                  pop     ax
                  pop     dx
         ;
         ; Теперь разбить число, подлежащее распечатке, на две
         ; управляемые части.
         bd2_pos:
                  mov     bx,10000    ; установить делитель = 10000
                  div     bx          ; разбить число  на пары
                  cmp     dx,0        ; отбросить, если наибольшее
                  je      bd2_2big    ; значащее число слишком велико
                  or      ax,ax       ; выяснить, равно ли "0"
                                      ; наибольшее значащее число
                  jz      bd2_nosig   ; нет наибольшего значащего
                                      ; числа
         ;
         ;  Печать первого наибольшего значащего числа (старшая
         ;  часть числа).
               push    dx
               sub     ch,4        ; четыре разряда будут распе-
                                   ; чатаны из наименьшей значащей
                                   ; части  числа
               jnc     bd2_cntok   ; запросить больше 4 для того,
                                   ; чтобы значение счетчика стало
                                   ; действительным
               mov     ch,0        ; в противном  случае, опрос идет
                              ; до тех пор, пока не кончатся разряды
         bd2_cntok:

                  call    bin2dec     ; печатать наибольшую значащую
                                      ; часть числа
                  pop     dx          ; восстановить наименьшую
                                      ; значащую часть числа
                  mov     ch,4        ; четыре разряда в наименьшей
                                      ; значащей части числа
         ;
         ; Печатать наименьшую значащую часть числа (младшую часть
         ; числа).
         bd2_nosig:
                  mov     ax,dx       ; печатать сначала содержимое
                                      ; регистра DX (наименьшую зна-
                                      ; чащую  часть числа)
                  call    bin2dec     ; печатать наименьшую значащую
                                      ; часть числа
         bd2_done:
                  pop     dx          ; восстановить содержимое регист-
                                      ; ров и выйти из программы
                  pop     cx
                  pop     bx
                  pop     ax
                  ret
         bd2_2big:
                  @DisStr  Bin2BigErrMsg

                                      - П-33 -
                  jmp     short bd2_done   ; возвратиться из стан-
                                           ; дартной программы
         ;
         _TEXT    ENDS
         _DATA    SEGMENT
         Bin2BigErrMsg db "BIN2DEC2 error: Oшибка: число слишком
                                           велико.$"
         _DATA    ENDS
         _TEXT    SEGMENT
         ;
         bin2dec2 ENDP
         ;
         ;
         ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++
         ; BIN2HEX  -  Преобразование из двоичной в  шестнадцатирич-
         ; ную  систему  счисления;  отображает 16-разрядное число в
         ; шестнадцатиричном виде.
         ;       Может быть указано минимальное количество разрядов,
         ; подлежащих отображению : если минимальное число указанных
         ; разрядов  больше фактического количества разрядов, выход-
         ; ное число дополняется значащими нулями.
         ;
         ; Вход :   AX = число, подлежащее отображению
         ;          CH = минимальное число разрядов, подлежащих
         ;               отображению (от 1 до  4).
         ;               Если CH=0, то значение счетчика разря-
         ;               дов по умолчанию принимается равным 4)
         ;
         ; Выход : нет (регистры AX и CX восстанавливаются)
         ;
         ; Вызываемые стандартные программы: нет
         ;- - - - - - - - - - - - - - - - - - - - - - - - - - - -
         PUBLIC BIN2HEX    ; библиотечная стандартная программа
         ;
         bin2hex  PROC     NEAR
                  push     ax   ; сохранить содержимое регистров
                  push     bx
                  push     cx
                  push     dx
         ;
             mov      bx,ax        ; использовать регистр BX для
                                   ; временного хранения
             cmp      ch,0         ; счетчик уже установлен?
             jne      align_left   ; да, тогда продолжать
             mov      ch,4         ; иначе, установить значение
                                   ; счетчика символов, равным 4
         ;
         ; Выровнять число по левому краю регистра AX (циклически
         ; сдвигать влево на (4 - CH) х 4 битовые позиции
         allign_left:
               mov      cl,4   ; определить число сдвигаемых цифр
               sub      cl,ch
               shl      cl,1   ; умножить на 4
               shl      cl,1
               rol      bx,cl        ; выравнивание влево
               mov      cl,4         ; и установить наименьшее
                        ; значение счетчика циклического сдвига

                                      - П-34 -
         ;
         ; Основной  цикл повторить  N раз. Печатать старший разряд.
         more_hex:
                  rol      bx,cl        ; переместить на один разряд
                                        ; вправо
                  mov      al,bl        ; переслать в регистр AL
                  and      al,0Fh       ; только младший разряд
                  add      al,90h       ; скрытое преобразование в
                  daa                   ; шестнадцатиричные символы
                                        ; в коде ASCII
                  adc      al,40h
                  daa
         ;
         ; Отобразить разряд
                  @DisChr  al
                  dec      ch       ; вычесть из счетчика разрядов
                                    ; единицу
                  jnz      more_hex ; продолжить, если больше
         ;
                  pop      dx   ; восстановить содержимое регистров
                  pop      cx
                  pop      bx
                  pop      ax
                  ret
         ;
         bin2hex ENDP
         ;
         ;
         ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++
         ; CHGCASE   -    Изменить  регистр  клавиатуры для симво-
         ; лов. Меняет регистр символов в коде ASCII. Указывается
         ; тип преобразования регистра клавиатуры.
         ;
         ;  1. Принудительное изменение верхнего  регистра  клавиатуры
         ;     на нижний.
         ;  2. Принудительное изменение нижнего регистра клавиатуры на
         ;     верхний.
         ;  3. Изменить состояние регистра клавиатуры на противополож-
         ;     ное (если нижний, то верхний; если верхний, то нижний).
         ;
         ; Вход :   AL = буквенный символ в коде ASCII, подлежащий
         ;               преобразованию
         ;          AH = тип преобразования:
         ;               "L" или "l" = печать символа на нижнем
         ;                             регистре клавиатуры
         ;               "U" или "u" = печать символа на верхнем
         ;                             регистре клавиатуры
         ;               любое другое значение меняет состояние
         ;               регистра клавиатуры на противоположное
         ;
         ; Выход :  AL = преобразованный  символ в коде ASCII
Предыдущая страница Следующая страница
1 ... 185 186 187 188 189 190 191  192 193 194 195 196 197 198
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 

Реклама