Узнать длину собственного файла (без Finish equ $ и пр.)

Тема в разделе "WASM.BEGINNERS", создана пользователем _mm_, 14 апр 2011.

  1. _mm_

    _mm_ New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2010
    Сообщения:
    45
    Понимаю, что вопрос достаточно глупый, но никак не могу разобраться. Нужно найти длину собственного запускаемого com-файла, под DOS, без установки различных меток. Насколько я понимаю, в PSP что-то записывается только при работе с другими файлами? Как-то использовать FCB? С этим не до конца разобрался. Направьте, если несложно, в какую сторону копать.
     
  2. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    создай метку или переменную в конце программы. и она будет указывать на конец файла
     
  3. _mm_

    _mm_ New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2010
    Сообщения:
    45
    Я в теме сообщения уже написал, что метки не использовать.
     
  4. emptyHook

    emptyHook New Member

    Публикаций:
    0
    Регистрация:
    9 сен 2010
    Сообщения:
    63
    так а если в лоб через int 21h? тупо берем и получаем размер файла
     
  5. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Да, только сначала нужно получить собственное полное имя. Через PSP и копию области переменных окружения.
     
  6. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    вечно создают проблемы, а зачем подругому?
     
  7. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Проверить целостность и т.п.
     
  8. _mm_

    _mm_ New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2010
    Сообщения:
    45
    Вот неплохая картинка о DTA (с этого же сайта):
    [​IMG]

    Просто хотел узнать, при старте программы там уже есть данные по собственной длине и имени, или надо что-то предпринять? В afdpro у меня ничего не показывает.

    И ещё один вопрос, не подкинете ссылку почитать, как определить адрес текущей инструкции (опять же без метки). Грубо говоря, значение счётчика IP (его-то прочитать нельзя). Например, мне нужно обратиться к байтам, "лежащим" на 10 байт выше исполняемой инструкции. Можно ли туда прыгнуть или считать их без меток, но относительно текущей команды?
     
  9. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.787
    _mm_
    в afd как раз при старте в СХ длина программы в байтах
     
  10. _mm_

    _mm_ New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2010
    Сообщения:
    45
    Огромное спасибо. На это не обратил внимания.
    А как насчёт определения адреса текущей инструкции (вроде mov ax,ip - если бы это было возможно)? Погуглил на эту тему, но все решения так или иначе связаны с метками.
     
  11. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.787
    _mm_
    сразу после старта COM-файла IP=100h
    адрес текущей инструкции можно получить так
    Код (Text):
    1.   CALL $+3
    2.    POP AX; AX:=IP
    обратиться к байтам, "лежащим" на 10 байт выше исполняемой инструкции можно, например вот так:
    Код (Text):
    1.    mov si,$-10
    2.     add [si],ax
     
  12. _mm_

    _mm_ New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2010
    Сообщения:
    45
    Спасибо!
     
  13. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.787
    _mm_
    Не злоупотребляй цитатами, глаза режет
    Правила
     
  14. _mm_

    _mm_ New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2010
    Сообщения:
    45
    Спасибо за ссылку! Постараюсь исправиться. Но кстати, пример не помог, тут метка $ всё равно используется (линковщик её подменяет реальным адресом). Пришлось придумать другой ход (уже не связанный с содержимым регистров или DTA).
     
  15. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.787
    _mm_
    в случае с CALL $+3 нет реального адреса -- только относительный -- здесь можешь просто подставить db 0E8h,0,0 а вместо JMP $-10 -- можно подставить db 0EBh,0F4h CALL и JMP SHORT почти всегда имеют относительную адресацию
     
  16. _mm_

    _mm_ New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2010
    Сообщения:
    45
    Мучаюсь до сих пор, ничего не получается. Мне надо всего-то прописать код jmp 100h. Но прописать его напрямую в masm нельзя - выдаёт ошибку 2076. Отчаянно гуглил. Всякие извороты вроде jmp short ptr cs:[0100h] тоже выдают ошибку. Нашёл вариант подставить dw 0FEEBh - но и то он работает только в компилируемой программе (для образца я взял программу "hello, world!"). Ещё немного, и я напрямую вобью композицию mov word ptr cs:[si],0EBFEh, но делать это не хочется, нужен гуманный способ. Почему же нельзя прописать просто jmp 100h?

    Upd. Сколько радости! Помогло mov ax,100h, jmp ax :)
     
  17. emptyHook

    emptyHook New Member

    Публикаций:
    0
    Регистрация:
    9 сен 2010
    Сообщения:
    63
    ну а если в конце com файла прописать метку типо db 'END',0h
    и тупо в самом начале найти эту метку в памяти - в пределах одного сегмента? =)
     
  18. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.787
    _mm_
    можно и вот так
    Код (Text):
    1. .286
    2. .model tiny
    3. .code
    4. org 100h
    5. start:  mov ax,cs
    6.     mov a,ax
    7.     jmp b
    8.     db 25 dup(90h); здесь любые команды
    9. b:
    10.     db 0EAh,0,1; jmp far ptr cs:100h
    11.     a dw ?; здесь значение текущего CS
    12.     retn
    13. end start