· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Вопрос о запуске файлов

Посл.отвђт Сообщенiе


Дата: Май 29, 2003 11:45:47

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

Насколко я понимаю для запуска файла используеться прерывание int 21h c ah 0BH и al 00 и в качестве параметров передаються
ds:dx абсолютный путь к файлу ("e:\soft\bin\binary.exe")
es:bx блок параметров окружения, в который входят:
1. сегментный адресс окружения - 000 для текущего (как и зачем может понадобиться другой? как его составлять?)
2. адресс командной строки для нового процесса (в примере
offset comline,0
где
comline db 125.
непонятно зачем это надо. обьясните если не сложно.
)
3.Адресс первого и второго FCB
(записано в примерах как
dw 005ch,0,006ch,0
но я отже пока не разобрался где тут что)

Написал програму с помощью листинга и соответствующих глав книги. Естествеено не работает. Пишет "Файл не найден". хотя путь вроде бы указал верно. В чем я ошибся? Помогите плз разобраться с этой ф-ей. С уважением Ворон.

Листигн:

.386

stacks segment stack 'STACK' use16
db 100h dup (?)
stacks ends

codes segment 'code' use16
assume cs:codes,es:datas,ds:datas

begin:

mov ah,00h
mov al,3d
int 10h

mov ax,seg datas
mov es,ax
mov ax,seg datas
mov ds,ax
mov ax,4b00h
mov dx,offset way
mov bx,offset EPB
int 21h


jc erro


mov ah,4ch
int 21h

erro:

cmp ax,02h
jnz error1

cmp ax,05h
jnz error2

cmp ax,08h
jnz error3

cmp ax,0ah
jnz error4

cmp ax,0bh
jnz error5

mov ax,seg datas
mov es,ax

mov ah,13h
mov al,01h
mov cx,fuerrl
mov dx,0
mov bl,00001111b
mov bp,offset fuerr
int 10h

mov ah,4ch
int 21h

error1:

mov ax,seg datas
mov es,ax

mov ah,13h
mov al,01h
mov cx,ferr1l
mov dx,0
mov bl,00001111b
mov bp,offset ferr1
int 10h

mov ah,4ch
int 21h

error2:
mov ax,seg datas
mov es,ax

mov ah,13h
mov al,01h
mov cx,ferr2l
mov dx,0
mov bl,00001111b
mov bp,offset ferr2
int 10h

mov ah,4ch
int 21h


error3:
mov ax,seg datas
mov es,ax

mov ah,13h
mov al,01h
mov cx,ferr3l
mov dx,0
mov bl,00001111b
mov bp,offset ferr3
int 10h

mov ah,4ch
int 21h

error4:
mov ax,seg datas
mov es,ax

mov ah,13h
mov al,01h
mov cx,ferr4l
mov dx,0
mov bl,00001111b
mov bp,offset ferr4
int 10h

mov ah,4ch
int 21h

error5:
mov ax,seg datas
mov es,ax

mov ah,13h
mov al,01h
mov cx,ferr5l
mov dx,0
mov bl,00001111b
mov bp,offset ferr5
int 10h


mov ah,4ch
int 21h


codes ends


datas segment 'DATA' use16

ferr1 db "ERROR: file not found.",0dh,0ah
ferr1l equ $-ferr1
ferr2 db "ERROR: asses denied.",0dh,0ah
ferr2l equ $-ferr2
ferr3 db "ERROR: not enought memory.",0dh,0ah
ferr3l equ $-ferr3
ferr4 db "ERROR: wrong envirment.",0dh,0ah
ferr4l equ $-ferr4
ferr5 db "ERROR: wrong format.",0dh,0ah
ferr5l equ $-ferr5
fuerr db "Unknown error.",0dh,0ah
fuerrl equ $-fuerr

way db "e:\timer5.com",0
wayl equ $-way
EPB dw 0000
dw offset comline,0
dw 005ch,0,006ch,0
comline db 125

datas ends


end


Дата: Май 29, 2003 19:25:34

В начале программы вызови int 21 с параметрами:
ah=4ah(изменить размер блока памяти)
bx=длина программы в параграфах(включая стек и PSP)
es=указатель на блок памяти занимаемый программой (PSP, в начале выполнения программы на него указывают es и ds)
При загрузке программе выделяется наибольший свободный блок памяти, после вызова данной функции программа станет занимать равно столько памяти, сколько ей требуется, а в освободившуюся память можно будут загрузить другую программу.
PS: А блок параметров можешь полностью обнулить, если тебе не требуется передавать программе параметры.


Дата: Май 30, 2003 19:41:36

2Black_mirror:
1. Извни за такой вопрос, но я прокопался несколько часов и так и несмог понять как получить размер кода :(
В учебниках такого не нашол в топиках тоже...
Про бывал сделать что то типа:
pr_length equ $-begin-200h
(100h psp, 100h stack) но ничего не получилось - это работает только в пределах одного сегмента :( пытался что то подобное сделать в каждом сегменте и сложить но запутался...
еще смотрел в псп - там по +02h должно лежать адресс первого байта после памяти выд. на програму, но ведь это "адрес после наибольшего свободного адресса памяти" и его использовать не имеет смысла ?
Обьясни пожалуста как это делают нормальные люди или пошли где почитать...

2. А как наличие/отсутствие свободной памяти может привести к полученой ошибке?
ferr1 db "ERROR: file not found.",0dh,0ah

С уважением и надеждой на ответ. Ворон


Дата: Май 30, 2003 19:47:05

2Black_mirror:
1. Извни за такой вопрос, но я прокопался несколько часов и так и несмог понять как получить размер кода :(
В учебниках такого не нашол в топиках тоже...
Про бывал сделать что то типа:
pr_length equ $-begin-200h
(100h psp, 100h stack) но ничего не получилось - это работает только в пределах одного сегмента :( пытался что то подобное сделать в каждом сегменте и сложить но запутался...
еще смотрел в псп - там по +02h должно лежать адресс первого байта после памяти выд. на програму, но ведь это "адрес после наибольшего свободного адресса памяти" и его использовать не имеет смысла ?
Обьясни пожалуста как это делают нормальные люди или пошли где почитать...

2. А как наличие/отсутствие свободной памяти может привести к полученой ошибке?
ferr1 db "ERROR: file not found.",0dh,0ah

С уважением и надеждой на ответ. Ворон.


Дата: Май 30, 2003 20:21:14

1. Размер программы можно вычислить так:
mov bx,lastsegment
add bx,(lastsegmentsize+15)/16; +15 для округления в большую сторону
mov ax,PSP; =es=ds в начале выполнения программы
sub bx,ax; длина программы

обычно последним сегментом программы является стек

2. Думаю что он на самом деле не найден. Попробуй все таки обнулить блок параметров.


Дата: Май 31, 2003 14:33:35

УВАААААА!!!! Заработало!!!
Спасибо великий и могучий Black_mirror (это как то связано с мофологией ацтеков?). Пусть никогда не обойдет благодатью тебя Великий Сервер!!!
Что сделал:
1. Дописал в начале:
dosseg
попозжее:
mov bp,offset PSP
mov [bp],es

mov bx,stacks
add bx,(100h+15)/16
mov ax,[bp]
sub bx,ax

mov ah,4ah
int 21h
и в самом конце:
EPB dw 0000
dw 0000
dw 0000
PSP db (?)

Что интересно с адресом ничего не делал... Похоже тут все же есть каккая то связь (с просто нулевым блоком параметров EPB получал ту же ошибку).
С благодарностью и уважением. Ворон.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.048