Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

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


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

Лучшие эксперты в разделе

Kdsfofwe21
Статус: 2-й класс
Рейтинг: 1
∙ повысить рейтинг »
cain52
Статус: 3-й класс
Рейтинг: 0
∙ повысить рейтинг »
Evgen aka Chuma
Статус: 6-й класс
Рейтинг: 0
∙ повысить рейтинг »

∙ Assembler

Номер выпуска:1745
Дата выхода:11.06.2019, 16:15
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:73 / 23
Вопросов / ответов:1 / 1

Консультация # 195817: Здравствуйте! Прошу помощи с реализацией задачи. Изменить дату и время создания файла MYFILE.txt и вывести их старые и новые значения на экран. 1. Формат программы: COM - программа 2. Ввод с клавиатуры: средствами DOS 3. Вывод на экран: в текстовом режиме 4. Динамическое распределение памяти: определение размера программы. Надеюсь...

Консультация # 195817:

Здравствуйте! Прошу помощи с реализацией задачи.
Изменить дату и время создания файла MYFILE.txt и вывести их старые и новые значения на экран.
1. Формат программы: COM - программа
2. Ввод с клавиатуры: средствами DOS
3. Вывод на экран: в текстовом режиме
4. Динамическое распределение памяти: определение размера программы.
Надеюсь на Вашу помочь! Заранее благодарен!

Дата отправки: 06.06.2019, 16:14
Вопрос задал: MarkKnopfler (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


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


Здравствуйте, MarkKnopfler!
Держите программу... Можно по-разному сделать, я сделал так...
Комментариев не писал, разбирайтесь самостоятельно... Будут вопросы, спрашивайте в мини-форуме.
Не забывайте, программа в формате COM (Ваш пример - EXE)
Для преобразования байта - двоичного числа в две цифры использована команда AAM
При вводе даты/времени ожидается ввод только в ожидаемом виде и проводится проверка на корректность.
Единственная неточность: день проверяется всегда на 31. Надо проверять на максимальный для каждого месяца
и с учетом високосного года. Этим я пренебрег для простоты :)
И наконец, для чего пункт 4. Динамическое распределение памяти?

Код (Assembler) :: выделить код
TITLE	PROG
	.MODEL	tiny
	.data
filename	DB	'MYFILE.txt',0
Error 		db 	13,10,'Error!',13,10,'$'
MessageOld	db	'Old $'
MessageNew	db	0dh,0ah,'New $'
MessageDateTime	db	'date: '
day_pos		db	'xx.'
month_pos	db	'xx.'
year_pos	db	'xxxx, time:'
hours_pos	db	'xx:'
minutes_pos	db	'xx:'
seconds_pos	db	'xx',0dh,0ah,'$'

MessageEnterDate	db	'Enter date (dd.mm.yyyy): $'
MessageEnterTime	db	0dh,0ah,'Enter time (hh.mm.ss): $'

InBuffer	db	128
InCount		db	?
InData		db	128 dup (?)

	.CODE   
	.186
	ORG	100H
BEGIN:
	mov	ah, 3dh 
	mov	al, 0
	lea	dx, filename 
	int	21h
	jc	MError

	mov	bx, ax

	mov	ax, 5700h	;read time/date of file
	int	21h

	lea	si, MessageOld
	call	PrintTimeDate

	call	EnterNewTimeDate
	jc	MError

	mov	ax, 5701h 
	int	21h

	lea	si, MessageNew
	call	PrintTimeDate
	
	mov	ah, 3eh
	int	21h
	jnc	NoError
MError:
	lea	dx, Error
	mov	ah,09h
	int	21h
NoError:
	mov	ax,4c00h
	int	21h

PrintTimeDate	proc	near
	push	dx
	mov	dx, si
	mov	ah, 9
	int	21h
	pop	dx
	push	dx
	push	cx
	mov	ax, dx
	and	ax, 001fh
	aam
	or	ax, '00'
	mov	day_pos, ah
	mov	day_pos+1, al

	mov	ax, dx
	and	ax, 01e0h
	shr	ax, 5
	aam
	or	ax, '00'
	mov	month_pos, ah
	mov	month_pos+1, al

	mov	ax, dx
	shr	ax, 9
	add	ax, 1980
	mov	cl, 100
	div	cl
	push	ax
	aam
	or	ax, '00'
	mov	year_pos, ah
	mov	year_pos+1, al
	pop	ax
	mov	al, ah
	aam
	or	ax, '00'
	mov	year_pos+2, ah
	mov	year_pos+3, al

	pop	cx
	mov	ax, cx
	shr	ax, 11
	aam
	or	ax, '00'
	mov	hours_pos, ah
	mov	hours_pos+1, al

	mov	ax, cx
	and	ax, 07e0h
	shr	ax, 5
	aam
	or	ax, '00'
	mov	minutes_pos, ah
	mov	minutes_pos+1, al

	mov	al, cl
	and	al, 1fh
	shl	al, 1
	aam
	or	ax, '00'
	mov	seconds_pos, ah
	mov	seconds_pos+1, al

	lea	dx, MessageDateTime
	mov	ah, 9
	int	21h
	pop	dx
	ret
PrintTimeDate	endp

EnterNewTimeDate	proc	near
	lea	dx, MessageEnterDate
	mov	ah, 9
	int	21h
	lea	dx, InBuffer
	mov	ah, 0ah
	int	21h
	cmp	byte ptr InCount, 10
	jne	EnterNewTimeDate_error

	lea	si, InData
	call	GetNum2
	jc	EnterNewTimeDate_error
	cmp	ax, 31
	jg	EnterNewTimeDate_error
	test	ax, ax
	jz	EnterNewTimeDate_error
	mov	di, ax

	lea	si, InData+3
	call	GetNum2
	jc	EnterNewTimeDate_error
	cmp	ax, 12
	jg	EnterNewTimeDate_error
	test	ax, ax
	je	EnterNewTimeDate_error
	shl	ax, 5
	or	di, ax

	lea	si, InData+6
	call	GetNum4
	jc	EnterNewTimeDate_error
	sub	ax, 1980
	jl	EnterNewTimeDate_error
	cmp	ax, 119
	jg	EnterNewTimeDate_error
	shl	ax, 9
	or	di, ax

	lea	dx, MessageEnterTime
	mov	ah, 9
	int	21h
	lea	dx, InBuffer
	mov	ah, 0ah
	int	21h

	cmp	byte ptr InCount, 8
	jne	EnterNewTimeDate_error

	lea	si, InData
	call	GetNum2
	jc	EnterNewTimeDate_error
	cmp	ax, 23
	jg	EnterNewTimeDate_error
	shl	ax, 11
	mov	cx, ax

	lea	si, InData+3
	call	GetNum2
	jc	EnterNewTimeDate_error
	cmp	ax, 59
	jg	EnterNewTimeDate_error
	shl	ax, 5
	or	cx, ax

	lea	si, InData+6
	call	GetNum2
	jc	EnterNewTimeDate_error
	cmp	ax, 59
	jg	EnterNewTimeDate_error
	shr	ax, 1
	or	cx, ax

	mov	dx, di
	clc
	ret
EnterNewTimeDate_error:
	stc
	ret
EnterNewTimeDate	endp

GetNum4	proc
	call	GetNum2
	jc	GetNum4_ret
	mov	bp, 100
	mul	bp
	push	ax
	call	GetNum2
	pop	bp
	jc	GetNum4_ret
	add	ax, bp
	clc
GetNum4_ret:
	ret
GetNum4	endp

GetNum2	proc
	lodsb
	cmp	al, '0'
	jl	GetNum2_error
	cmp	al, '9'
	jg	GetNum2_error
	and	al, 0fh
	mov	ah, 10
	mul	ah
	mov	dx, ax
	lodsb
	cmp	al, '0'
	jl	GetNum2_error
	cmp	al, '9'
	jg	GetNum2_error
	and	ax, 0fh
	add	ax, dx
	clc
	ret
GetNum2_error:
	stc
	ret
GetNum2	endp

END BEGIN

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

5
нет комментария
-----
Дата оценки: 09.06.2019, 17:58

Рейтинг ответа:

НЕ одобряю +2 одобряю!


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

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

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


В избранное