
Шустрый

Профиль
Группа: Участник
Сообщений: 100
Регистрация: 22.11.2004
Где: Нижний Новгород
Репутация: нет Всего: нет
|
Здравствуйте ! Привожу полностью рабочий пример программы ориентированный на операционную систему MS DOS, которая просматривает сектора "Ведущего" жесткого диска подключонного к каналу 1 в режиме LBA. Код основной программы: | Код | ; Просмотр секторов "ведущего" жесткого диска ; канала 1 в режиме LBA ;
IDEAL P386 LOCALS MODEL MEDIUM
; Подключить файл мнемонических обозначений ; кодов управляющих клавиш include "lst_2_03.inc" ; Подключить файл мнемонических обозначений цветов include "lst_2_05.inc"
DATASEG ; Текстовые сообщения Txt1 DB LIGHTCYAN,0,16,"Просмотр секторов " DB "жесткого диска в ASCII-кодах",0 DB LIGHTGREEN,5,8,"Сектор N :",0 DB LIGHTCYAN,17,8,"Управляющие клавиши:",0 DB YELLOW,24,27,"Нажмите управляющую клавишу",0 Txt2 DB 19,8,"Стрелка вниз - следующий сектор;",0 DB 20,8,"Стрелка вверх - предыдущий сектор;",0 DB 21,8,"Esc - выход.",0 Err1 DB LIGHTRED,12,21 DB "Master-диск на канале 1 не обнаружен.",0 Err2 DB LIGHTRED,12,24 DB "Диск не поддерживает режим LBA.",0 PBut DB YELLOW,24,29,"Нажмите любую клавишу",0 ENDS
SEGMENT sseg para stack 'STACK' DB 400h DUP(?) ENDS
CODESEG ;***************************** ;* Основной модуль программы * ;***************************** PROC ShowHDDSector mov AX,DGROUP mov DS,AX ; Установить текстовый режим и очистить экран mov AX,3 int 10h ; Скрыть курсор - убрать за нижнюю границу экрана mov [ScreenString],25 mov [ScreenColumn],0 call SetCursorPosition ; Опросить Master-диск канала 1 mov [ChannelNumber],1 mov [HDDNumber],0 call ReadHDD_ID ; Диск подключен? cmp [HDDErrorCode],0 jne @@DiskNotFound ; Режим LBA поддерживается? cmp [dword ptr SectorDataBuffer+60*2],0 je @@LBANotSupported
; Вывести текстовые сообщения на экран mov CX,4 mov SI,offset Txt1 @@Txt1: call ShowColorString loop @@Txt1 ; Установить зеленый цвет и черный фон mov [TextColorAndBackground],LIGHTGREEN mov SI,offset Txt2 call ShowString call ShowString call ShowString
; Инициализируем переменные mov [HDDNumber],0 mov [dword ptr SectorAddress],0 mov AX,0B800h mov ES,AX ; ВНЕШНИЙ ЦИКЛ @@ReadSector: mov [ScreenString],5 mov [ScreenColumn],17 mov EAX,[SectorAddress] call ShowHexDword call ReadHDDSector mov DI,7*160+8*2 mov SI,offset SectorDataBuffer ; Задать для символов светло-голубой ; цвет и синий фон mov AH,LIGHTCYAN+BLUE*16 mov DX,8 ;счетчик строк @@OutNextString: mov CX,64 ;счетчик символов в строке @@OutNextChar: lodsb stosw loop @@OutNextChar add DI,16*2 dec DX jnz @@OutNextString
@@GetCommand: ; Ожидаем ввода следующей команды call GetChar cmp AL,0 je @@TestCommandByte call Beep jmp short @@GetCommand
@@TestCommandByte: cmp AH,B_Esc ;"Выход" je @@End @@TestDn: cmp AH,B_DN ;"Стрелка вниз" jne @@TestUp ; Увеличить на 1 номер сектора inc [dword ptr SectorAddress] jmp @@ReadSector @@TestUp: cmp AH,B_UP ;"Стрелка вверх" jne @@CommandError cmp [dword ptr SectorAddress],0 je @@CommandError ; Уменьшить на 1 номер сектора dec [dword ptr SectorAddress] jmp @@ReadSector @@CommandError: call Beep jmp @@GetCommand
; Обработка ошибок @@DiskNotFound: ; Сообщение "Диск не найден" mov SI,offset Err1 call ShowColorString mov SI,offset PBut call ShowColorString call GetChar jmp short @@End @@LBANotSupported: ; Сообщение "Диск не поддерживает LBA" mov SI,offset Err2 call ShowColorString mov SI,offset PBut call ShowColorString call GetChar
; Завершение работы программы @@End: ; Переустановить текстовый режим (очистить экран) mov ax,3 int 10h ; Выход в DOS mov AH,4Ch int 21h ENDP ShowHDDSector ENDS
; Подключить процедуры вывода данных на экран include "lst_2_02.inc" ; Подключить процедуру непосредственного считывания ; сектора с жесткого диска include "lst_7_07.inc"
END
|
Код включаемого файла "lst_2_03.inc": | Код | ; Мнемонические обозначения кодов управляющих клавиш ; ; Для клавиш, традиционно выполняющих определенные ; функции, приведены краткие комментарии справа.
; Для "текстовых" управляющих клавиш вместо скан-кодов ; используются ASCII-коды: B_RUBOUT equ 8 ;забой B_TAB equ 9 ;табуляция B_LF equ 10 ;перевод строки B_ENTER equ 13 ;возврат каретки B_ESC equ 27 ;"Esc"
; Скан-коды функциональных клавиш: F1 equ 59 ;вызов подсказки на экран F2 equ 60 F3 equ 61 F4 equ 62 F5 equ 63 F6 equ 64 F7 equ 65 F8 equ 66 F9 equ 67 F10 equ 68 ;выход из программы
; Скан-коды клавиш дополнительной клавиатуры: B_HOME equ 71 ;перейти в начало B_UP equ 72 ;стрелка вверх B_PGUP equ 73 ;на страницу вверх B_BS equ 75 ;стрелка влево B_FWD equ 77 ;стрелка вправо B_END equ 79 ;перейти в конец B_DN equ 80 ;стрелка вниз B_PGDN equ 81 ;на страницу вниз B_INS equ 82 ;переключить режим (вставка/замещение) B_DEL equ 83 ;удалить символ над курсором ; Скан-коды часто используемых комбинаций клавиш: ALT_F1 equ 104 ALT_F2 equ 105 CTRL_C equ 3 CTRL_BS equ 115 CTRL_FWD equ 116 CTRL_END equ 117 CTRL_PGDN equ 118 CTRL_HOME equ 119 CTRL_PGUP equ 122
|
Код включаемого файла "lst_2_05.inc": | Код | ; Мнемонические обозначения цветов для ; цветного текстового видеорежима
; "Темные" цвета (можно использовать для фона и текста) BLACK equ 0 ;черный BLUE equ 1 ;темно-синий GREEN equ 2 ;темно-зеленый CYAN equ 3 ;бирюзовый (циан) RED equ 4 ;темно-красный MAGENTA equ 5 ;темно-фиолетовый BROWN equ 6 ;коричневый LIGHTGREY equ 7 ;серый ; "Светлые" цвета (только для текста) DARKGREY equ 8 ;темно-серый LIGHTBLUE equ 9 ;синий LIGHTGREEN equ 10 ;зеленый LIGHTCYAN equ 11 ;голубой LIGHTRED equ 12 ;красный LIGHTMAGENTA equ 13 ;фиолетовый YELLOW equ 14 ;желтый WHITE equ 15 ;белый
|
Код включаемого файла "lst_2_02.inc": | Код | ; Процедуры ввода/вывода общего назначения ; для работы в цветном текстовом режиме
DATASEG ; Цвет и фон выводимого текста (по умолчанию установим ; вывод белого текста по черному фону) TextColorAndBackground DB 0Fh ; Начальная позиция для вывода текстовой строки на экран ScreenString DW ? ScreenColumn DW ? ENDS
CODESEG ;******************************************************* ;* ВЫВОД БАЙТА НА ЭКРАН В ШЕСТНАДЦАТЕРИЧНОМ КОДЕ * ;* Подпрограмма выводит содержимое регистра AL * ;* в шестнадцатеричном коде в заданную позицию экрана. * ;* Координаты позиции передаются через глобальные * ;* переменные ScreenString и ScreenColumn. После * ;* выполнения операции вывода происходит автомати- * ;* ческое приращение значений этих переменных. * ;******************************************************* PROC ShowByteHexCode near pusha push DS push ES ; Настроить DS на глобальный сегмент данных mov DI,DGROUP 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] ; Вывести старший разряд числа push AX ; Выделить старший разряд shr AL,4 ; Преобразовать старший разряд в код ASCII add AL,'0' cmp AL,'9' jbe @@M0 add AL,'A'-'9'- 1 ; Вывести разряд числа на экран @@M0: stosw pop AX ; Вывести младший разряд числа ; Выделить младший разряд числа and AL,0FH ; Преобразовать младший разряд в код ASCII add AL,'0' cmp AL,'9' jbe @@M1 add AL,'A'-'9'- 1 ; Вывести разряд числа на экран @@M1: stosw
; Подготовка для вывода следующих байтов ; Перевести текущую позицию на 2 символа влево add [ScreenColumn],2 ; Проверить пересечение правой границы экрана cmp [ScreenColumn],80 jb @@End ; Если достигнута правая граница экрана - ; перейти на следующую строку sub [ScreenColumn],80 inc [ScreenString] @@End: pop ES pop DS popa ret ENDP ShowByteHexCode
;***************************************************** ;* ВЫВОД 16-РАЗРЯДНОГО СЛОВА НА ЭКРАН * ;* В ШЕСТНАДЦАТЕРИЧНОМ КОДЕ * ;* Параметры: * ;* AX - число, которое будет выведено на экран. * ;* Номер строки передается через глобальную * ;* переменную ScreenString, номер столбца - через * ;* переменную ScreenColumn, цвет текста определяется * ;* глобальной переменой TextColorAndBackground. * ;***************************************************** PROC ShowHexWord NEAR xchg AL,AH call ShowByteHexCode xchg AL,AH call ShowByteHexCode ret ENDP ShowHexWord
;***************************************************** ;* ВЫВОД 32-РАЗРЯДНОГО СЛОВА НА ЭКРАН * ;* В ШЕСТНАДЦАТЕРИЧНОМ КОДЕ * ;* Параметры: * ;* EAX - число, которое будет выведено на экран. * ;* Номер строки передается через глобальную * ;* переменную ScreenString, номер столбца - через * ;* переменную ScreenColumn, цвет текста определяется * ;* глобальной переменой TextColorAndBackground. * ;***************************************************** PROC ShowHexDWord NEAR rol EAX,8 call ShowByteHexCode rol EAX,8 call ShowByteHexCode rol EAX,8 call ShowByteHexCode rol EAX,8 call ShowByteHexCode ret ENDP ShowHexDWord
;************************************************** ;* ВЫВОД БАЙТА НА ЭКРАН В ДВОИЧНОМ КОДЕ * ;* Подпрограмма выводит содержимое регистра AL * ;* в двоичном коде в указанную позицию экрана. * ;* Координаты позиции передаются через глобальные * ;* переменные ScreenString и ScreenColumn. После * ;* выполнения операции вывода происходит автома- * ;* тическое приращение значений этих переменных. * ;************************************************** PROC ShowByteBinCode near pusha push DS push ES ; Копируем отображаемый байт в BL mov BL,AL mov AX,DGROUP mov DS,AX cld ; Загрузить адрес "текстовой" видеопамяти в ES mov AX,0B800h mov ES,AX ; Умножить номер строки на длину строки в байтах mov AX,[ScreenString] mov DX,160 mul DX ; Прибавить дважды номер колонки add AX,[ScreenColumn] add AX,[ScreenColumn] ; Переписать результат в индексный регистр mov DI,AX
; Отобразить разряды числа (начиная со старшего) mov AH,[TextColorAndBackground] mov CX,8 ;счетчик разрядов @@L0: mov AL,'0' ; Выделить очередной разряд числа rol BL,1 jnc @@L1 mov AL,'1' ; Вывести разряд числа на экран @@L1: stosw loop @@L0
; Подготовка для вывода следующих байтов ; Перевести текущую позицию на 8 символов влево add [ScreenColumn],8 ; Проверить пересечение правой границы экрана cmp [ScreenColumn],80 jb @@End ; Если достигнута правая граница экрана - ; перейти на следующую строку sub [ScreenColumn],80 inc [ScreenString] ; Конец подпрограммы @@End: pop ES pop DS popa ret ENDP ShowByteBinCode
;****************************************************** ;* ВЫВОД 16-РАЗРЯДНОГО СЛОВА НА ЭКРАН В ДВОИЧНОМ КОДЕ * ;* Параметры: * ;* AX - число, которое будет выведено на экран. * ;* Номер строки передается через глобальную * ;* переменную ScreenString, номер столбца - через * ;* переменную ScreenColumn, цвет текста определяется * ;* глобальной переменой TextColorAndBackground. * ;****************************************************** PROC ShowBinWord NEAR rol AX,8 call ShowByteBinCode inc [ScreenColumn] rol AX,8 call ShowByteBinCode ret ENDP ShowBinWord
;****************************************************** ;* ВЫВОД 32-РАЗРЯДНОГО СЛОВА НА ЭКРАН В ДВОИЧНОМ КОДЕ * ;* Параметры: * ;* EAX - число, которое будет выведено на экран. * ;* Номер строки передается через глобальную * ;* переменную ScreenString, номер столбца - через * ;* переменную ScreenColumn, цвет текста определяется * ;* глобальной переменой TextColorAndBackground. * ;****************************************************** PROC ShowBinDWord NEAR rol EAX,8 call ShowByteBinCode inc [ScreenColumn] rol EAX,8 call ShowByteBinCode inc [ScreenColumn] rol EAX,8 call ShowByteBinCode inc [ScreenColumn] rol EAX,8 call ShowByteBinCode ret ENDP ShowBinDWord
;**************************************************** ;* ВЫВОД ТЕКСТОВОЙ СТРОКИ НА ЭКРАН * ;* Все параметры передаются через одну структуру: * ;* первый байт - номер начальной строки (0-24); * ;* второй байт - номер начальной колонки (0-79); * ;* далее идет строка, ограниченная нулем. * ;* Адрес структуры передается через регистры DS:SI. * ;**************************************************** PROC ShowString near push AX push BX push DI push ES ; Настраить регистр ES на глобальный сегмент данных mov AX,DGROUP mov ES,AX ; Запоминить цвет текста в BL mov BL,[ES:TextColorAndBackground] ; Настраить регистр ES на видеопамять mov AX,0B800h mov ES,AX cld ; Вычислить адрес для строки в видеопамяти ; Загрузить номер строки экрана в AL и ; умножить его на длину строки в байтах lodsb ; Проверка: номер строки не должен превышать ; предел нижней границы экрана cmp AL,24 ja @@Error mov AH,160 mul AH ; Переписать результат в индексный регистр DI mov DI,AX ; Загрузить номер столбца и дважды ; прибавить его к DI lodsb cmp AL,79 ;номер колонки не должен ja @@Error ;превышить ширины экрана mov BH,AL ;запомнить номер колонки xor AH,AH ;обнулить AH add DI,AX add DI,AX ; Загрузить атрибут цвета в AH mov AH,BL @@L1: ; Загрузить очередной символ строки в AL lodsb ; Проверка на 0 (на конец строки) and AL,AL jz @@L2 ; Проверить номер колонки символа cmp BH,79 ja @@Error ;нарушена правая граница экрана ; Вывести символ на экран stosw inc BH ;увеличить номер колонки jmp @@L1 @@L2: pop ES pop DI pop BX pop AX ret @@Error: ;Немедленный выход в DOS по ошибке mov AH,4Ch int 21h ENDP ShowString
;***************************************************** ;* ВЫВОД ТЕКСТОВОЙ СТРОКИ ЗАДАННОГО ЦВЕТА НА ЭКРАН * ;* Все параметры передаются через одну структуру: * ;* первый байт - атрибут цвета и фона для строки; * ;* второй байт - номер начальной строкиа (0-24); * ;* третий байт - номер начальной колонки (0-79); * ;* далее идет строка, ограниченная нулем. * ;* Адрес структуры передается через регистры DS:SI. * ;***************************************************** PROC ShowColorString near push AX ; Запомнить цвет, используемый по умолчанию mov AL,[TextColorAndBackground] push AX ; Установить цвет строки cld lodsb mov [TextColorAndBackground],AL ; Использовать функцию ShowString call ShowString ; Восстановить цвет, используемый по умолчанию pop AX mov [TextColorAndBackground],AL pop AX ret ENDP ShowColorString
;******************************** ;* УСТАНОВИТЬ ПОЗИЦИЮ КУРСОРА * ;* Входные параметры: * ;* ScreenString - номер строки * ;* ScreenColumn - номер столбца * ;******************************** PROC SetCursorPosition NEAR pusha ; Вычисление линейного адреса курсора mov AX,[ScreenString] mov BX,80 mul BX add AX,[ScreenColumn] mov BL,AL ;запомнить младший байт ; Прямой вывод позиции курсора ; в регистры видеоконтроллера mov DX,3D4h ; Вывести старший байт адреса курсора mov AL,0Eh out DX,AX ; Вывести младший байт адреса курсора inc AL mov AH,BL out DX,AX popa ret ENDP SetCursorPosition
;********************************************* ;* ПРИНЯТЬ СИМВОЛ ОТ КЛАВИАТУРЫ * ;* Процедура осуществляет ввод символа с * ;* помощью функции 00h прерывания Int16h. * ;* Для "текстовых" управляющих клавиш вместо * ;* скан-кодов используются ASCII-коды. * ;* Входных параметров нет. * ;* Функция возвращает: * ;* AL - код символа; * ;* AH - управляющий код, если в AL ноль. * ;********************************************* PROC GetChar NEAR mov AX,0 int 16h and AL,AL jnz @@Get1 ret ;(в AL - ноль, в AH - управляющий код) @@Get1: cmp AL,32 jnb @@Get2 ; Переписать в AH управляющий код xchg AL,AH mov AL,0 ret ;(в AL - ноль, в AH - управляющий код) @@Get2: mov AH,0 ret ;(в AL - код буквы, в AH - ноль) ENDP GetChar
;************************************************ ;* ПРИНЯТЬ СИМВОЛ ОТ КЛАВИАТУРЫ, * ;* ЕСЛИ ОН ЕСТЬ В БУФЕРЕ * ;* Процедура проверяет наличие символа в буфере * ;* клавиатуры и считывает его, если он есть. * ;* Входных параметров нет. * ;* Функция возвращает: * ;* AL - код символа; * ;* AH - управляющий код, если в AL ноль. * ;* Если в AL и AH нули - нажатий не было. * ;************************************************ PROC WaitChar NEAR ; Проверить наличие символа в буфере клавиатуры mov AH,1 int 16h jz @@NoInput ; Принять символ от клавиатуры mov AX,0 int 16h and AL,AL jnz @@GET1 ret ;в AL - ноль, в AH - управляющий код @@GET1: cmp AL,32 jnb @@GET2 mov AH,AL ;переписать в AH управляющий код mov AL,0 ret ;в AL - ноль, в AH - управляющий код @@GET2: mov AH,0 ret ;в AL - код буквы, в AH - ноль @@NoInput: xor AX,AX ret ;в AL и AH - нули ENDP WaitChar
;************************************* ;* ОЧИСТКА ЭКРАНА В ТЕКСТОВОМ РЕЖИМЕ * ;* (процедура параметров не имеет) * ;************************************* PROC ClearScreen NEAR pusha push ES ; Настроить ES:DI на "текстовую" область видеопамяти mov AX,0B800h mov ES,AX cld mov DI,0 ; Вывести 2000 "пустых" символов (ASCII-код 0) с ; атрибутом "белый цвет, черный фон" mov CX,2000 mov AX,0F00H rep stosw pop ES popa ret ENDP ClearScreen
;***************************************************** ;* ПОДАЧА ЗВУКОВОГО СИГНАЛА ЧЕРЕЗ ВСТРОЕННЫЙ ДИНАМИК * ;* &n
|
|
|
|
| Правила форума "Asm для Windows/DOS" |

|
- Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
- Не забывайте пользоваться кнопкой КОД.
- Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
- Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
- Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.
|
|
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
|
|
0 Пользователей:
|
|
« Предыдущая тема | Asm для Windows/Dos | Следующая тема »
|
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности
Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |
|
|