Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Assm - [решено] Запись в файл

Ответить
Настройки темы
Assm - [решено] Запись в файл

Старожил


Сообщения: 208
Благодарности: 5

Профиль | Отправить PM | Цитировать


Люди добрые и знающие помогите пожалуйста
есть задача:
Программа просит ввести строку. Строка - слова разделённые одним или несколькими пробелами.
Удалить лишние пробелы (вначале строки, в конце строки, 1 пробел между словами).
Результат вывести на экран и записать в файл (файл создаётся в процессе)

Я тут написал часть программы:
Код: Выделить весь код
	.MODEL small			;отводим под стек и под данные по 64Кб
	.STACK 100h				;отмечаем начало сегмента стека
	.DATA					;отмечаем начало сегмента данных
	NL		db		0Ah, 0Dh, '$'
        Buf		DB		255, 0, 256 DUP (0)     ;
	.CODE				;отмечаем начало сегмента кодов
	main PROC
	mov		ax,@data		;копируем адрес
	mov		ds,ax		;сегмента данных
	mov		dx,offset Buf	;считываем  строку с клавиатуры
	mov		ah,0Ah
	int		21h
	xor		cx,cx
	mov		al,[Buf+1]      ;если считано 0 байт, то выход из
	mov		cl,al               ;задаем количество повторений (длина строки)
	test	al,al           	     ;программы
	jz		Exit
	mov		ah,09h
	mov		dx,offset NL  	;перейти на следующую строку
	int		21h
	mov		si,offset Buf+2
	mov		dh,0Dh         	;подготовка - суём в регистр символ,
							;которого не может быть во введённой строке
	
	tmp:
		mov		dl,[si]
		cmp		dl,' '
		jne		Cycle1
		inc		si
		dec		cx
		jmp		tmp
		
		
    Cycle:
		mov     dl,[si]		;считать символ
	Cycle1: 
		cmp     dl,' '		;сравнить с пробелом
		jne     Print		;если не пробел - вывести
        cmp 	dx,'  '		        ;а если пробел - то предыдущий был пробел или нет?
        je    NextChar		        ;если два пробела подряд - не печатаем
		jne		Print
			Print:
				mov     ah,02h		;выбор функции 2
				int     21h			;вызов DOS
        NextChar:
        mov 	dh,dl		               ;сохранить текущий символ для теста на следующем витке
        inc 	si			       ;перейти к следующему символу
    loop    Cycle
    Exit:
		mov		AX,4C00h	;выход
		int		21h		;из программы
    main    ENDP
    END main
Программа удаляет пробелы вначале строки и делает 1 пробел между словами.
Помогите пожалуйста удалить последние пробелы, а главное записать всё это дело
в файл...
В ассемблере не силён, погуглив в принципе нашёл как работать с файлами...
Но у меня ничего не получилось, по сюда даже не писал мои попытки работать с файлами,
ибо сам посидел, посмотрел и понял, что это бред.
Заранее спасибо!!

Отправлено: 15:18, 18-11-2010

 

Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


pogo, задачу нужно решить именно под DOS (для иллюстрации процесса с академической точки зрения, судя по коду это TASM)? Или же нужна именно такая программа, и для ОС отличной от DOS?

Если на второе да, и ОС для которой нужно решение - MS Windows, то для решения можно воспользоваться функциями CreateFile\WriteFile\CloseHandle.
Если нужен именно под DOS, то задача сведётся к поиску нужных прерываний по работе с файлами.

Отправлено: 16:36, 18-11-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Старожил


Сообщения: 208
Благодарности: 5

Профиль | Отправить PM | Цитировать


да использую tasm и tlink
Надо именно под DOS
да и прерывания в инете найти не проблема введя в любом поисковике ассемблер работа с файлами он всё выдаст...
у меня проблема именно с реализацией этих прерываний в коде программы...
помогите пожалуйста дописать прогу

Отправлено: 17:26, 18-11-2010 | #3


Старожил


Сообщения: 208
Благодарности: 5

Профиль | Отправить PM | Цитировать


Что на таком большом форуме никто ассемблера не знает?((

Отправлено: 13:02, 19-11-2010 | #4


Аватара для ganselo

Старожил


Сообщения: 232
Благодарности: 90

Профиль | Сайт | Отправить PM | Цитировать


Цитата pogo:
Что на таком большом форуме никто ассемблера не знает?(( »
тебе на wasm.ru

-------
К величайшему сожалению "история учит нас тому, что она ничему не учит".


Отправлено: 16:52, 19-11-2010 | #5


Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


pogo, вот пример http://subscribe.ru/archive/comp.pro.../26170402.html
Исключительно по теме:
Код: Выделить весь код
TITLE Write 2 File Example

;Запись в файл

DOSSEG
.MODEL TINY
.STACK 100h
.DATA
	szFileName DB 'My file.txt', '0'
	msgSize = $-szFileName
.CODE
.386
ENTRY PROC NEAR
	mov ax, @data
	mov ds, ax

;создаём файл
	mov ah, 3Ch	;Запись в файл или устройство
	lea dx, szFileName ; эквивалентно -> mov dx, offset szFileName
	xor cx, cx
	int 21h
;считаем что проблем с созданием не возникло (а так нужна проверка)
	mov bx, ax	; сохраняем описатель (handle) файла в bx
;пишем в файл
	mov ah, 40h
	lea dx, szFileName
	mov cx, msgSize
	int 21h
;закрываем файл
	mov ah, 3Eh
	int 21h

	mov ax, 4c00h
	int 21h
ENTRY ENDP
END
Создаётся файл с именем My file.txt с таким же содержанием + символ окончания строки.

Отправлено: 17:13, 19-11-2010 | #6


Старожил


Сообщения: 208
Благодарности: 5

Профиль | Отправить PM | Цитировать


Дошёл до того, что сделал 1 часть с пробелами:
Код: Выделить весь код
	.MODEL small			;отводим под стек и под данные по 64Кб
	.STACK 100h				;отмечаем начало сегмента стека
	.386
	.DATA					;отмечаем начало сегмента данных
	NL		db		0Ah, 0Dh, '$'
    Buf		DB		255, 0, 256 DUP (0)     ;
	hFile	dw		?
	Filename	db		'file.txt',0
	.CODE				;отмечаем начало сегмента кодов
	main PROC
		mov		ax,@data		;копируем адрес
		mov		ds,ax		;сегмента данных
	
		mov dx, offset Buf
		mov ah, 0Ah
		int 21h				;запрашиваем строку
 
		mov dx, offset NL
		mov ah, 9h
		int 21h				;переводим строку на экране, выводя CRLF
 
		xor cx, cx 
		mov cl, [Buf+1]
		test cl, cl
		jz Exit				;проверяем длину строки - если пустая, то выходим
	
;		mov si, offset Buf+2		;если не пустая - то будем искать пробелы
;		add Buf+2,cl
		add bx, offset Buf+1
		add bl, cl
		mov	si, bx
last:
		mov		dl,[si]
		cmp		dl,' '
		jne		tmp
		dec		si
		dec		cx
		jmp		last
		
		
tmp:	mov si, offset Buf+2

first:	mov		dl,[si]
		cmp		dl,' '
		jne		Cycle
		inc		si
		dec		cx
		jmp		first
		
Cycle:
		mov dl, [si]			;берём очередной байт
		cmp dl, ' '			;сравниваем с пробелом
		jne	Print
		cmp 	dx,'  '			;а если пробел - то предыдущий был пробел или нет?
        je    NextChar		;если два пробела подряд - не печатаем
		
Print:
		mov     ah,02h		;выбор функции 2
		int     21h			;вызов DOS
		
NextChar:
		mov 	dh,dl		;сохранить текущий символ для теста на следующем витке
        inc 	si			;перейти к следующему символу
		
		loop	Cycle 
 
 
Exit:
		mov ax, 4c00h
		int 21h				;выходим из программы

    main    ENDP
    END main
как с файлом сделать теоретически я представляю,
взять полученную строку и посимвольно записать её в файл...
или записать всё в переменную, что бы в ней получилась обработанная строка...
Но я вообще не поднимаю как это в Ассемблере реализовать ((
я не понимаю как вообще в файл запись происходит...

Отправлено: 18:01, 19-11-2010 | #7


Старожил


Сообщения: 208
Благодарности: 5

Профиль | Отправить PM | Цитировать


Вот готовый рабочий код программы:
Программа просит ввести строку. Строка - слова разделённые 1 или несколькими пробелами, удалить лишние пробелы (вначале строки, в конце строки, 1 пробел между словами)
Результат вывести на экран и записать в файл (файл создаётся в процессе). Запись в файл организовать в процедуре.

Код: Выделить весь код
	.MODEL small			;отводим под стек и под данные по 64Кб
	.STACK 100h				;отмечаем начало сегмента стека
	.386
	.DATA					;отмечаем начало сегмента данных
	NL		db		0Ah, 0Dh, '$'
        Buf		DB		255, 0, 256 DUP (0)     ;
	hFile	db	300	        dup(?)
	Filename	db		'file.txt',0
	.CODE				;отмечаем начало сегмента кодов
	main PROC
		mov		ax,@data		;копируем адрес
		mov		ds,ax		;сегмента данных
	
		mov dx, offset Buf
		mov ah, 0Ah
		int 21h				;запрашиваем строку
 
		mov dx, offset NL
		mov ah, 9h
		int 21h				;переводим строку на экране, выводя CRLF
 
		xor cx, cx 
		mov cl, [Buf+1]
		test cl, cl
		jz Exit				;проверяем длину строки - если пустая, то выходим
	
		add bx, offset Buf+1
		add bl, cl
		mov	si, bx
last:
		mov		dl,[si]
		cmp		dl,' '
		jne		tmp
		dec		si
		dec		cx
		jmp		last
		
		
tmp:	mov si, offset Buf+2
 
first:	mov		dl,[si]
		cmp		dl,' '
		jne		Cycle
		inc		si
		dec		cx
		jmp		first
 
		
Cycle:		lea di, hFile
		mov bx,0
 
Cycle1:		mov dl, [si]			;берём очередной байт
		cmp dl, ' '			;сравниваем с пробелом
		jne	Print
		cmp 	dx,'  '			;а если пробел - то предыдущий был пробел или нет?
       		je    NextChar		;если два пробела подряд - не печатаем
		
Print:
		mov	[di], dl
		inc	di
		mov     ah,02h		;выбор функции 2
		int     21h			;вызов DOS
		inc 	bx
				
NextChar:
		mov 	dh,dl		;сохранить текущий символ для теста на следующем витке
        	inc 	si			;перейти к следующему символу
		
		loop	Cycle1 
 		
		push 	bx
 
		mov ah, 3Ch			;если же добрались до конца - будем сохранять.
		mov dx, offset Filename
		xor cx, cx
		int 21h				;создаём файл
 
		pop	si		
 
		push	offset	hFile
		call	vivod
 
		mov ah, 3eh
		int 21h				;закрываем файл
 
Exit:
		mov ax, 4c00h
		int 21h				;выходим из программы
 
    main    ENDP
 
    vivod	proc
    mov bx, ax
    mov ah, 40h
    mov cx, si
    mov bp, sp
    add bp, 2
    mov dx, [bp]
    int 21h
    ret
    vivod	endp
    END main
Может кому пригодится ))

Отправлено: 09:15, 24-11-2010 | #8



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Assm - [решено] Запись в файл

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Запись врмени в файл hxygen Скриптовые языки администрирования Windows 8 23-10-2010 22:33
C/C++ - [решено] запись в файл Viruss Программирование и базы данных 3 05-08-2010 18:27
запись в файл на Perl koresaram Вебмастеру 3 16-03-2006 13:46
PHP. Запись массива в файл. Hemp Вебмастеру 3 08-10-2004 20:50
Delphi - Delphi+ListBox+ запись в файл Guest Программирование и базы данных 2 08-06-2004 00:53




 
Переход