Вопрос № 18503: Здраствуйте.
Я в языке Ассемблер ещё новичёк и поэтому у меня есть вопросы.
Скажите пожайлуста, я работаю на WindiwsXP, реально создать программу под систему DOS? Как примерно нужно создавать программу (я имею ввиду сигментацию памати), и есл...Вопрос № 18509: Опять про резиденты... Вопрос короткий, но сомневаюсь, что на него существует ответ... Как зная лишь идентификатор открытого файла узнать его настоящее имя??? полный путь узнавать не обязательно (даже не желательно)...
Дело в том, что нужно созд...Вопрос № 18520: здравствуйте!
как узнать к какому порту обращается прога работает в msdos.
из инструментов есть прога softice 4.05
спасибо....Вопрос № 18544: Здрасьте!
Мне нужно вывести строку 'DOS' не используя при этом прерывания 21h(на низком уровне, не используя прерываний 25/35h)
Но почему то слово 'DOS' выводится несколько раз(ок 70-100). Почему так?...
Вопрос № 18503
Здраствуйте.
Я в языке Ассемблер ещё новичёк и поэтому у меня есть вопросы.
Скажите пожайлуста, я работаю на WindiwsXP, реально создать программу под систему DOS? Как примерно нужно создавать программу (я имею ввиду сигментацию памати), и если нетрудно - какой каркас для программы (мин. приложение программы Dos на Windows`е?
Заранее благодарен.
Отправлен: 20.03.2005, 11:51
Вопрос задал: Evgeny Glinkin (статус: Посетитель)
Всего ответов отправлено: 3
Отвечает: Евгений Иванов
Здравствуйте, Evgeny Glinkin!
Используй TASM, например.
Вот тебе пример программы-каркас:
;
VERSION T400
IDEAL
P586
Model use16 TINY,Normal StdCall
SMART
Locals @@
b equ byte
w equ word
ww equ dword
t equ type
ofs equ offset
m equ mask
LEN_FILE = 10000
LEN_STEK = 777
STEK = (offset Posl)+LEN_STEK
Segment S byte public 'code' use16
Assume CS:S,DS:S
Org 256
begin:
m001a: ;=1a
cld
cmp sp,STEK
jc err_mem
mov sp,STEK
sub ax,ax
mov di,offset dat
mov bp,di
mov cx,LEN_DAT
rep stosb
mov ah,4ah
mov bx,(LEN_FILE+LEN_STEK+LEN_DAT+277)/16 ;Размер программы; Стек
int 33
mov dx,ofs hallo
call ConStr
jmp dos
err_mem:
mov dx,ofs d_err_mem
mikki:
call ConStr
dos:
EXITCODE 0
proc ConStr
mov ah,9
int 33
ret
endp
hallo:
db 'My Software',13,10,36
d_err_mem db 'Need more memory',13,10,36
dat:
db ?
LEN_DAT = ($-dat)
Posl:
Ends S
End begin
делать вот с помощью такого батника:
echo off
cls
tasm.exe /m9 /t /ml %1.asc,%1.obj >_errors.obj
if errorlevel 1 goto exit
tlink.exe /Tdc /c /C /x /yx %1.obj ,%1.com
if errorlevel 1 goto exit
del %1.obj
goto end
:exit
:end
Удачи!
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 20.03.2005, 14:46
Отвечает: Стас
Здравствуйте, Evgeny Glinkin!
;test.asm минимальная программа для DOSа - формат COM
.MODEL Tiny
.CODE
org 100h
Start:
ret ;просто выход :)
END Start
end
;======================================
Я так понял тебе это надо? Компилируется в TASM (tasm v.4.1; tlink v.7.1.30.1.) вот так:
tasm test;
tlink test /Tdc /3
Ответ отправил: Стас (статус: Практикант)
Отправлен: 21.03.2005, 01:45
Отвечает: _vt
Здравствуйте, Evgeny Glinkin! Работая в Windows XP реально создать программу под любую систему, даже не имеющую отношения к Intel x86 :) Достаточно иметь компилятор, который умеет создавать код под нужную платформу. Таким образом, если Вы используете компилятор, работающий под DOS, и тот же компилятор, только версию, работающую под Windows, то "мин. приложение программы" будет абсолютно таким же. Ну, например, для компилятора MASM минимальной программой будет такая: .model tiny .code .startup ret end
--
* In Gates we trust! :)
Ответ отправил: _vt (статус: Академик)
Отправлен: 21.03.2005, 13:50
Вопрос № 18509
Опять про резиденты... Вопрос короткий, но сомневаюсь, что на него существует ответ... Как зная лишь идентификатор открытого файла узнать его настоящее имя??? полный путь узнавать не обязательно (даже не желательно)...
Дело в том, что нужно создать резидент, который бы создавал резервную копию при завершении работы (то есть, по сути, при закрытии) любого файла (все это дело естественно только под ДОС)... Но перехватив 21Н прерывание и распознав функцию закрытия файла я буду знать лишь его идентификатор, а не само имя... конечно можно было бы создавать резервные копии с именами типа file1.bak, file2.bak, file3.bak...... fileN.bak, но это крайне некрасиво... вот мне и хочется, чтоб резервная копия имела то же имя, что и оригинал
(только расширение другое...)... но для этого нужно знать это самое имя...
Можно конечно заодно фильтровать и открытие файлов, запоминая и сопоставляя имя открытого файла с его идентификатором... но это будет очень громостко (особенно если учесть возможность переименования файла...), да и работать такая идея будет лишь для файлов, открытых после запуска резидента....
Если не знаете прямого ответа на вопрос, то хотя бы поделитесь идеями, как можно более-менее красиво реализовать подобную штуковину....
И еще... есть у кого-нибудь электронный справочник по прерываниям дос-биос (особенно о свежих... таких как функции для работы с длинными именами файлов...)???
З.Ы. Прошу простить за то, что не отблагодарил оценками за ответы на мой последний вопрос (про перехват 9Н прерывания и т.п... кстати с ним проблем уже нет...), дело в том, что когда я получил почту, дата отправки оценок уже прошла....
Спасибо....
Отправлен: 20.03.2005, 14:29
Вопрос задал: CrazyIronToiletPaper (статус: 1-ый класс)
Всего ответов отправлено: 2
Отвечает: Евгений Иванов
Здравствуйте, CrazyIronToiletPaper! Я могу посоветовать сделать так. С помощью функции 57h запомнить дату файла. Потом установить определённую дату (например, все нули или т.п.). Потом сбросить буфера и пустить поиск файла. И проверять дату и время на установленные. Таким образом узнать имя. Потом опять установить дату и время на сохранённые. И закрывать файл. Но конечно, лучше запоминать имена в своём буфере при открытии,создании файлов. Удачи!
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 20.03.2005, 15:07 Оценка за ответ: 5
Отвечает: Котиев Зураб
Здравствуйте, CrazyIronToiletPaper!
http://www.wasm.ru/article.php?article=1006004
обрати внимание на SFT (sytem file table) она даст тебе имя файла по идентификатору;
из чтива рекомендую Ralf Brown's Interrupt List(посмотри http://www-2.cs.cmu.edu/afs/cs.cmu.edu/user/ralf/pub/WWW/files.html)
Ответ отправил: Котиев Зураб (статус: 2-ой класс)
Отправлен: 22.03.2005, 10:19 Оценка за ответ: 5 Комментарий оценки: Большой спасиб!!!
Вопрос № 18520
здравствуйте!
как узнать к какому порту обращается прога работает в msdos.
из инструментов есть прога softice 4.05
спасибо.
Отправлен: 20.03.2005, 16:35
Вопрос задал: dobrin (статус: Посетитель)
Всего ответов отправлено: 1
Отвечает: _vt
Здравствуйте, dobrin! Возьми какой-нибудь дизассемблер и пошерсти программу на наличие команд in и out. :) Операндом эти команд будет как раз порт... Достаточно hiew. Софтайс тут как бы совсем не причем, особенно виндовый... --
* In Gates we trust! :)
Ответ отправил: _vt (статус: Академик)
Отправлен: 21.03.2005, 13:44 Оценка за ответ: 5 Комментарий оценки: очень рад что есть профи
Вопрос № 18544
Здрасьте!
Мне нужно вывести строку 'DOS' не используя при этом прерывания 21h(на низком уровне, не используя прерываний 25/35h)
Но почему то слово 'DOS' выводится несколько раз(ок 70-100). Почему так?
Приложение:
Отправлен: 21.03.2005, 08:49
Вопрос задал: Guran (статус: Посетитель)
Всего ответов отправлено: 3
Отвечает: DSota
Здравствуйте, Guran!
А почему бы и не 70-100, или даже не 7-1000 :)))? Просто твоя программа подменяет обработчик прерываний Дос - и на все запросы int21h, даже необязательно твоей программы приводят к печати строки DOS...
А что мешает сделать:
Приложение:
Ответ отправил: DSota (статус: Студент)
Отправлен: 21.03.2005, 10:01 Оценка за ответ: 4
Отвечает: Евгений Иванов
Здравствуйте, Guran!
код не сохраняет регистров, и неправильно работает с обслуживанием прерывания.
читайте побольше исходников других людей и справку
удачи!
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 21.03.2005, 10:29 Оценка за ответ: 4
Отвечает: Стас
Здравствуйте, Guran!
Бедный ДОС, такого издевательства... :)
Что то код не соотвествует поставленой задаче:
задача не использовать Int 21h а ты не только его используешь, ты его еще и перехватываешь - и практически "убиваешь".
Если нужно выводить сообщения на экран минуя Int21 то:
1) либо прямой вывод в видеопамять
2) либо через BIOS int 10h
3) либо int 29h (посимвольно)
4) есть еще варианты например вывод в "файл" - console например.
Ты уж определись, что тебе нужно.
Ответ отправил: Стас (статус: Практикант)
Отправлен: 22.03.2005, 00:47 Оценка за ответ: 5