Системное программное обеспечение. Особенности программирования 32-разрядных процессоров. Рощин А.В. - 65 стр.

UptoLike

Составители: 

65
mov DS,DI
cld
; Настроить пару ES:DI для прямого вывода в видеопамять
push AX
; Загрузить адрес сегмента видеоданных в ES
mov AX,0B800h
mov ES,AX
; Умножить номер строки на длину строки в байтах
mov AX,[ScreenString]
mov DX,160
mul DX
; Прибавить номер колонки (дважды)
add AX,[ScreenColumn]
add AX,[ScreenColumn]
; Переписать результат в индексный регистр
mov DI,AX
pop AX
mov AH,[TextColorAndBackground]
stosw
; Подготовка для вывода следующих байтов
; Перевести текущую позицию на 2 символа влево
inc [ScreenColumn]
; Проверить пересечение правой границы экрана
cmp [ScreenColumn],80
jb @@End
; Если достигнута правая граница экрана -
; перейти на следующую строку
sub [ScreenColumn],80
inc [ScreenString]
@@End: pop ES
pop DS
popa
ret
ENDP ShowASCIIChar
;*******************************************************
;* ПЕРЕВОД ЧИСЛА ИЗ ШЕСТНАДЦАТЕРИЧНОГО КОДА В ДВОИЧНЫЙ *
;* DS:SI - число в коде ASCII. *
;* Результат возвращается в EAX. *
;*******************************************************
PROC HexToBin32 near
push EBX
push CX
push SI
cld
xor EBX,EBX ;обнуляем накопитель
xor CX,CX ;обнуляем счетчик цифр
@@h0: lodsb
; Проверка на ноль (признак конца строки)
        mov     DS,DI
        cld
; Настроить пару ES:DI для прямого вывода в видеопамять
        push    AX
        ; Загрузить адрес сегмента видеоданных в ES
        mov     AX,0B800h
        mov     ES,AX
        ; Умножить номер строки на длину строки в байтах
        mov     AX,[ScreenString]
        mov     DX,160
        mul     DX
        ; Прибавить номер колонки (дважды)
        add     AX,[ScreenColumn]
        add     AX,[ScreenColumn]
        ; Переписать результат в индексный регистр
        mov     DI,AX
        pop     AX
        mov     AH,[TextColorAndBackground]
        stosw

; Подготовка для вывода следующих байтов
        ; Перевести текущую позицию на 2 символа влево
        inc     [ScreenColumn]
        ; Проверить пересечение правой границы экрана
        cmp     [ScreenColumn],80
        jb      @@End
        ; Если достигнута правая граница экрана -
        ; перейти на следующую строку
        sub     [ScreenColumn],80
        inc     [ScreenString]
@@End: pop      ES
        pop     DS
        popa
        ret
ENDP ShowASCIIChar


;*******************************************************
;* ПЕРЕВОД ЧИСЛА ИЗ ШЕСТНАДЦАТЕРИЧНОГО КОДА В ДВОИЧНЫЙ *
;* DS:SI - число в коде ASCII.                         *
;* Результат возвращается в EAX.                       *
;*******************************************************
PROC HexToBin32 near
        push    EBX
        push    CX
        push    SI
        cld
        xor     EBX,EBX ;обнуляем накопитель
        xor     CX,CX   ;обнуляем счетчик цифр
@@h0:   lodsb
        ; Проверка на ноль (признак конца строки)


                            65