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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.06.2014, 14:00   #1
Илья РООгулин
Пользователь
 
Регистрация: 07.01.2012
Сообщений: 17
Вопрос assembler

прошу помощи профессионалов. в общем есть некий текстовый файл. мы читаем его содержимое скомпилированным файлом ассемблера. преподаватель сказал, чтобы текстовый файл превращался в com-файл. выполнение полученного com-файла позволяет просмотреть исходный текст.

есть код открытия файла, а вот с изменением расширения никак не могу понять, что к чему.

Код:
.model small; модель памяти 
.stack 100h; установка размера стека 100h
.data; начало сегмента данных 
 
cr      equ     0dh;возврат каретки
lf      equ     0ah;подача строки
 
 
;данные
MSG db cr,lf,'Enter path to file: $'
ErrorOpenFile db cr,lf,'Error! Unable to open file!$'
EndF db cr,lf, 'Reading the file is complete!$'
 
 
HANDLE dw ?                             
symbol db ?
fn db 255 dup(0)
 
.code;начало сегмента кода
 
main:
        mov ax, @data;настройка сегментного регистра
        mov ds, ax;устновка регистра ds на сегмент данных
    
        push ds
        pop es
        lea di,fn
 
;установка курсора
        mov ah,02h                      
        mov bh,00                       
        mov dh,09h                      
        mov dl,01h                      
        int 10h
    
    ; Выводим приглашение
        mov ah,09h
        lea dx, MSG
        int 21h
 
    ; начинаем ввод имени файла 
again:
        mov ah,00h
        int 16h
        mov ah, 0eh
        int 10h
        cmp al,13
        je open_file
        stosb
        jmp again
    
open_file:
    ; открытие файла 
        mov ah, 3dh
    mov al, 00h
    lea dx, fn
        int 21h
    
    ; проверяем, открылся ли файл        
        lea dx, ErrorOpenFile
        jc open_error   ; нет, не открылся - ошибка
    
    ; Открылся, продолжаем
        mov HANDLE, ax
    
    ; читаем из файла
read:
        mov ah, 3fh
        mov bx, HANDLE
        mov cx,1                        
        lea dx,symbol           
        int 21h
 
        jc exit                         
 
;проверка количества прочитанных символов
        cmp ax,cx                       
                                                
 
;загрузка адреса сообщения об окончании работы
        lea dx, EndF            
        jnz endFile
 
        
        
        mov al,symbol           
        mov bx, 07h                      
        push ax                         
        
;вывод символов через прерывание 10h
        mov ah, 09h                     
        mov al, 20h                     
        int 10h                         
        
        pop dx                          
 
;проверка кода "в начало строки"        
        cmp dl,0dh                      
        jz read                         
 
;проверка кода "перейти на новую строку"        
        cmp dl,0ah                      
        jnz isOut                       
        
        mov ah,02h                      
        int 21h
        
        mov dl,0dh                      
 
        
isOut:
        mov ah,02h                      
        int 21h                         
        
        jmp read                        
        
        
;запоминание dx для вывода сообщения    
endFile:
        push dx                         
 
        
;закрытие файла
 
        mov ah,3eh                      
        mov bx,HANDLE           
        int 21h                         
        
        
        ;xor ax,ax
        ;int 16h
        
        xor ax,ax
        int 16h
;вывод сообщения об ошибке открытия файла
open_error:
        mov ah,09h
        int 21h
        jmp exit
        
 
exit:                                   
        mov ah,49h                      
        int 21h
        
        xor ax,ax                       
        int 16h 
 
        mov ah,4ch;выход
        int 21h
end main

Последний раз редактировалось Илья РООгулин; 05.06.2014 в 14:42.
Илья РООгулин вне форума Ответить с цитированием
Старый 05.06.2014, 14:24   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
чтобы после открытия файла (текстового), он переименовывался в com файл. затем, при открытии com файла, можно было посмотреть содержимое до изменения расширения.
Шта шта???
Можешь дословно сказать фразу препода?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.06.2014, 14:37   #3
Илья РООгулин
Пользователь
 
Регистрация: 07.01.2012
Сообщений: 17
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Шта шта???
Можешь дословно сказать фразу препода?

текстовый файл в com-файл. выполнение полученного com-файла позволяет просмотреть исходный текст.
Илья РООгулин вне форума Ответить с цитированием
Старый 05.06.2014, 15:01   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А-а-а... Вон чего... Типа упаковщик текста нужно сотворить...
Лихое задание, впрочем не самое сложное.
Я могу теоретически попробовать показать само формирование СОМ исполнителя, наделенного неким текстом, но время на написание примера нужно, учитывая что я не особо специализируюсь в ассемблере.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.06.2014, 15:03   #5
Илья РООгулин
Пользователь
 
Регистрация: 07.01.2012
Сообщений: 17
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А-а-а... Вон чего... Типа упаковщик текста нужно сотворить...
Лихое задание, впрочем не самое сложное.
Я могу теоретически попробовать показать само формирование СОМ исполнителя, наделенного неким текстом, но время на написание примера нужно, учитывая что я не особо специализируюсь в ассемблере.
буду рад любой помощи.
Илья РООгулин вне форума Ответить с цитированием
Старый 05.06.2014, 16:14   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Вот. На скорую руку накидал.
Код:
format PE console
entry start
 
include 'D:\fasmw16726\INCLUDE\win32a.inc'
 
section '.data' data readable writeable

ffile db 'd:\1\q.txt',0
fdest db 'd:\1\q.com',0
testa db '$'
msg db 100 dup(0)
scode db 4dh, 5ah, 3fh,  00h, 01h,  00h, 00h, 00h,  02h, 00h,  00h, 01h,  0ffh, 0ffh, 02h, 00h,\
         00h, 10h, 00h,  00h, 00h,  00h, 00h, 00h,  1ch, 00h,  00h, 00h,  00h,  00h,  00h, 00h ,\
         0eh, 1fh, 0b4h, 09h, 0bah, 14h, 00h, 0cdh, 21h, 0b4h, 01h, 0cdh, 21h,  0b4h, 4ch, 0cdh,\
         21h, 0c3h, 00h, 00h

hFSource dd 0
hFDest dd 0
nb dd 0

section '.code' code readable executable

start:
 invoke open,ffile,GENERIC_READ,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0
 mov [hFSource], eax

 invoke open,fdest,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
 mov [hFDest], eax

 invoke read,[hFSource],msg,100,nb,0

 invoke write,[hFDest],scode,52,nb,0
 invoke write,[hFDest],msg,[nb],nb,0
 invoke write,[hFDest],testa,1,nb,0

 invoke clos,[hFDest]
 invoke clos,[hFSource]

  invoke ExitProcess,0
section '.idata' import data readable
library kernel,'kernel32.dll'
 
import kernel,\
       ExitProcess,'ExitProcess',\
       open,'CreateFileA',\
       read,'ReadFile',\
       write,'WriteFile',\
       clos,'CloseHandle'
Не претендую на крутизну, но вроде работает.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.06.2014, 21:27   #7
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Вариант com файла покороче, который переваривает "$" тоже:
Код:
mov     bx, 1
mov     cx, size
mov     dx, text
mov     ah, 40h
int     21h
ret
BB 01 00 B9 xx xx BA 0E 01 B4 40 CD 21 C3 69 + текст
где xx xx - длина текстового файла.

Последний раз редактировалось Somebody; 07.06.2014 в 21:55.
Somebody вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Assembler Nicloe Помощь студентам 0 31.05.2012 14:42
ASSEMBLER AJIUM Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 13 18.03.2010 17:20
Assembler 80 bookkc Софт 0 20.01.2010 15:53
Assembler Натся Помощь студентам 1 22.12.2009 20:04