Хостинг портала RFpro.ru: Московский хостер Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64 РАССЫЛКИ ПОРТАЛА RFPRO.RU Лучшие эксперты по данной тематике | Номер выпуска: | 1490 | | Дата выхода: | 18.11.2011, 12:30 | | Администратор рассылки: | Лысков Игорь Витальевич (Старший модератор) | | Подписчиков / экспертов: | 189 / 61 | | Вопросов / ответов: | 3 / 3 | Консультация # 184426: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:Создать файл, открыть его в режиме записи и попытаться считать первые 7 байт. Обработать ошибку при помощи INT 24h. Вывести на экран сообщение об ошибке. Ассемблер-Tasm.exe Исполняемый файл в формате EXE. Очень надеюсь, что вы мне поможете.... Консультация # 184429: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:помогите написать программу на ассемблере (TASM), которая должна суммировать однобайтовые числа из массива с начальным адресом MAS. Суммирование необходимо производить в ячейку памяти с адресом SUM до тех пор, пока накопленное значение SUM меньше или равно 200, после чего ре... Консультация # 184430: Здравствуйте! Прошу помощи в следующем вопросе: написать программу, которая определит метку тома дискеты. Если дискета не вставлена в дисковод, то обработать ошибку с помощью INT24h. Если дискета присутствует, то создать на ней файл с именем "Data_file" и записать в него имя метки. Желательны подробные построчные комментарии. Консультация # 184426: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:Создать файл, открыть его в режиме записи и попытаться считать первые 7 байт. Обработать ошибку при помощи INT 24h. Вывести на экран сообщение об ошибке. Ассемблер-Tasm.exe Исполняемый файл в формате EXE. Очень надеюсь, что вы мне поможете. Дата отправки: 12.11.2011, 17:26 Вопрос задал: Дмитрий (Посетитель) Всего ответов: 1 Страница онлайн-консультации » Консультирует Лысков Игорь Витальевич (Старший модератор): Здравствуйте, Дмитрий! Сначала создаем файл, затем закрываем, т.к. полученный доступ на чтение/запись нам не нужен. Открываем только на запись, и при чтении получаем ожидаемую "ошибку доступа"
Код : ;Создать файл, открыть его в режиме записи и попытаться считать первые 7 байт. ;Обработать ошибку при помощи INT 24h. Вывести на экран сообщение об ошибке. code segment 'code' ;начало сегмента кода assume cs:code,ds:data,ss:stk main proc mov ax, data ;адрес сегмента данных mov ds, ax ;в ds mov es, ax ;в es ;создадим файл lea dx, sName ;имя файла xor cx, cx ;без атрибутов mov ah, 3ch ;функция создания int 21h jc CreateErr ;есть ошибка ;файл создан на чтение/запись ;нам надо только на запись, поэтому ;сначала закроем, а потом откроем на запись mov bx, ax ;описатель файла (handle) mov ah, 3eh ;ф-я закрытия int 21h mov ax, 3d01h ;открываем на запись (al=1) int 21h jc OpenErr ;ошибка открытия mov bx, ax ;handle mov ah, 3fh ;читаем mov cx, 7 ;7 байт int 21h jc ReadErr ;всегда будет ошибка ax=5 - "ошибка достука" lea dx, sOk ;а вдруг проскочит jmp CloseFile CreateErr: ;Ошибка создания файла lea dx, sCreateErr jmp PrintMessage OpenErr: ;Ошибка открытия файла lea dx, sOpenErr jmp PrintMessage ReadErr: lea dx, sReadErr ;мы обязательно попадем на ошибку ax=5 ("Нет доступа") CloseFile: ;закрывам файл mov ah, 3eh int 21h PrintMessage: ;вывод сообщения из ds:[dx] mov ah, 9 int 21h PrintAny: lea dx, sAny ;press any key mov ah, 9 int 21h mov ah, 0 int 16h ;ждем any key mov ax, 4c00h int 21h ;выход в ДОС main endp code ends data segment ;имя файла sName db "test.txt",0 ;невозможно создать файл, например, путь не найден sCreateErr db "Create error",0dh,0ah,"$" ;невозможно открыть файл на запись sOpenErr db "Open error",0dh,0ah,"$" ;невозможно прочитать из файла (что хотели, то и получили) sReadErr db "Read error",0dh,0ah,"$" ;А вдруг файл прочитался... sOk db "The file was read",0dh,0ah,"$" ;чтобы окно сразу не закрывалось sAny db "Press any key$" data ends stk segment stack dw 100h dup (?) stk ends end main Консультация # 184429: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:помогите написать программу на ассемблере (TASM), которая должна суммировать однобайтовые числа из массива с начальным адресом MAS. Суммирование необходимо производить в ячейку памяти с адресом SUM до тех пор, пока накопленное значение SUM меньше или равно 200, после чего результат суммирования переслать в видеобуфер для отображения на мониторе. Программа должна состоять из сегментов данных, кода и стека. Пожалуйста, если возможно с построчными комментариями. Очень надеюсь на Вашу помощь.
Дата отправки: 12.11.2011, 20:22 Вопрос задал: Canijke Всего ответов: 1 Страница онлайн-консультации » Консультирует Лысков Игорь Витальевич (Старший модератор): Здравствуйте, Canijke! Программа складывает до тех пор, пока не получится сумма, максимально близкая к 200
Код : ;Программа суммирования однобайтовых чисел из массива с начальным адресом MAS. ;Суммирование необходимо производить в ячейку памяти с адресом SUM до тех пор, ;пока накопленное значение SUM меньше или равно 200, после чего результат ;суммирования переслать в видеобуфер для отображения на мониторе. ;Программа должна состоять из сегментов данных, кода и стека. code segment 'code' ;начало сегмента кода assume cs:code,ds:data,ss:stk main proc mov ax, data ;адрес сегмента данных mov ds, ax ;в ds mov ax, 0003h ;в ХР необходимо для прямой записи в память int 10h mov ax, 0b800h mov es, ax ;в es сегмент видеопамяти lea si, MAS ;адрес массива mov cx, lMAS ;длина массива mov SUM, 0 ;сумма SumLoop: mov al, SUM ;предыдущая сумма add al, [si] ;складываем с очередным inc si ;на следующий cmp al, 200 ;сравниваем с 200 ja OutSum ;если больше, то на вывод mov SUM, al ;сохраняем в переменной loop SumLoop ;повторяем OutSum: ;выводим сумму, ближайшую к 200 ;преобразуем число в строку mov al, SUM ;наша сумма xor cx, cx ;счетчик цифр mov bl, 10 ;будем делить на 10 DivLoop: mov ah, 0 ;подготавливаемся к делению ax:bl div bl ;ah-остаток, al-частное push ax ;сохраним остаток в стеке inc cx ;считаем cmp al, 0 ;делим, пока есть что делить jne DivLoop xor di, di ;выведем строку из цифр в начале экрана OutLoop: pop ax ;в ah очередная старшая цифра mov al, ah ;al = ah or al, '0' ;0-9 -> '0'-'9' mov ah, 07h ;атрибут (цвет) "белым по черному" stosw ;пишем в видеобуфер loop OutLoop ;по всем цифрам mov ah, 0 int 16h ;ждем any key mov ax, 4c00h int 21h ;выход в ДОС main endp code ends data segment MAS db 21,34,54,23,28,56,98,100,2 ;последовательность чисел lMAS equ $-MAS ;их количество SUM db 0 ;сумма data ends stk segment stack dw 100h dup (?) stk ends end main Консультация # 184430: Здравствуйте! Прошу помощи в следующем вопросе: написать программу, которая определит метку тома дискеты. Если дискета не вставлена в дисковод, то обработать ошибку с помощью INT24h. Если дискета присутствует, то создать на ней файл с именем "Data_file" и записать в него имя метки. Желательны подробные построчные комментарии.
Дата отправки: 12.11.2011, 20:31 Вопрос задал: Canijke Всего ответов: 1 Страница онлайн-консультации » Консультирует Лысков Игорь Витальевич (Старший модератор): Здравствуйте, Canijke! Для получения имени тома можно использовать разные пути. Я применил недокументированную функцию ah=69h Которая, кроме имени тома дает еще серийный номер тома и тип файловой системы Ошибки, связанные с неготовностью флоппи-дисковода обрабатываются Int24h Имя файла дал не Data_file, а DataFile, чтобы уложиться в стандартные для ДОС-а 8 байт имени... (При желании, можно было бы использовать и длинное имя, но надо ли?)
Код : code segment 'code' ;начало сегмента кода assume cs:code,ds:data,ss:stk main proc ;установим обработчик int24h, старый можно не сохранять push cs pop ds ;ds=cs lea dx, int_24 ;ds:dx - адрес обработчика mov ax, 2524h int 21h mov ax, data ;адрес сегмента данных mov ds, ax ;в ds mov es, ax ;в es ;читаем информацию о диске в структуру по адресу ds:dx ;во время каждого обращения к флоппи происходит обработка Int24h! mov ax, 6900h ;недокументированная команда (al=0 - чтение) mov bx, 1 ;флоппи-диск (0-текущий, 1-A, 2-B, 3-C, ...) lea dx, d69 ;адрес, куда запишем данные int 21h cmp al, 0 ;если al не 0, то ошибка! (например, нажали Cancel) jne CreateError ; и незачем пытаться создавать файл! lea dx, sName ;создаем файл xor cx, cx ;без атрибутов mov ah, 3ch int 21h jc CreateError ;создался? ;файл создался mov bx, ax ;описатель файла (handle) ;запись в файл lea dx, d69.volume ;адрес имени диска mov cx, size volume ;длина имени mov ah, 40h int 21h jc WriteError ;записался? lea dx, sWriteOk ;ура! записали jmp CloseFile CreateError: ;файл создать невозможно lea dx, sCreateErr jmp PrintMessage WriteError: ;ошибка записи lea dx, sWriteErr CloseFile: ;закрываем файл mov ah, 3eh int 21h PrintMessage: ;вывод сообщения из ds:[dx] mov ah, 0eh ;сначала сделаем перевод строки mov al, 0dh int 10h ;функцией БИОС mov al, 0ah int 10h mov ah, 9 ;выводим сообщение ds:[dx] int 21h PrintAny: lea dx, sAny ;press any key mov ah, 9 int 21h mov ah, 0 int 16h ;ждем any key mov ax, 4c00h int 21h ;выход в ДОС main endp int_24: ;обработка ошибок push ds push di push si mov si, data mov ds, si ;сообщения в сегменте данных and di, 0fh ;младшие 4 бита - номер ошибки shl di, 1 ;по 2 байта на адрес mov si, table_errors[di] ;si - адрес сообщения mov ah, 0eh ;выводим с помощью БИОС mov al, 0dh ;сначала перевод строки int 10h mov al, 0ah int 10h print_loop: ;выводим строку ds:si, заканчивающуюся нулем lodsb cmp al, 0 je print_rc int 10h jmp print_loop print_rc: ;добавим общую часть lea si, Retry_Cancel print_rc_loop: lodsb cmp al, 0 je wait_rc int 10h jmp print_rc_loop wait_rc: ;ждем R или C mov ah,0 int 16h cmp ah,13h ;скан-код клавиши R jne cmp_cancel mov al,1 ;возвращаем код "повторить операцию" jmp short jmp_iret cmp_cancel: cmp ah,2eh ;скан-код клавиши C jne wait_rc ;все остальное игнорируем mov al,3 ;возвращаем код "прервать операцию" jmp_iret: pop si pop di pop ds iret code ends data69 struc ;описание структуры для приема данных по функции 69h level dw ? ;уровень запроса, всегда 0 serial dd ? ;серийный номер тома volume db 11 dup (?) ;имя тома (то, что нам надо) fat db 8 dup (?) ;тип файловой системы (FAT, FAT32, ...) data69 ends data segment sName db 'a:\DataFile',0 ;имя файла, куда запишем имя тома d69 data69 <0> ;структура для приема данных ;сообщения sWriteOk db 'File written',0dh,0ah,'$' sCreateErr db 'Create error',0dh,0ah,'$' sWriteErr db 'Write error',0dh,0ah,'$' sAny db 'Press any key$',0 ;сообщения int24h ;таблица адресов table_errors dw protect_disk dw unknown_id dw not_ready dw unknown_com dw crc_error dw request_error dw search_error dw media_type dw sector_not_fou dw printer_error dw write_fault dw read_fault dw general_fault dw unknown_error dw unknown_error dw change_error ;сами сообщения protect_disk db 'Disk protected',0 unknown_id db 'Unknown ID subunit',0 not_ready db 'Disk not ready',0 unknown_com db 'Unknown command',0 crc_error db 'CRC error',0 request_error db 'Request error',0 search_error db 'Search error',0 media_type db 'Unknown disk media',0 sector_not_fou db 'Sector not found',0 printer_error db 'Printer error',0 write_fault db 'Write fault error',0 read_fault db 'Read fault error',0 general_fault db 'General failure',0 unknown_error db 'Unknown error',0 change_error db 'Disk change error',0 Retry_Cancel db ' (Retry or Cancel) ',0 data ends stk segment stack dw 100h dup (?) stk ends end main
Оценить выпуск | Задать вопрос экспертам главная страница | стать участником | получить консультацию техническая поддержка | восстановить логин/пароль Дорогой читатель! Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно! МЫ РАБОТАЕМ ДЛЯ ВАС! |
Комментариев нет:
Отправить комментарий