|
|
| Посл.отвђт | Сообщен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 |