Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение секторов HDD! 
:(
    Опции темы
TDil
Дата 15.3.2005, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 15.3.2005

Репутация: нет
Всего: нет



Как считывать сектора Lba HDD, под Windows или под DOS, что по легче!
заранее спасибо.

PM MAIL   Вверх
TDil
Дата 16.3.2005, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 15.3.2005

Репутация: нет
Всего: нет



никто не знает значение этих констант
VWIN32_DIOC_DOS_INT25 и VWIN32_DIOC_DOS_DRIVEINFO
использеумых в DeviceIoControl
Добавлено @ 07:54
никто не знает значение этих констант
VWIN32_DIOC_DOS_INT25 и VWIN32_DIOC_DOS_DRIVEINFO
использеумых в DeviceIoControl
PM MAIL   Вверх
Akina
Дата 16.3.2005, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 1
Всего: 454



MSDN - WIndows Development - Development Guides - Windows 95/98/Me Programming - SDK Documentation - About Device I/O Control - Using VWIN32 to Carry Out MS-DOS Functions


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Chingachguk
Дата 16.3.2005, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: 3
Всего: 18



VWIN32_DIOC_DOS_INT25 EQU 2
VWIN32_DIOC_DOS_DRIVEINFO equ 6

Взял из файлов VWIN32.INC и WIN32API.INC (попробуй посмотреть эти файлы на wasm.ru)

Да еще я сомневаюсь, что ты прочтешь через winapi что-то кроме секторов логического раздела. Лучше int 13h.


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
TDil
Дата 16.3.2005, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 15.3.2005

Репутация: нет
Всего: нет



Вот это прога не работает (flat assembler)

File_ db 'sectors.dat',0
FileName db '\\.\vwin32',0
Bts_: rb 65536
nb dd 0
hDevice dd 0
Regs:
REAX dd 0
RECX dd 0
REDX dd 0
REBX dd 0
RESP dd 0
REBP dd 0
RESI dd 0
REDI dd 0

VWIN32_DIOC_DOS_INT25=6 ;пробовал и 2

Main:
invoke CreateFile,FileName,GENERIC_READ,0,0,0,\
FILE_FLAG_DELETE_ON_CLOSE,0
mov [hDevice],eax
mov [REAX],3
mov [REBX],Bts_
mov [RECX],16
mov [REDX],1
invoke DeviceIoControl,[hDevice],VWIN32_DIOC_DOS_INT25,\
Regs,8*4,Regs,8*4,nb,0
invoke CloseHandle,[hDevice]

invoke _lcreat,File_,0
mov [hDevice],eax
invoke _lwrite,[hDevice],Bts_,65536
invoke _lclose,[hDevice]
invoke ExitProcess,0


Конечно Int13 лучше, smile
но вот через Int13 как можно читать большые диски?

Добавлено @ 10:52
Вот это прога не работает (flat assembler)

Код

File_    db    'sectors.dat',0
FileName db    '\\.\vwin32',0
Bts_:    rb    65536
nb    dd    0
hDevice    dd    0
Regs:
REAX    dd    0
RECX    dd    0
REDX    dd    0
REBX    dd    0
RESP    dd    0
REBP    dd    0
RESI    dd    0
REDI    dd    0

VWIN32_DIOC_DOS_INT25=6   ;пробовал и 2

Main:    
    invoke        CreateFile,FileName,GENERIC_READ,0,0,0,\
                            FILE_FLAG_DELETE_ON_CLOSE,0
    mov           [hDevice],eax
    mov           [REAX],3
    mov           [REBX],Bts_
    mov           [RECX],16
    mov           [REDX],1
    invoke        DeviceIoControl,[hDevice],VWIN32_DIOC_DOS_INT25,\
                           Regs,8*4,Regs,8*4,nb,0
    invoke        CloseHandle,[hDevice]
    
    invoke       _lcreat,File_,0
    mov           [hDevice],eax
    invoke       _lwrite,[hDevice],Bts_,65536
    invoke       _lclose,[hDevice]
    invoke       ExitProcess,0


Конечно Int13 лучше, smile
но вот через Int13 как можно читать большые диски?

PM MAIL   Вверх
TDil
Дата 16.3.2005, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 15.3.2005

Репутация: нет
Всего: нет



Все, нашел, все Ok,

Код

    mov    [diStartSector],1 ;Нач сектор
.Next:
    invoke    CreateFile,FileName,GENERIC_READ,0,0,0,\
                    FILE_FLAG_DELETE_ON_CLOSE,0
    mov    [hDevice],eax
    mov    [diSectors],128     ;число секторов
    mov    [diBuffer],Bts_       ;буффер
    mov    [REAX],7305h
    mov    [REBX],d_str
    mov    [RECX],-1
    mov    [REDX],6          ;диск
    mov    [Flags],1
    invoke    DeviceIoControl,[hDevice],VWIN32_DIOC_DOS_DRIVEINFO,\
                      Regs,7*4,Regs,7*4,nb,0
    invoke    CloseHandle,[hDevice]

Добавлено @ 12:25
и еше вот это:
Код

Regs:
REBX    dd    0
REDX    dd    0
RECX    dd    0
REAX    dd    0
REDI    dd    0
RESI    dd    0
Flags    dd    0

d_str:    
diStartSector    dd    0
diSectors    dw    0
diBuffer    dd    0

PM MAIL   Вверх
Sl@va
Дата 18.4.2005, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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
PM MAIL WWW ICQ Skype   Вверх
Romikgy
Дата 15.8.2005, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: нет
Всего: 146



А можно ли как то прочитать бед сектор????


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Akina
Дата 15.8.2005, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 1
Всего: 454



Цитата(Romikgy @ 15.8.2005, 10:47)
можно ли как то прочитать бед сектор????

Используя RAW Read - все что читается, прочтется, слабые биты будут плавать вероятностно, битые - статистически.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для Windows/DOS"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для Windows/Dos | Следующая тема »


 




[ Время генерации скрипта: 0.0671 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.