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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.01.2011, 10:57   #1
Chelmgn
 
Регистрация: 21.05.2010
Сообщений: 6
По умолчанию Текстовые файлы (Ассемблер).

Составить exe программу, которая читает К байтов из текстового файла alfa.txt, начиная с N байта и записать их в конец текстового файла beta.txt.

Попытался написать. Собирал код из нескольких программ и запутался. Подскажите, пожалуйста, где и что неправильно.


Код:
IDEAL
MODEL SMALL
STACK 100h
DATASEG
	strNewLine db 0Dh, 0Ah, '$'
	newLine db 0Dh, 0Ah
	mesFile1 db 'Enter the name of first file: ', '$'
	mesFile2 db 'Enter the name of second file: ', '$'
	mesNoFile db 'File with such name does not exist!', 0Dh, 0Ah, '$'
	file1               db    'alfa.txt', 0
        file2               db    'beta.txt', 0 
	file1Handle dw ? ;описатель первого файла, переданного программе
	file2Handle dw ? ;описатель второго файла, переданного программе
	buffer db k DUP(?) ;буфер, в нем будет содержаться данные из первого файла
        K                   equ   256
        N                   dd    100

CODESEG
start:
	mov ax, @data
	mov ds, ax
file01:
	mov dx, offset mesFile1 ;ввод имени первого файла
	call PrintMessage
	mov bx, offset file1
	call ReadNameOfFile
	mov dx, offset strNewLine
	call PrintMessage

    ;открытие файла alfa.txt для чтения	
	mov dx, offset file1
	mov ax, 3Dh 
        mov al, 0
	int 21h
	jc error1 ;файл не найден
        mov    [file1Handle],ax
           
    ; устанавливаем указатель на N элемент файла alfa.txt
        mov    ah,42h
        mov    al,0
        mov    bx,[file1Handle]
        mov    word PTR dx,N
        mov    word PTR cx, N+2
        int    21h
        jc     error1     

    ; читаем К байт из файла alfa.txt
        mov    ah,3fh
        mov    cx,K
        mov    bx,[file1Handle]
        mov    dx,offset buffer
        int    21h   
        jc     error1

    ;закрытие файла alfa.txt
	mov ah, 3Eh 
	mov bx, [file1Handle]
	int 21h
	jmp file02
error1:
	mov dx, offset mesNoFile
	call PrintMessage
	jmp file01
	
file02:
	mov dx, offset mesFile2 ;ввод имени второго файла
	call PrintMessage
	mov bx, offset file2
	call ReadNameOfFile
	mov dx, offset strNewLine
	call PrintMessage

    ;открытие файла beta.txt для чтения
	mov dx, offset file2
	mov ax, 3Dh 
        mov al, 0
	int 21h
	jc error2 ;файл не найден
        mov [file2Handle], ax

    ; устанавливаем указатель на конец файла beta.txt
        mov   ah,42h
        mov   al,02
        mov   bx,[file2Handle]
        mov   cx, 0
        mov   dx,0
        int   21h

    ; записываем данные в конец файла beta.txt
        mov   ah,40h
        mov   bx,[file2Handle]
        mov   cx,K
        lea   dx,buffer
        int   21h

    ;закрытие файла beta.txt
	mov ah, 3Eh 
	mov bx, [file2Handle]
	int 21h
error2:
	mov dx, offset mesNoFile
	call PrintMessage
	jmp file02

exit:
	mov ax, 4C00h ;выход из программы
	int 21h
INCLUDE 'func.asm'
end start

----------------------------------------------------------------
func.asm

;dx - смещение строки с сообщением, заканчивается на '$' proc PrintMessage
proc PrintMessage PASCAL USES ax
	mov ah, 9
	int 21h
	ret
endp PrintMessage

;bx - смещение строки с именем файла proc ReadNameOfFile
proc ReadNameOfFile PASCAL USES ax
	mov ah, 1 ;ввод имени файла
nextSymbol:
	int 21h
	cmp al, 0Dh
	je done ;нажат enter
	mov [byte ptr bx], al
	inc bx
	jmp nextSymbol
done:
	mov [byte ptr bx], 0 ;
	ret
endp ReadNameOfFile

Последний раз редактировалось Chelmgn; 25.01.2011 в 14:38. Причина: Изменил часть кода и исправил опечатки
Chelmgn вне форума Ответить с цитированием
Старый 28.01.2011, 11:30   #2
Z1000000
Форумчанин
 
Регистрация: 04.05.2010
Сообщений: 495
По умолчанию

Теперь хотя бы транслирует. Сделано в MASM 6.11
Но делает не пойми чего. Дорабатывай.
Код:
data_seg segment

   strNewLine        db      0Dh, 0Ah, '$'
   mesFile1            db      'Enter the name of first file: ', '$'
   mesFile2            db      'Enter the name of second file: ', '$'
   stand_out           equ   1
   K                          equ   256
   file1Handle        dw   ?
   file2Handle        dw   ?
   file1                      db     'alfa.txt', 0
   file2                      db     'beta.txt', 0 
   N                           dw     100
   buffer                   db     K dup (?)


   data_seg ends

  cod_seg segment
          assume cs:cod_seg, ds: data_seg, ss:stack_seg

;func.asm
;dx - смещение строки с сообщением, заканчивается на '$' proc PrintMessage
PrintMessage proc 
	mov ah, 9
	int 21h
	ret
PrintMessage endp 

;bx - смещение строки с именем файла proc ReadNameOfFile
ReadNameOfFile proc
	mov ah, 1 ;ввод имени файла
nextSymbol:
	int 21h
	cmp al, 0Dh
	je done ;нажат enter
	mov byte ptr [bx], al
	inc bx
	jmp nextSymbol
done:
	mov byte ptr [bx], 0 ;
	ret
ReadNameOfFile endp 

   start:
   ; ввод имени первого файла
         mov   dx, offset mesFile1 
         call    PrintMessage
         mov    bx, offset file1
         call    ReadNameOfFile
         mov    dx, offset strNewLine
         call    PrintMessage

   ; открываем файл alfa.txt
           mov   ah,3dh
           mov   al,0
           mov   dx,offset file1
           int      21h 
           jc       err1
           mov [file1Handle],ax

   ; устанавливаем указатель на N элемент файла alfa.txt
          mov    ah,42h
          mov    al,0
          mov    bx,[file1Handle]
          mov    word PTR dx,N
          mov    word PTR cx, N+2
          int       21h
          jc        err1      

   ; читаем К байт из файла alfa.txt
          mov    file1Handle,ax
          mov    ah,3fh
          mov    cx,K
          mov    bx,[file1Handle]
          mov    dx,offset buffer
          int      21h   
          jc        err1

   ; закрытие файла   
          mov   ah, 3Eh 
          mov   bx, [file1Handle]
          int    21h

   ; ввод имени второго файла
          mov   dx, offset mesFile2 
          call   PrintMessage
          mov   bx, offset file2
          call   ReadNameOfFile
          mov   dx, offset strNewLine
          call   PrintMessage

   ;  открываем файл beta.txt
           mov   ah,3dh
           mov   al,0
           mov   dx,offset file2
           int      21h 
           jc       err1

   ; устанавливаем указатель на конец файла beta.txt
          mov   ah,42h
          mov   al,02
          mov   bx,[file2handle]
          mov   cx, 0
          mov   dx,0
          int     21h

  ; записываем данные в конец файла beta.txt
         mov   ah,40h
         mov   bx,stand_out
         mov   cx,K
         lea     dx,buffer
         int      21h
        jc         err1 

 ; закрытие файла
        mov    ah, 3Eh
        mov   bx, [file2Handle]
        int     21h

 err1:
       mov al,1
       ret

; выход в BIOS
        mov   ax, 4C00h ;выход из программы
        int    21h

    cod_seg         ends
 
    stack_seg     segment para stack "stack"
                           dw 50 dup(?)
    stack_seg     ends
 end   start
Код:
.\bin\ml.exe /c 1.asm 1.obj
.\bin\link.exe 1.obj,1.exe,,,,
pause
Нажми на весы, поставь +
Для благодарностей : WebMoney WMR R252732729948
Z1000000 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Текстовые файлы. dima-intro Помощь студентам 3 31.12.2010 16:09
Текстовые файлы Asira Помощь студентам 3 29.06.2010 10:50
Текстовые файлы Asira Помощь студентам 0 21.06.2010 15:52
Текстовые файлы (C++) -=DOBRO=- Помощь студентам 16 24.12.2009 22:34
ФАЙЛЫ текстовые morgan996 Помощь студентам 0 19.12.2009 00:08