Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: программирование на языке Assembler


Информационный Канал Subscribe.Ru

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler

Выпуск № 75
от 04.03.2005, 23:30

Администратор:Калашников О.А.
В номере:Вопросов: 3, Ответов: 9


Вопрос № 17551: Когда я говорил поиск файлов я имел в виду следующе (немного не так сформировал вопрос): Допустим в теле программы хранится ее имя, и если ее переименовать, она должна про это узнать. Тоесь, имя должно хранится имя в верхнем или нижне регистре. ...
Вопрос № 17577: И снова я со своим резидентом из рассылки №10. CSEG segment assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG org 100h Start: jmp Init Int_21h_proc proc pushf cmp ah,9 je Ok_09 popf jmp dword ptr cs:[Int_21...
Вопрос № 17579: Ув эксперты! Растолкуйте чайнику.Программирование под Win32 на (Аsm/C).Я так понимаю,что на самом низком уровне Винды находятся API?Если так,то что собой представляют ф-ии RTL (С)?Мы же их можем использовать в программировании под Win32.То же сам...

Вопрос № 17551
Когда я говорил поиск файлов я имел в виду следующе (немного не так сформировал вопрос): Допустим в теле программы хранится ее имя, и если ее переименовать, она должна про это узнать. Тоесь, имя должно хранится имя в верхнем или нижне регистре.
Еще один вопрос. У меня MASM 6.14.8444
Я не могу откомпилировать DOSосовский файл. Объектный файл создается, а линкировщик выдает ошибки про неверный параметр "t" и "z2". И выводит какую-то критическую ошибку.
LINK : warning LNK4044: unrecognized option "z2"; ignored
LINK : warning LNK4044: unrecognized option "t"; ignored
Prog.obj : warning LNK4033: converting object format from OMF to COFF
prog.obj: fatal error LNK1190: invalid fixup found, type 0x0001
Отправлен: 26.02.2005, 23:15
Вопрос задал: Nieh (статус: Посетитель)
Всего ответов отправлено: 2

Отвечает: Стас
Здравствуйте, Nieh!
1)Тебе абсолютно правильно ответили и Евгений Иванов(если работаешь под виндами) и Котиев Зураб если под досом. В DOS нет больших и маленьких (английских) букв. В директории они всегда БОЛЬШИЕ. С русскими другой каленкор, но если ктото переименовал твою ПРОГУ.EXE в ПрОгУ.EXE - это считается?
Как определить имя исполняющейся в данный момент проги не знаю, специальных функций нет, надо посмотреть вирусные технологии. Смотреть в текущей папке - сработает не всегда.
2)С какими опциями компилируете и линкуете (впечатление что пытаетесь линковать с параметрами для виндов)?

Дополнение Иванова Евгения:
в ДОС регистр не различается, его можно выставлять любым, всё равно он при обработке файлов приводится к одному. Каталоги показываются большими - для удобства.
Ответ отправил: Стас (статус: Практикант)
Отправлен: 27.02.2005, 02:25
Оценка за ответ: 4

Отвечает: Котиев Зураб
Здравствуйте, Nieh!
делай
mov ah,4fh
mov dx,offset filename
mov cx,attr
int 21h
если она себя не нашла ,значит переименована.
и не думай о регистре.ДОСу по барабану.
у тебя masm для win.поставь более старую версию
Ответ отправил: Котиев Зураб (статус: 2-ой класс)
Отправлен: 28.02.2005, 12:10
Оценка за ответ: 5


Вопрос № 17577
И снова я со своим резидентом из рассылки №10.
CSEG segment
assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG
org 100h
Start:
jmp Init
Int_21h_proc proc
pushf
cmp ah,9
je Ok_09
popf
jmp dword ptr cs:[Int_21h_vect]
Ok_09:
//Я не как не могу понять зачем сохраняем эти регистры
push ds //Регистр ds сохраняем первым
push dx //
push cs //
pop ds //и извлекаем его тоже первым. Как так.
mov dx,offset My_string
pushf
call dword ptr cs:[Int_21h_vect]
pop dx
pop ds
popf
iret
Int_21h_vect dd ?
My_string db 'Моя строка!$'
int_21h_proc endp
Init:
mov ah,35h
mov al,21h
int 21h
mov word ptr Int_21h_vect,bx
mov word ptr Int_21h_vect+2,es
mov ax,2521h
mov dx,offset Int_21h_proc
int 21h
mov dx,offset Init
int 27h
CSEG ends
end Start
А так же хотел узнать в чем разница между jmp dword ptr cs:[int_21h_vect] и call dword ptr cs:[int_21h_vect].
Хотелось бы разобраться до конца, прежде чем идти дальше. Заранее спасибо.
Отправлен: 27.02.2005, 18:28
Вопрос задал: psevdo (статус: 1-ый класс)
Всего ответов отправлено: 3

Отвечает: Стас
Здравствуйте, psevdo!
>//Я не как не могу понять зачем сохраняем эти регистры
Сохраняем DX поскольку используем mov dx,offset My_string, т.е. изменяем DX.
То же с DS:
push ds //Это действительно сохранение значения DS
push dx //Это тоже сохранение значения DX
push cs // А это уже нет здесь мы погружаем в стек текущий CS
pop ds //а здесь извлекаем его уже в DS. Т.е. это как бы команда mov ds,cs
>А так же хотел узнать в чем разница между jmp dword ptr cs:[int_21h_vect] и call dword ptr >cs:[int_21h_vect].
Не пойму что тебе не понятно здесь. Ты знаешь чем вообще call отличается от jmp?
Или тебя смущает DWORD? Т.е. "межсегментный вызов"?
Или то что адрес для прыжка берется из "переменной"?
Ответ отправил: Стас (статус: Практикант)
Отправлен: 27.02.2005, 23:07

Отвечает: Котиев Зураб
Здравствуйте, psevdo!
//Я не как не могу понять зачем сохраняем эти регистры
push ds //Регистр ds сохраняем первым
push dx //
push cs //
При вызове функции 09h прерывания 21h адресс подставной строки должен быть в ds:dx , а ds указывает на сегмент данных программы вызвавшей прерывание.Нам надо , чтобы ds указывал на сегмент где находится резидент,т.е. cs, поэтому
push cs
pop ds.
jmp dword ptr cs:[int_21h_vect] просто передает управление настоящему обработчику 21h и возврата в резидент не происходит.
pushf
call dword ptr cs:[Int_21h_vect]
вызывает настоящий обработчик 21h и возвращается в резидент, ведь нам надо восстановить прежние значения ds и dx а также флагов программы, вызвавшей резидент , чтобы та могла нормально продолжать работу.
Ответ отправил: Котиев Зураб (статус: 2-ой класс)
Отправлен: 28.02.2005, 11:38

Отвечает: Boriss
Здравствуйте, psevdo!
CALL помещает в стек адрес возврата (адрес следующие команды) и совершает переход. Так что, как только встретится RET, управление будет передано будет ей ("вспомнгит" процессор - вытащит из стека адрес)
JMP этого не делает, просто передает управление "той" команде, на которую указывает. Так что если используете RET в подпрограмме (если нужно вернуться в вызывающую программу), то адрес возврата следует занести в стек самому (PUSH)
Ответ отправил: Boriss (статус: Профессионал)
Отправлен: 04.03.2005, 17:26


Вопрос № 17579
Ув эксперты!
Растолкуйте чайнику.Программирование под Win32 на (Аsm/C).Я так понимаю,что на самом низком уровне Винды находятся API?Если так,то что собой представляют ф-ии RTL (С)?Мы же их можем использовать в программировании под Win32.То же самое касается и Досовских ф-ий asm`a.
Так,какие же,все-таки ф-ии находятся в самом 'низу',а какие только являются посредниками?И можно ли использовать Досовские ф-ии asm`a при программировании в Win32 или исключительно в DOS`e?
Буду очень благодарен за исчерпывающий ответ.В самом деле,очень бы хотелось разобраться досконально.
Отправлен: 27.02.2005, 19:05
Вопрос задал: Ling (статус: Посетитель)
Всего ответов отправлено: 4

Отвечает: Стас
Здравствуйте, Ling!
>Я так понимаю,что на самом низком уровне Винды находятся API?
Я тоже почувствовал себя чайником... :) Какой низкий уровень Винды?
>Если так,то что собой представляют ф-ии RTL (С)?
Я тупой! Речь идет о каком-то "интерпритаторе" C? ~:-(
Или о какой-то универсальной библиотеке одинаково работающей в DOS и в Виндах?
(Например вызываем messagebox и в виндах вызывается соответствующая фунция, а в дос рисуется "аналог"?)
>Мы же их можем использовать в программировании под Win32.
Что за фукции в этой RTL? Может понятно станет...
>То же самое касается и Досовских ф-ий asm`a.
Какие функции у asm'a в досе? Имеешь в виду прерывания дос?
>Так,какие же,все-таки ф-ии находятся в самом 'низу',а какие только являются посредниками?
Внизу "голый" ассемблер, напрямую работающий с процессором, памятью и с портами.
Далее идут аппартные прерывания используемые биос или виндами, они необходимы чтобы нормально работали клавиатура, мышь и другие устройства на них.
Далее "прерывания" DOS и API для виндов, чтобы "облегчить" жизнь программистам: они берут на себя ввод/вывод с и на разные устройства (клава, дисплюй). Другие функции "первой необходимости".
Ну а далее разные библиотеки (RTL всякие), с более сложными функциями.
>И можно ли использовать Досовские ф-ии asm`a при программировании в Win32 или >исключительно в DOS`e?
они будут работать в "виртуальной машине" DOS под виндами. Но в самой Win int21 нет..
Звиняйте за костноязычье и если я чего не понял (не знаю)... (Хуже только когда не знаешь да еще и не помнишь...)
Ответ отправил: Стас (статус: Практикант)
Отправлен: 27.02.2005, 23:32

Отвечает: AxMAD
Здравствуйте, Ling!
Досовские функции под Windows будут только эмулироваться, а насчёт низкого уровня под win32 это правда WIN API.
Ответ отправил: AxMAD (статус: Студент)
Отправлен: 28.02.2005, 09:06

Отвечает: Shizuku Tsukishima
Здравствуйте, Ling!
Тут всё просто и, к сожаленью, глухо. Windows XP и ище с ней работает в защищённом режиме, теперь ни одна программа не может обращаться к железу напрямую. Те 'досовские' функции и операторы которые придерживаются рамок этого режима продолжают работать и в Windows (например add, sub, xor...).
Asm под Windows - уже не старый добрый assembler for dos. Работа в нём построена на знании WinAPI и вызовах системных фукций из библиотек (тот самый Run Time Library).
Работа на низком уровне в Windows "напрямую" доступна сейчас через написание драйверов (Microsoft DDK в помощь) и сервисов.
Ответ отправила: Shizuku Tsukishima (статус: 3-ий класс)
Отправлен: 28.02.2005, 14:06

Отвечает: _vt
Здравствуйте, Ling!
Функции RTL (to Стас: C RunTime Library) - это то, что является кроссплатформенным. Т.е. например, fopen, fclose, printf - реализуются в каждой системе отдельно. Например, в Windows они содержатся в msvcrt.dll, в Linux - libc6.so. И т.д. В DOS нет общих библиотек, и рантайм С линкуется вместе с каждой программой - libc.lib обычно называется файл. А вот уже эти самые функции реализуются на каждой системе по-разному: в Windows за счет WinAPI-функций, в DOS - за счет прерывания 21h и прочих, в Unix - прерывание 80h и еще что-то (тут могу буть недостоверным). Никаких "досовских функций асма" в Windows нету. Просто в Win9x эмулировались некоторые системные вызовы так, что из досовых программ к ним можно было обратиться через прерывания. Так лучше не делать =)
--

* In Gates we trust! :)

Ответ отправил: _vt (статус: Академик)
Отправлен: 28.02.2005, 23:07


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.


http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.faq
Отписаться

В избранное