Понимаю, что вопрос достаточно глупый, но никак не могу разобраться. Нужно найти длину собственного запускаемого com-файла, под DOS, без установки различных меток. Насколько я понимаю, в PSP что-то записывается только при работе с другими файлами? Как-то использовать FCB? С этим не до конца разобрался. Направьте, если несложно, в какую сторону копать.
Да, только сначала нужно получить собственное полное имя. Через PSP и копию области переменных окружения.
Вот неплохая картинка о DTA (с этого же сайта): Просто хотел узнать, при старте программы там уже есть данные по собственной длине и имени, или надо что-то предпринять? В afdpro у меня ничего не показывает. И ещё один вопрос, не подкинете ссылку почитать, как определить адрес текущей инструкции (опять же без метки). Грубо говоря, значение счётчика IP (его-то прочитать нельзя). Например, мне нужно обратиться к байтам, "лежащим" на 10 байт выше исполняемой инструкции. Можно ли туда прыгнуть или считать их без меток, но относительно текущей команды?
Огромное спасибо. На это не обратил внимания. А как насчёт определения адреса текущей инструкции (вроде mov ax,ip - если бы это было возможно)? Погуглил на эту тему, но все решения так или иначе связаны с метками.
_mm_ сразу после старта COM-файла IP=100h адрес текущей инструкции можно получить так Код (Text): CALL $+3 POP AX; AX:=IP обратиться к байтам, "лежащим" на 10 байт выше исполняемой инструкции можно, например вот так: Код (Text): mov si,$-10 add [si],ax
Спасибо за ссылку! Постараюсь исправиться. Но кстати, пример не помог, тут метка $ всё равно используется (линковщик её подменяет реальным адресом). Пришлось придумать другой ход (уже не связанный с содержимым регистров или DTA).
_mm_ в случае с CALL $+3 нет реального адреса -- только относительный -- здесь можешь просто подставить db 0E8h,0,0 а вместо JMP $-10 -- можно подставить db 0EBh,0F4h CALL и JMP SHORT почти всегда имеют относительную адресацию
Мучаюсь до сих пор, ничего не получается. Мне надо всего-то прописать код 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
ну а если в конце com файла прописать метку типо db 'END',0h и тупо в самом начале найти эту метку в памяти - в пределах одного сегмента? =)
_mm_ можно и вот так Код (Text): .286 .model tiny .code org 100h start: mov ax,cs mov a,ax jmp b db 25 dup(90h); здесь любые команды b: db 0EAh,0,1; jmp far ptr cs:100h a dw ?; здесь значение текущего CS retn end start