WMmail.ru - сервис почтовых рассылок

пятница, 18 ноября 2011 г.

RFpro.ru: Ассемблер? Это просто! Учимся программировать

 
Если выпуск не отображается, вы можете прочесть его на сайте Отказаться от рекламы
  
  
Дистанционные курсы английского. Все уровни. Пробные уроки бесплатно!
  
  
shopdeluxe
  

  Мои подписки      Мои группы      Мои новости     
        Автор 
Калашников О.А.
      
  
Компьютеры и интернет   →   Софт   →   Программирование   →   RFpro.ru: Ассемблер? Это просто! Учимся программировать
  
RFpro.ru: Ассемблер? Это просто! Учимся программировать
 
 

Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Коцюрбенко Алексей aka Жерар
Статус: Профессор
Рейтинг: 2960
• повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2552
• повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2118
• повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Assembler (Ассемблер)

Номер выпуска: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 

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 13.11.2011, 22:46
Рейтинг ответа:

НЕ одобряю 0 одобряю!

Консультация # 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 

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 12.11.2011, 23:20
Рейтинг ответа:

НЕ одобряю 0 одобряю!

Консультация # 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

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 14.11.2011, 11:43
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


 
 
Комментировать выпуск
     В избранное

Прошлые выпуски
RFpro.ru: Ассемблер? Это просто! Учимся программировать    17 ноября 2011, 12:03
RFpro.ru: Ассемблер? Это просто! Учимся программировать    14 ноября 2011, 20:33
RFpro.ru: Ассемблер? Это просто! Учимся программировать    09 ноября 2011, 14:34

Все выпуски рассылки

18 ноября 2011 отмечают:
День рождения Деда Мороза
День независимости Латвии
День памяти о&nbsp;Вуковарских событиях 1991 года

Именины: Гавриил, Галактион, Памфил, Тимофей
 
 

Subscribe рекомендует
 
Компьютеры и интернет  →   рассылки   и   группы
  
Новинки Компьютерных Игр
Обзоры последних игровых новинок. Лень покупать и листать игровые журналы? Не интересно толкаться в магазинах с играми? Не хочется ломать глаза, читая описание игры на обложке компакт-диска? Подпишитесь на рассылку!
Подписчиков: 27312
  Буркина-Фасо на футбольном менеджере Золотая Бутса
В популярнейший бесплатный футбольный менеджер Золотая Бутса играют уже несколько тысяч человек. В этой рассылке представлены новости, события и жизнь футбольного союза Буркина-Фасо. Прими участие в увлекательной игре.
Подписчиков: 121
  Новости и новинки из мира компьютерной техники каждый день
Оперативно самые последние новости и последние новинки из мира компьютерной техники каждый день.
Подписчиков: 693
 
 
 
Подписан адрес: admin10383.deep@blogger.com
Код этой рассылки: comp.prog.assembler
Архив рассылки
Отписаться:  На сайте  Почтой
Поддержка подписчиков
Убрать рекламу
Другие рассылки этой тематики
Другие рассылки этого автора
 
Рассылка производится: Subscribe.Ru / ЗАО «Интернет-Проекты» / О компании / Политика конфиденциальности

Комментариев нет:

Отправить комментарий