Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.11.2011, 17:58   #1
BaronVik
Пользователь
 
Регистрация: 21.04.2010
Сообщений: 36
Вопрос Ассемблер(TASM) проблема с вводом

Добрый вечер уважаемые программисты. У меня есть несколько вопросов по моей лабе.Работаю на ассемблере(TASM)

Задание:
Ввести с клавиатуры 2 строки.
1)Имя файла(с указанием пути)
2)Новое имя файла(для переименования)

Вот моя наработка
Код HTML:
Seg_STACK SEGMENT PARA STACK 'STACK'     
	DB	64 DUP (?)
Seg_STACK ENDS
Seg_DATA SEGMENT PARA PUBLIC 'DATA'     
        fname1 Db ?
	fname2 Db ?
Seg_DATA ENDS

Seg_CODE SEGMENT PARA PUBLIC 'CODE'
BEGIN PROC FAR
	ASSUME CS: Seg_CODE, DS: Seg_DATA, SS:Seg_STACK
	mov AH, 3Fh ;для ввода
	mov BX, 0 ;дискриптор клавиатуры
	mov cx,50 ;Максимальное число символов
	int 21h ;прерывание

	mov AH, 3Fh ;для ввода
	mov BX, 0 ;дискриптор клавиатуры
	mov cx,50 ;Максимальное число символов
	int 21h ;прерывание

	push DS ;настроим ES
	pop ES	;на сегмент данных
	mov AH, 56h ;для переименования
	mov DX, offset fname1 ;старое название файла
	mov DI, offset fname2 ;новое название файла
	int 21h ; прерываение
BEGIN ENDP
Seg_CODE ENDS
	END BEGIN
Как fname1 и fname2 присвоить значение введённые с клавиатуры?
BaronVik вне форума Ответить с цитированием
Старый 18.11.2011, 18:27   #2
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Когда вы подготавливаете вызов службы mov AH, 3Fh ;для ввода для прерывания 21h очевидно вы должны указать адрес области, куда будет считываться ввод. Смотрите описание этой функции. Там должно быть указано, какие регистры что должны хранить. Скорей всего в один из этих регистров, то ли SI, то ли DI, то ли еще какой вы должны указать смещение ваших байтовых строк, установив также сегментный регистр.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 18.11.2011, 18:32   #3
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Во-первых, ты выделяешь для имен файлов по одному байту. Они туда не поместятся, очевидно )

Во-вторых, при использовании функций ввода нужно задавать адрес буфера, в который читать.

В-третьих, нет вызова функции завершения программы.

...
Son Of Pain вне форума Ответить с цитированием
Старый 20.11.2011, 14:49   #4
BaronVik
Пользователь
 
Регистрация: 21.04.2010
Сообщений: 36
Вопрос

Во-первых, ты выделяешь для имен файлов по одному байту. Они туда не поместятся, очевидно )
Для имён и пути Увеличил до dw

Во-вторых, при использовании функций ввода нужно задавать адрес буфера, в который читать.
В учебнике нашёл конструкцию описания буфера:
Код HTML:
inbuf dw 256 dup ('*'),'$'
В-третьих, нет вызова функции завершения программы.
Добавил:
Код HTML:
	mov    AH,4Ch   ; Функция 4Ch завершения программы
        mov    AL,00h   ; Код 0 успешного завершения
        int    21h      ; Вызов DOS
Вот код
Код HTML:
Seg_STACK SEGMENT PARA STACK 'STACK'     
	DB	64 DUP (?)
Seg_STACK ENDS
Seg_DATA SEGMENT PARA PUBLIC 'DATA'     
        fname1 dw ?
	fname2 dw ?
	inbuf dw 256 dup ('*'),'$'
Seg_DATA ENDS

Seg_CODE SEGMENT PARA PUBLIC 'CODE'
BEGIN PROC FAR
	ASSUME CS: Seg_CODE, DS: Seg_DATA, SS:Seg_STACK
	mov AH, 3Fh ;для ввода
	mov BX, 0 ;дискриптор клавиатуры
	mov cx,50 ;Максимальное число символов
	mov DX,offset inbuf;буфер
	int 21h ;прерывание
	mov fname1, offset inbuf;Адрес старого названия

	mov AH, 3Fh ;для ввода
	mov BX, 0 ;дискриптор клавиатуры
	mov cx,50 ;Максимальное число символов
	mov DX,offset inbuf;буфер
	int 21h ;прерывание
	mov fname2,offset inbuf;Адрес нового названия

	push DS ;настроим ES
	pop ES	;на сегмент данных
	mov AH, 56h ;для переименования
	mov DX, offset fname1 ;старое название файла
	mov DI, offset fname2 ;новое название файла
	int 21h ; прерываение
	mov    AH,4Ch   ; Функция 4Ch завершения программы
        mov    AL,00h   ; Код 0 успешного завершения
        int    21h      ; Вызов DOS

BEGIN ENDP
Seg_CODE ENDS
	END BEGIN
Через дебагер запускаю программу. Почему-то у переменной inbuf значения 42 42 42 42

к тому же с помощью команды mov fname1, offset inbuf в переменную fname1 не переходит значение inbuf .
Подскажите что с этим делать?
BaronVik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ассемблер. tasm alex(21) Помощь студентам 5 20.03.2011 23:50
Ассемблер(tasm) 8086 Построить кривую роза с параметрами, изменяемыми пользователем karina74 Фриланс 6 30.11.2010 09:02
Ассемблер Tasm Asya555 Помощь студентам 0 04.05.2009 22:02
[TASM]Ассемблер. Стек. SoundMan Помощь студентам 4 29.11.2008 20:22