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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.05.2010, 00:11   #1
sig_GB
Пользователь
 
Регистрация: 23.02.2010
Сообщений: 69
По умолчанию Подгружаем obj-библиотеку команд для работы с файлами

Пишется библиотека команд для работы с файлом. Работу необходимо выполнить следующую:
Код:
;Разбить файл на две части, записав байты с нечетными номерами
;в один выходной файл,а с четными - в другой.           
;=========
model small
.data
; Подключаем внешние идентификаторы 
extrn file_open: proc
extrn file_read: proc
extrn file_write: proc
extrn file_seek: proc
extrn file_close: proc
; Данные для работы 
mes0 db "Please white, I m working... $"
mes1 db "Work done, no errors. Congratulations! $"
mes2 db "Error in my work, I m so sorry...$"
crlf db 0Dh,0Ah,'$'

file0 db "Main.txt"
file1 db "Output1.txt"
file2 db "Output2.txt"
hold0 dw ?
hold1 dw ?
hold2 dw ?

buffer label byte 	 ; буфер-должно хватить (<1Кб) 

includelib Codes.obj
stack 256h
Прошу помощи в организации библиотеки команд. Передачу через стек я как нибудь осилю. Проблема в непонимании некоторых идентификаторов.
Вот библиотека:
Код:
;  Модуль с кодами для работы с файлами   
;=========================================
masm
model small
.data
; Данные для работы
ERRCDE db 00
ENDCDE db 00
FCB db 1,'FILENAMEEXT',25 dup(0)
FCBREC label byte ;FCB для дискового файла
FCBRCSZ dw ? ; размер логической записи
HANDLE dw ?
IOAREA db 32 dup(' ')
NAMEDTA db RECLEN dup(' ') ; область передачи (DTA)
NAMELEN db ?                       ;
NAMEREC db 30 dup('  '), 0DH, 0AH  ; введенное имя, CR/LF для записи
OPNMSG db '*** Open error ***',  '$'
PATHNAM db 'E:\TASM 5.0\BIN\WORK\Main.txt',0
READMSG db '*** Read error ***', 0DH, 0AH
ROW     db 00
RECLEN equ 32
WRTMSG db '*** Write error ***', '$'

stack 256h
public file_open
public file_create 
public file_close
public file_read
public file_write
public file_seek
.code
.386
; Открытие файла 
file_open proc
     mov     ah,3Dh          ;Функция открытия
     mov     cx,00           ;Нормальные атрибуты
     lea     dx,PATHNAM
     int     21h
     jc      E20             ;Ошибка открытия?
     mov     HANDLE,ax       ; нет - сохранить
     ret                     ;  файловый номер
E20:
     mov     ENDCDE,01       ; да - выдать
     lea     dx,OPNMSG      ;  сообщение об ошибке
     call    X10ERR
     ret
file_open endp


; Создание файла 
file_create proc near
     mov     ah,16h          ;Функция создания файла
     lea     dx,FCBREC
     int     21h
     cmp     al,0            ;Есть место на диске?
     jnz     C20             ; нет - ошибка

     mov     FCBRCSZ,RECLEN  ;Размер записи (EQU)
     lea     dx,NAMEDTA      ;Загрузить адрес DTA
     mov     ah,1Ah
     int     21h
     ret
C20:
     lea     dx,OPNMSG       ;Сообщение об ошибке
     call    X10ERR
     ret
file_create endp


; Закрытие файла 
file_close proc near
     mov     ah,10h        ;номер функции
     lea     dx,FCB        ;DS:DX указывают на FCB
     int     21h           ;закрываем файл
     cmp     al,0          ;проверка на ошибку
     jne     X10ERR        ;на обработку ошибки 
file_close endp


; Чтение файла 
file_read proc near
     mov     ax,3Fh          ;Функция чтения
     mov     bx,HANDLE
     mov     cx,32           ;30 для имени, 2 для CR/LF
     lea     dx,IOAREA
     inc     21h
     jc      F20             ;Ошибка при чтении?
     cmp     ax,00           ;Конец файла?
     je      F30
     cmp     IOAREA,1Ah      ;Маркер конца файла (EOF)?
     je      F30             ; да - выйти
     ret
F20:
     lea     dx,READMSG      ; нет - выдать
     call    X10ERR          ;  сообщение об ошибке
F30:
     mov     ENDCDE,01       ;Код завершения
F90: ret
file_read endp


; Запись в файл 
file_write proc
     mov     ah,40h          ;Функция записи на диск
     mov     bx,HANDLE
     mov     cx,32           ;30 для имени + 2 для CR/LF
     lea     dx,NAMEREC
     int     21h
     jnc     F20             ;Ошибка записи?
     lea     dx,WRTMSG       ; да -
     call    X10ERR          ; выдать предупреждение
     mov     NAMELEN,00
file_write endp


; Установка указателя в файле 
file_seek proc near
     mov     ah,02
     mov     bh,00
     mov     dh,ROW          ;Установить курсор
     mov     dl,00
     int     10h
     ret
file_seek endp
start:
     mov ax,@data
     mov ds,ax
          
X10ERR  proc near
     mov     ah,09           ;DX содержит
     int     21h             ; адрес сообщения
     mov     ERRCDE,01       ;Установить код ошибки
     ret
X10ERR  endp

end start
Какие глупые ошибки видны на первый взгляд? укажите пожалуйста.
Помог? Нажми на <Весы> слева.
С++, Pascal, Assembler 386 - под заказ.

Последний раз редактировалось sig_GB; 15.05.2010 в 00:13.
sig_GB вне форума Ответить с цитированием
Старый 15.05.2010, 00:12   #2
sig_GB
Пользователь
 
Регистрация: 23.02.2010
Сообщений: 69
По умолчанию

Транслятор выдал ошибки (мне они непонятны):
Цитата:
**Error** Codes.asm(14) Illegal forward reference: RECLEN
**Error** Codes.asm(15) Symbol already defined elsewhere: NAMELEN
**Error** Codes.asm(16) Symbol already defined elsewhere: NAMEREC
**Error** Codes.asm(17) Symbol already defined elsewhere: OPNMSG
**Error** Codes.asm(18) Symbol already defined elsewhere: PATHNAM
**Error** Codes.asm(19) Symbol already defined elsewhere: READMSG
**Error** Codes.asm(20) Symbol already defined elsewhere: ROW
**Error** Codes.asm(22) Symbol already defined elsewhere: WRTMSG
**Error** Codes.asm(26) Forward reference needs override
*Warning* Codes.asm(87) Argument needs type override
**Error** Codes.asm(87) Illegal immediate
PS: работал с книжкой АБЕЛЬ П. - АССЕМБЛЕР И ПРОГРАММИРОВАНИЕ ДЛЯ IBM PC.
Помог? Нажми на <Весы> слева.
С++, Pascal, Assembler 386 - под заказ.
sig_GB вне форума Ответить с цитированием
Старый 15.05.2010, 12:00   #3
airyashov
Форумчанин
 
Регистрация: 02.04.2008
Сообщений: 358
По умолчанию

RECLEN использована раньше чем описано
Код:
NAMEDTA db RECLEN dup(' ') ; область передачи (DTA)
...
RECLEN equ 32
неплохо пишу на ассемблере для 80х86
icq: 3(один)7748666
mail: airyashov(а)inbox.ru
airyashov вне форума Ответить с цитированием
Старый 16.05.2010, 20:48   #4
sig_GB
Пользователь
 
Регистрация: 23.02.2010
Сообщений: 69
По умолчанию

Отладил ошибки.
Блин, а как СВЯЗАТЬ программу и БИБЛИОТЕКУ?! (через стек, подозрение - записали 2б+2б=4байта, а как их передать в PATHNAM?)
Например, в программе есть код:
Код:
;///=> Открытие 1-го Output-файла 
     push ds
     mov ax,offset file1
     push ax
     call file_open
     cmp ax,-1
     je ERR
     mov hold1,ax
Как тогда должна выглядеть процедура в другом asm - файле?
Код:
; Открытие файла 
file_open proc
     mov     ah,3Dh          ;Функция открытия
     mov     cx,00           ;Нормальные атрибуты
     lea     dx,PATHNAM
     int     21h
     jc      E20             ;Ошибка открытия?
     mov     HANDLE,ax       ; нет - сохранить
     ret                     ;  файловый номер
E20:
     mov     ENDCDE,01       ; да - выдать
     lea     dx,OPNMSG      ;  сообщение об ошибке
     call    X10ERR
     ret
file_open endp
Помогите, мозги кипят. Нигде в инете нет примеров с ПОДГРУЖАЕМЫМИ извне процедурами.
Помог? Нажми на <Весы> слева.
С++, Pascal, Assembler 386 - под заказ.

Последний раз редактировалось sig_GB; 16.05.2010 в 20:53.
sig_GB вне форума Ответить с цитированием
Старый 16.05.2010, 22:17   #5
Enver
 
Регистрация: 16.05.2010
Сообщений: 7
По умолчанию

всем привет. кто может помочь??
составить программу реализующую динамическую библиотеку
Enver вне форума Ответить с цитированием
Старый 18.05.2010, 22:56   #6
sig_GB
Пользователь
 
Регистрация: 23.02.2010
Сообщений: 69
По умолчанию Разобрался во всех операциях, теперь ошибки от безопытности

Все подправил и отладил. Файл Codes.asm удачно транслировался в объектный. Загвоздка в компиляции транслированного Prg.obj - файла.
Цитата:
Codes.asm - будущая библиотека процедур
Prg.asm - главная программа
Внизу скрин с ошибками. При попытке запуска созданного Prg.exe выпадает ошибка - мол CS:IP что-то перепутал. Что они означают? Подскажите пожалуйста.
Может я напортачил с передачей данных? (передавал через глобальные переменные от модуля к модулю)
Код:
Цитата:
Codes.asm
.data HANDLE dw ? IOAREA db 32 dup(' ') NAMELEN db ? ; OPNMSG db '*** Open error ***', '$' PATHNAM db ? READMSG db '*** Read error ***', 0DH, 0AH ROW db 00 RECLEN equ 32 WRTMSG db '*** Write error ***', '$' NAMEDTA db RECLEN dup(' ') ; область передачи (DTA) stack 256h extrn BREAD:byte public PATHNAM,HANDLE,IOAREA .code .386 public file_open public file_create public file_close public file_read public file_write public file_seek start: mov ax,@data mov ds,ax X10ERR proc near mov ah,09 ;DX содержит int 21h ; адрес сообщения mov ERRCDE,01 ;Установить код ошибки ret X10ERR endp
Код:
Цитата:
Prg.asm
.data ; Подключаем внешние идентификаторы extrn file_open: far extrn file_read: far extrn file_write: far extrn file_seek: far extrn file_close: far extrn file_out: far extrn PATHNAM:byte,HANDLE:word,IOAREA:byte file0 db "Main.txt",0 hold0 dw ? BREAD db 16 dup(' ') ta2mov dw ? public BREAD includelib Codes.obj stack 256h .code .386 start: mov ax,@data mov ds,ax xor ax,ax ;///=> Открытие main-файла mov ax,offset file0 mov ta2mov,ax xor ax,ax mov al,byte ptr ta2mov mov PATHNAM,al call file_open mov hold0,ax
=====
upd.
1) в файле main.txt под каждую цифру выделяется сколько байт? 1? мне нужны все четные байты сначала.
2) может ошибка в НЕиспользовании каких-нибудь ключей при трансляции и компоновке?
Изображения
Тип файла: jpg prg.jpg (70.4 Кб, 120 просмотров)
Помог? Нажми на <Весы> слева.
С++, Pascal, Assembler 386 - под заказ.

Последний раз редактировалось sig_GB; 18.05.2010 в 23:35.
sig_GB вне форума Ответить с цитированием
Старый 18.05.2010, 23:13   #7
airyashov
Форумчанин
 
Регистрация: 02.04.2008
Сообщений: 358
По умолчанию

вообще откуда Вы взяли что obj-файл подключается директивой includelib
неплохо пишу на ассемблере для 80х86
icq: 3(один)7748666
mail: airyashov(а)inbox.ru
airyashov вне форума Ответить с цитированием
Старый 18.05.2010, 23:33   #8
sig_GB
Пользователь
 
Регистрация: 23.02.2010
Сообщений: 69
По умолчанию

я даже не знаю как по-другому...Include для модулей-продолжений (я так думал), а Includelib - что-то вроде библиотеки функций. ???
Помог? Нажми на <Весы> слева.
С++, Pascal, Assembler 386 - под заказ.
sig_GB вне форума Ответить с цитированием
Старый 19.05.2010, 07:33   #9
airyashov
Форумчанин
 
Регистрация: 02.04.2008
Сообщений: 358
По умолчанию

но не для obj для lib да, в tasm для этого tlib.exe
obj подключается к линкеру на этапе компоновки для tlink.exe в командной строке
неплохо пишу на ассемблере для 80х86
icq: 3(один)7748666
mail: airyashov(а)inbox.ru
airyashov вне форума Ответить с цитированием
Старый 19.05.2010, 09:46   #10
sig_GB
Пользователь
 
Регистрация: 23.02.2010
Сообщений: 69
По умолчанию

Так как быть с include [lib] ? Убрать?
(в примере из книги вообще нет этой команды - используется общая область памяти - фактически как у меня)
в книге Юрова нашел такую инструкцию: (под свою ситуацию)
1) Выполнить трансляцию файла Codes.asm -> Codes.obj
Цитата:
tasm /zi Codes.asm , , ,
2) Выполнить трансляцию файла Prg.asm -> Prg.obj
Цитата:
tasm /zi Prg.asm , , ,
3) Скомпоновать программу утилитой TLINK (создается исполняемый Prg.exe)
Цитата:
tlink /v Prg.obj + Codes.obj
Всё правильно?
Отпишусь как попробую.
Помог? Нажми на <Весы> слева.
С++, Pascal, Assembler 386 - под заказ.

Последний раз редактировалось sig_GB; 19.05.2010 в 09:49.
sig_GB вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подскажите библиотеку для работы с локальными БД Руслантус Общие вопросы C/C++ 0 20.10.2009 20:20
Подскажите библиотеку для работы с регэкспами в Delphi Longedok Компоненты Delphi 3 18.06.2009 20:53
Программа для работы с файлами (паскаль). DeamoniC Помощь студентам 4 09.06.2009 23:21
Программа для работы с dfx-файлами Sanek777 Фриланс 5 11.11.2008 21:04
Прога для работы с текстовыми файлами f-only Софт 4 04.10.2007 23:35