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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2013, 13:01   #1
Андрос
Пользователь
 
Регистрация: 19.04.2009
Сообщений: 45
По умолчанию прога с 2 оверлеями. Ищем ошибку(

Всем привет, нужна помощь Вот условие, я вроде написал но препод забраковал, помогите найти ошибку, очень надо, программа должна быть уже сдана, но я не знаю в чем прокол...Жирным выделил то что подчеркнул препод. Ребята, помогите исправить :
Составить программу с двумя оверлеями. Если нажата клавиша V, то вызвать
оверлей вывода текстового файла file.txt на экран дисплея. Если нажать P, то
вызвать оверлей для печати файла file.txt на принтере. Прерывание по Esc.
Андрос вне форума Ответить с цитированием
Старый 15.01.2013, 13:03   #2
Андрос
Пользователь
 
Регистрация: 19.04.2009
Сообщений: 45
По умолчанию

Код:
model small
.stack 256
.data

; пустой сегмент в конце программы
zseg segment
zseg end
	
overlay1_seg dw ?
overlay2_seg dw ?

; смещения оверлеев
overlay1_offset dw ?
overlay2_offset dw ?

; сегмент оверлея
code_seg dw ?

; путь к программам оверлеев
path1 db 'C:\overlay1.exe',0
path2 db 'C:\overlay2.exe',0

; 4-байтный блок параметров
block dd 0

.code

main:
; освобождаем память

mov code_seg, cs
; вычисляем размер памяти
mov ax,es
mov bx,zseg
sub bx,ax
; прерывание по выделению памяти
mov ah,4ah
int 21h
jc lab_error

;;;;;;;;первый оверлей
; освобождаем память для первого оверлея
mov bx,100h
mov ah,48h
int 21h
jc lab_error
; сохраняем адрес сегмента оверлея
mov overlay1_seg,ax
; вычисляем смещение оверлея
mov ax,code_seg
mov bx,overlay1_seg
sub bx,ax
; получаем значение в байтах
mov cl,4
shl bx,cl
mov overlay1_offset,bx
; загружаем первый оверлей
mov ax,seg block
mov es,ax
mov bx,offsef block
mov ax,overlay1_seg 
mov [bx],ax ; первое слово блока параметров
mov [bx]+2,ax ; сегмент оверлея
; загружаем путь к оверлею
lea dx,path1
; вызываем прерывание
mov ah,48h
mov al,3 ; код загрузки оверлея
int 21h
jc lab_error


;;;;;;;;второй оверлей
mov ax,es
mov bx,zseg
add bx,100h ; добавляем размер памяти первого оверлея
sub bx,ax

; освобождаем память для второго оверлея
mov bx,100h
mov ah,48h
int 21h
jc lab_error
; сохраняем адрес сегмента оверлея
mov overlay2_seg,ax
; вычисляем смещение оверлея
mov ax,code_seg
mov bx,overlay2_seg
sub bx,ax
; получаем значение в байтах
mov cl,4
shl bx,cl
mov overlay2_offset,bx
; загружаем второй оверлей
mov ax,seg block
mov es,ax
mov bx,offsef block
mov ax,overlay2_seg 
mov [bx],ax ; первое слово блока параметров
mov [bx]+2,ax ; сегмент оверлея
; загружаем путь к оверлею
lea dx,path2
; вызываем прерывание
mov ah,48h
mov al,3 ; код загрузки оверлея
int 21h
jc lab_error

; выполнение основной программы
sub ax,ax

lab_cicle:
; ожидаем нажатия клавиши
mov ah,1
int 21h
; проверка на нажатие функциональной клавиши
cmp al,0
je lab_fun ; нажата функциональная клавиши
cmp al,'F'
je lab_over1 ; для первого оверлея
cmp al,'C'

Код:
je lab_over2 ; для второго оверлея
jmp lab_cicle
lab_fun:
; читаем код нажатой функциональной клавиши 
mov ah,1
int 21h 
cmp al,1; нажата Esc
je lab_exit
jmp lab_cicle

; запускаем первый оверлей
lab_over1:
call dword ptr overlay1_offset
jmp lab_exit

; запускаем второй оверлей
lab_over2:
call dword ptr overlay2_offset
jmp lab_exit

; выход из программы
lab_exit:
sub ax,ax
mov ah,4ch
int 21h
end main

; программа первого оверлея

model small
.stack 256
.data
filepath db 'c:\f.txt',0 ; путь к файлу
filedlin db 0 ; длина фйла

Код:
handle dw 0	 ; дескриптор файла
buf db (?)
.code

overlay1 proc far
assume cs:code, ds:data

; сохраняем ds вызывающей программы
push ds
mov ax,@data
mov ds,ax
; вывод текстового файла на дисплей 
; открытие файла 
lea dx, filepath
mov al,0 ; открытие для чтения
mov ah,3dh
int 21h
jc lab_error
mov handle,ax ;сохраняем номер файла
;получаем длину файла	
;установка файлового указателя на конец файла
mov bx,handle
mov cx,0 ;CX:DX дают смещение относительно конца
mov dx,0
mov al,2 ;код для конца файла
mov ah,42h ;функция установки указателя
int 21h ;устанавливаем указатель
jc lab_error
mov filedlin,dx ;в dx длина файла

mov si,0
mov cx,filedlin ; цикл на количество байт
pop cx

Последний раз редактировалось Андрос; 15.01.2013 в 13:07.
Андрос вне форума Ответить с цитированием
Старый 15.01.2013, 13:03   #3
Андрос
Пользователь
 
Регистрация: 19.04.2009
Сообщений: 45
По умолчанию

Продолжение
Код:
mov bx,handle
mov cx,0 ;CX:DX дают смещение относительно конца
mov dx,0
mov al,0 ;код для начала файла
mov ah,42h ;функция установки указателя
int 21h ;устанавливаем указатель
jc lab_error
lab_cicle:
push cx
mov ah,3fh
lea dx,buf
mov bx,handle
mov cx,1 ; читаем по одному байту
int 21h
; символ в buf 
sub ax,ax
sub dx,dx
; выводим очередной символ на экран
mov dl,buf
mov ah,02h
int 21h 
; 
pop cx
inc si ; переходим к следующему символу в строке
loop lab_cicle

; закрываем файл
mov bx,handle ;номер файла
mov ah,3eh ;функция закрытия файла
int 21h


pop ds
overlay1 endp
end

; программа второго оверлея

model small
.stack 256
.data
filepath db 'c:\f.txt',0 ; путь к файлу
filedlin db 0 ; длина фйла

Код:
handle dw 0	 ; дескриптор файла
buf db (?)

.code

overlay2 proc far
assume cs:code, ds:data
; сохраняем ds вызывающей программы
push ds
mov ax,@data
mov ds,ax
; выдача текстового файла на печать
; инициализация LPT1
mov ah,1 ;функция инициализации принтера
mov dx,0 ;LPT1
int 17h ;проводим инициализацию
; открытие файла 
lea dx, filepath
mov al,0 ; открытие для чтения
mov ah,3dh
int 21h
jc lab_error
mov handle,ax ;сохраняем номер файла
;получаем длину файла	
;установка файлового указателя на конец файла
mov bx,handle
mov cx,0 ;CX:DX дают смещение относительно конца
mov dx,0
mov al,2 ;код для конца файла
mov ah,42h ;функция установки указателя
int 21h ;устанавливаем указатель
jc lab_error
mov filedlin,dx ;в dx длина файла

mov si,0
mov cx,filedlin ; цикл на количество байт
pop cx

mov bx,handle
mov cx,0 ;CX:DX дают смещение относительно конца
mov dx,0
mov al,0 ;код для начала файла
mov ah,42h ;функция установки указателя
int 21h ;устанавливаем указатель
jc lab_error
lab_cicle:
push cx
mov ah,3fh
lea dx,buf
mov bx,handle
mov cx,1 ; читаем по одному байту
int 21h
; символ в buf
sub ax,ax
sub dx,dx
; выводим символ на печать
mov dx,0
mov ah,0 ;функция посылки символа на принтер
mov al,buf ;символ
int 17h ;посылаем символ
pop cx
inc si ; переходим к следующему символу в строке
loop lab_cicle

; закрываем файл
mov bx,handle ;номер файла
mov ah,3eh ;функция закрытия файла
int 21h

pop ds
overlay2 endp
end

Последний раз редактировалось Андрос; 15.01.2013 в 13:09.
Андрос вне форума Ответить с цитированием
Старый 16.01.2013, 00:28   #4
Андрос
Пользователь
 
Регистрация: 19.04.2009
Сообщений: 45
По умолчанию

Тема UP! кто нибудь помогите исправить ошибки в программе(
Андрос вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прога выдает ошибку file not open!!! Anytocccchka Помощь студентам 5 20.12.2010 08:18
Не могу найти ошибку в коде!!! Прога элементарная!Помощ нужна! Fresh_MaN Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 11.04.2010 11:13
прога на Паскале помогите исправить ошибку:( Jeksik Помощь студентам 4 14.10.2008 18:21
прога и чюжая прога benjaminfran Общие вопросы Delphi 5 28.03.2008 15:07
прога пишет ошибку при открытии файла (почему?) nicky777 Общие вопросы Delphi 2 14.03.2008 17:56