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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.12.2010, 03:31   #1
Dimon12345
Пользователь
 
Регистрация: 03.12.2010
Сообщений: 10
Восклицание TASM работа с файлами

Здравствуйте, пишу программу которая обнуляет все элементы в матрице, которые больше заданного. Проблема в том, что ввод/вывод нужно организовать через файлы. Вывод я сделал, а вот ввод не получается, сначала приведу работающую версию.

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

Помогите кто чем может...))
бьюсь над ней уже второй день

Последний раз редактировалось Dimon12345; 12.12.2010 в 03:49.
Dimon12345 вне форума Ответить с цитированием
Старый 12.12.2010, 03:36   #2
Dimon12345
Пользователь
 
Регистрация: 03.12.2010
Сообщений: 10
По умолчанию

этот вариант работает, но чтение происходит с консоли, а вывод уже в файл
Код:

;прочитать данные из файла in.dat (in1.dat,in2.dat in3.dat in4.dat). Результат сохранить в out.dat.
.model small
.stack 100h
.data
.386

m dw ? ;колличество строк
n dw ? ;колличество столбцов
i dw ?
j dw ?
a dw ? ;параметр для сравнения
matrix dw 256 dup (0)
mas dw 16 dup (0) ;Временный буфер для хранения числа для вывода в обратном порядке.

f_Handle    dw ? ; дескриптор файла для вывода
outFileName db 'out.txt',0  
msg_fileError db 13,10,'Ошибка создания файла$'
buf db ?

.code
start:
mov ax, @data
mov ds, ax
mov es, ax
xor ax, ax

;ввод
;вводим число стрк
call input
mov m, ax
;вводим число столбцов
call input
mov n, ax
;вводим параметр для сравнения
call input
mov a, ax
;ввод маирицы
lea dx, matrix
call inputmatrix

;-сравнение элементов с а
mov i, 0
;проход по матрицe
loop11:
mov j, 0
loop22:
;тело цикла
	lea dx, matrix	
	call ijtodi	
	mov ax, a
	scasw	
	jge next	
	lea dx, matrix
	call ijtodi
	mov ax, 0
	stosw
next:		
;конец тела
inc j
mov ax, n
cmp j, ax
jnz loop22
inc i
mov ax, m
cmp i, ax
jnz loop11

;вывод
lea dx, outFileName
     mov ah, 3Ch  ;функция создания файла
     mov cx, 20h  ; атрибут архивный
     int 21h
     jc  file_error ; если установлен флаг переноса - ошибка
     
     mov f_handle, ax  ; здесь дескриптор файла 

lea dx, matrix
call outputmatrix

file_error:     
; закрываем файл
     mov bx, f_handle
     cmp bx, 1
         mov ah,3Eh ; функция закрытия файла
         int 21h

;конец
mov ah,4ch
int 21h

;подпрограммы
ijtosi proc ;DX - указатель на матрицу.
	push ax
	push cx
	push dx
	mov ax, i
	mul n
	mov cx, 2
	mul cx
	add ax, j
	add ax, j
	mov si, ax
	pop dx
	add si, dx
	pop cx
	pop ax
	ret
endp

ijtodi proc ;DX - указатель на матрицу.
	push ax
	push cx
	push dx
	mov ax, i
	mul n
	mov cx, 2
	mul cx
	add ax, j
	add ax, j
	mov di, ax
	pop dx
	add di, dx
	pop cx
	pop ax
	ret
endp

inputmatrix proc ;DX - указатель на матрицу.
	mov i, 0
	
	loop1:
	mov j, 0
	loop2:
		push dx
		call input
		pop dx
		call ijtodi
		stosw
	inc j
	mov ax, n
	cmp j, ax
	jnz loop2
	inc i
	mov ax, m
	cmp i, ax
	jnz loop1
	ret
endp

outputmatrix proc ;DX - указатель на матрицу.
	mov i, 0
	
	loop3:
	push ax
	push dx
	mov al, 13
	call output_char
	mov al, 10
	call output_char
	pop dx
	pop ax
	mov j, 0
	loop4:
		call ijtosi
		lodsw
		pushad
		call output
		popad
		
		push ax
		push dx
		mov al, ' '
		call output_char
		pop dx
		pop ax
	inc j
	mov ax, n
	cmp j, ax
	jnz loop4
	inc i
	mov ax, m
	cmp i, ax
	jnz loop3
	ret
endp

input proc ;Ввод числа. Результат в ax.
	
xor bx, bx
	xor di, di ;Флаг отрицательности числа.
	
	l0:
	mov ah, 1h ;Проверка ввода первого символа на '-'.
	int 21h
	cmp al, '+'
	jz l1
	cmp al, '-'
	jnz l7
	inc di
	
	l1:
	mov ah, 1h ;Ввод символов.
	int 21h
	
	l7:
	cmp al, 0Dh ;Проверка на нажатие интера.
	jz l2
	cmp al, ' ' ;Проверка на нажатие пробела.
	jz l222
	cmp al, '0'
	js @error
	cmp al, '9'+1
	jns @error
	
	xor ah, ah ;Добавление цифры к введенному числу и переход к новой итерации.
	sub ax, '0'
	push ax
	mov ax, 10
	mul bx
	mov bx, ax
	pop ax
	add bx, ax
	jmp l1
	
	@error:
	mov ah, 2h
	mov dl, 08
	int 21h
	mov ah, 2h
	mov dl, ' '
	int 21h
	mov ah, 2h
	mov dl, 08
	int 21h
	test bx, bx
	jz l0
	jmp l1
	
	l222: ;Если пробел нажат.
	mov ax, bx
	
	dec di ;Если флаг установлен, инвертируем число.
	jnz l8
	neg ax
	
	l8:
	ret
	
	l2: ;Если интер нажат.
	mov ax, bx
	
	dec di ;Если флаг установлен, инвертируем число.
	jnz l88
	neg ax
	
	l88:
	
	push ax ;Переходим на новую строку.
	mov ah, 2h
	mov dl, 10
	int 21h
	pop ax
	
	ret

endp ;Конец ввода числа.

output proc ;Вывод числа.
	xor di, di
	
	test ax, 1000000000000000b
	jz l6
	neg ax
	push ax
	mov al, '-'
	call output_char
	pop ax
	l6:
	
	l3:
	xor dx, dx
	mov cx, 10
	div cx
	add dx, '0'
	mov mas[di], dx
	inc di
	test ax, ax
	jnz l3
	
	
	l5:
	dec di
	jz l4
	mov ax, mas[di]
	call output_char
	jmp l5
	
	l4:
	mov ax, mas[di]
	call output_char
	ret
endp

; процедура для вывода символа в файл, f_handle - дескриптор файла
; выводимый символ должен быть в AL 
; f_handle должен быть установлен заранее
output_char proc
push ax
push bx
push cx
push dx
   mov buf, al
   mov ah, 40h
   mov bx, f_handle
   lea dx, buf
   mov cx, 1
   int 21h
pop  dx
pop  cx
pop  bx
pop  ax
ret
output_char endp 

end start

Последний раз редактировалось Dimon12345; 12.12.2010 в 12:40.
Dimon12345 вне форума Ответить с цитированием
Старый 12.12.2010, 03:38   #3
Dimon12345
Пользователь
 
Регистрация: 03.12.2010
Сообщений: 10
По умолчанию

а вот это вариант, где я пытаюсь прочитать входные данные из файла, но он не работает, ошибка вроде как при чтении матрицы, хотя не уверен.
тут добавлены подпрограммы по открытию\закрытию файла
изменена input и inputmatrix
и добавлена подпрограмма GetNextCharacter (используется в input и inputmatrix) для чтения символа из файла, h_handle - дескриптор открытого файла

считаю что числа в файле лежат в одной строке разделенные пробелом.

Жирным выделен код отвечающий за ввод.

Последний раз редактировалось Dimon12345; 12.12.2010 в 12:35.
Dimon12345 вне форума Ответить с цитированием
Старый 12.12.2010, 03:44   #4
Dimon12345
Пользователь
 
Регистрация: 03.12.2010
Сообщений: 10
По умолчанию

Код:
;прочитать данные из файла in.dat (in1.dat,in2.dat in3.dat in4.dat). Результат сохранить в out.dat.
.model small
.stack 100h
.data
.386
m dw ? ;колличество строк
n dw ? ;колличество столбцов
i dw ?
j dw ?
a dw ? ;параметр для сравнения
matrix dw 256 dup (0)
mas dw 16 dup (0) ;Временный буфер для хранения числа для вывода в обратном порядке.

f_Handle    dw ? ; дескриптор файла для вывода
outFileName db 'out.txt',0  
inF1 db 'in1.txt',0	; - m
inF2 db 'in2.txt',0	;- n
inF3 db 'in3.txt',0	; - параметр для сравнения
inF4 db 'in4.txt',0	; - матрица

msg_fileError db 13,10,'Ошибка создания файла$'
buf db ?
TempChar DB ?

.code
start:
mov ax, @data
mov ds, ax
mov es, ax
xor ax, ax

;ввод
;вводим число стрк
lea dx, inF1 
call open_file
call input
mov m, ax
call close_file
;вводим число столбцов
lea dx, inF2 
call open_file
call input
mov n, ax
call close_file
;вводим параметр для сравнения
lea dx, inF3 
call open_file
call input
mov a, ax
call close_file
;ввод маирицы
lea dx, inF4 
call open_file
lea dx, matrix
call inputmatrix
call close_file

;сравнение элементов с а-
mov i, 0

;проход по матрице
loop11:
mov j, 0
loop22:
;тело цикла
	lea dx, matrix	
	call ijtodi	
	mov ax, a
	scasw	
	jge next	
	lea dx, matrix
	call ijtodi
	mov ax, 0
	stosw
next:		
;конец тела
inc j
mov ax, n
cmp j, ax
jnz loop22
inc i
mov ax, m
cmp i, ax
jnz loop11

;вывод
lea dx, outFileName
     mov ah, 3Ch  ;функция создания файла
     mov cx, 20h  ; атрибут архивный
     mov al,0; чтение запись
     int 21h
     jc  file_error ; если установлен флаг переноса - ошибка
          mov f_handle, ax  ; здесь дескриптор файла 
lea dx, matrix
call outputmatrix

file_error:	     
call close_file
;-конец-
mov ah,4ch
int 21h

;подпрограммы

;создание файда
new_file proc; dx - имя файла
    mov ah, 3Ch  ;функция создания файла
     mov cx, 20h  ; атрибут архивный
     mov al,0; чтение запись
     int 21h
     jc  file_error ; если установлен флаг переноса - ошибка
     
     mov f_handle, ax  ; здесь дескриптор файла  	
	ret
endp

;открытие файда
open_file proc; dx - имя файла

    mov ah, 3Dh  ;функция создания файла
     mov cx, 20h  ; атрибут архивный
     mov al,0; чтение запись
     int 21h
     jc  file_error ; если установлен флаг переноса - ошибка
     
     mov f_handle, ax  ; здесь дескриптор файла  	
	ret
endp

; закрываем файл

close_file proc

     mov bx, f_handle
     cmp bx, 1
         mov ah,3Eh ; 
         int 21h

	ret
endp

Последний раз редактировалось Dimon12345; 12.12.2010 в 12:40.
Dimon12345 вне форума Ответить с цитированием
Старый 12.12.2010, 03:44   #5
Dimon12345
Пользователь
 
Регистрация: 03.12.2010
Сообщений: 10
По умолчанию

Код:
ijtosi proc ;DX - указатель на матрицу.
	push ax
	push cx
	push dx
	mov ax, i
	mul n
	mov cx, 2
	mul cx
	add ax, j
	add ax, j
	mov si, ax
	pop dx
	add si, dx
	pop cx
	pop ax
	ret
endp

ijtodi proc ;DX - указатель на матрицу.
	push ax
	push cx
	push dx
	mov ax, i
	mul n
	mov cx, 2
	mul cx
	add ax, j
	add ax, j
	mov di, ax
	pop dx
	add di, dx
	pop cx
	pop ax
	ret
endp

inputmatrix proc ;DX - указатель на матрицу.
	mov i, 0
	
	loop1:
	mov j, 0
	loop2:
		push dx
		call input
		pop dx
		call ijtodi
		stosw
	inc j
	mov ax, n
	cmp j, ax
	jnz loop2
	inc i
	mov ax, m
	cmp i, ax
	jnz loop1
	ret
endp

outputmatrix proc ;DX - указатель на матрицу.
	mov i, 0
	
	loop3:
	push ax
	push dx
	mov al, 13
	call output_char
	mov al, 10
	call output_char
	pop dx
	pop ax
	mov j, 0
	loop4:
		call ijtosi
		lodsw
		pushad
		call output
		popad
		
		push ax
		push dx
		mov al, ' '
		call output_char
		pop dx
		pop ax
	inc j
	mov ax, n
	cmp j, ax
	jnz loop4
	inc i
	mov ax, m
	cmp i, ax
	jnz loop3
	ret
endp

input proc ;Ввод числа. Результат в ax.
	
xor bx, bx
	xor di, di ;Флаг отрицательности числа.
	
	l0:
	call GetNextCharacter
	je end_proc
	cmp al, '+'
	jz l1
	cmp al, '-'
	jnz l7
	inc di
	
	l1:
	call GetNextCharacter
	je end_proc
	
	l7:
	cmp al, ' ' ;Проверка на нажатие пробела.
	jz l222
	cmp al, '0'
	js @error
	cmp al, '9'+1
	jns @error
	
	xor ah, ah ;Добавление цифры к введенному числу и переход к новой итерации.
	sub ax, '0'
	push ax
	mov ax, 10
	mul bx
	mov bx, ax
	pop ax
	add bx, ax
	jmp l1
	
	@error:
	mov ah, 2h
	mov dl, 08
	int 21h
	mov ah, 2h
	mov dl, ' '
	int 21h
	mov ah, 2h
	mov dl, 08
	int 21h
	test bx, bx
	jz l0
	jmp l1

end_proc:	
	l222: ;Если пробел нажат.
	mov ax, bx
	
	dec di ;Если флаг установлен, инвертируем число.
	jnz l8
	neg ax
	
	l8:
	ret
	
	

endp ;Конец ввода числа.

; Подпрограмма получения следующего символа из стандартного
; ввода
;
; Входные данные: нет
;
; Выходные данные:
;     AL = символ, если он был доступен
;     флаг Z = 0 (NZ), если символ доступен,
;            = 1 (Z) при достижении конца строки
GetNextCharacter       PROC
push ax
push bx
push cx
push dx
                  mov  ah,3fh           ; функция DOS
                                        ; чтения из файла
                  mov  bx,f_Handle             
                  mov  cx,1             ; считать один символ
                  mov  dx,OFFSET TempChar ; поместить символ
                                        ; в TempChar
                  int  21h              ; получить следующий
                                        ; символ
                  jc   NoCharacterRead  ; если DOS сообщает
                                        ; об ошибке,
                                        ; интерпретировать ее,
                                        ; как конец файла
                  cmp  [TempChar],1ah   ; это Control-Z?
                                        ; (метка конца файла)           
NoCharacterRead:
                  sub  ax,ax            ; установить флаг Z,
                  and  ax,ax            ; что отражает, был
                                        ; ли считан символ (NZ)
                                        ; или мы достигли
                                        ; конца файла (Z).
                                        ; Обратите внимание,
                                        ; что функция DOS 3fh
                                        ; устанавливает регистр
                                        ; AX в значение числа
                                        ; считанных символов
                  mov  al,[TempChar]    ; возвратить считанный
                 			; символ
pop  dx
pop  cx
pop  bx
pop  ax                      
                  ret                   ; выполнено
GetNextCharacter       ENDP

output proc ;Вывод числа.
	xor di, di
	
	test ax, 1000000000000000b
	jz l6
	neg ax
	push ax
	mov al, '-'
	call output_char
	pop ax
	l6:
	
	l3:
	xor dx, dx
	mov cx, 10
	div cx
	add dx, '0'
	mov mas[di], dx
	inc di
	test ax, ax
	jnz l3
	
	
	l5:
	dec di
	jz l4
	mov ax, mas[di]
	call output_char
	jmp l5
	
	l4:
	mov ax, mas[di]
	call output_char
	ret
endp

; процедура для вывода символа в файл, f_handle - дескриптор файла
; выводимый символ должен быть в AL 
; f_handle должен быть установлен заранее
output_char proc
push ax
push bx
push cx
push dx
   mov buf, al
   mov ah, 40h
   mov bx, f_handle
   lea dx, buf
   mov cx, 1
   int 21h
pop  dx
pop  cx
pop  bx
pop  ax
ret
output_char endp 

end start

Последний раз редактировалось Dimon12345; 12.12.2010 в 12:31.
Dimon12345 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TASM дело тонкое!:) (Где в TASM IDE?) 3.14oner Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 9 15.11.2011 16:20
работа с файлами Serjuk Общие вопросы C/C++ 2 06.05.2010 19:25
Работа в защищенном режиме(TASM) adgam Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 11.11.2009 22:48
Работа со строками на ассемблере (TASM) crashX Помощь студентам 3 03.06.2009 09:22