При закрытии подписчики были переданы в рассылку "RFpro.ru: Ассемблер? Это просто! Учимся программировать" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Информационный Канал Subscribe.Ru |
Выпуск № 75
от 04.03.2005, 23:30
Администратор: | Калашников О.А. |
В номере: | Вопросов: 3, Ответов: 9 |
Вопрос № 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 |
© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.
http://subscribe.ru/
http://subscribe.ru/feedback/ |
Подписан адрес: Код этой рассылки: comp.soft.prog.faq |
Отписаться |
В избранное | ||