Вопрос № 105405: Прошу подробно изложить как ассемблировать программу из файла ASM и чем?...Вопрос № 105427: Здраствуйте уважаемые эксперты! Подскажите пожалуйста как скопировать текущее значение EIP в регистр общего назначения (например в еах)!? Если Вас не затруднит, напишите пару строк кода!!!
С уважением к Вам, max!!!...
Вопрос № 105.405
Прошу подробно изложить как ассемблировать программу из файла ASM и чем?
Отвечает: Зенченко Константин Николаевич
Здравствуйте, Егор Грушин Романович!
Разработка программы на языке ассемблера включает четыре этапа. 1-й этап.Подготовка исходного текста программы и оформление его в виде текстового файла (одного или нескольких) с помощью какого-нибудь редактора с расширением .asm. 2-й этап.Ассемблирование программы с применением транслятора Tasm(Tasm.exe) или Masm(ML.exe), результатом которого является объектный файл с расширением obj. Когда программа состоит из нескольких файлов (модулей), то их ассемблирование производится независимо друг от друга. Если в процессе трансляции будут обнаружены ошибки, то объектный файл не создаётся, а формируется сообщение об ошибках. Ошибки устраняются, после чего трансляция повторяется. Объектный файл (двоично-кодированное представление программы)
не может быть запущен на исполнение, так как в нём не содержится информация о загрузке сегментов программы в памяти компьютера. 3-й этап.Компоновка программы производится компоновщиком (редактором связей) Tasm(Tlink.exe) или Masm(Link.exe) и заключается в объединении объектных модулей в один исполняемый файл с назначением стартового адреса программы. Исполняемый файл имеет расширение exe. 2-й и 3-й этапы определяют процесс подготовки исполнительного файла программы, называемого трансляцией. 4-й этап состоит в отладке программы с использованием отладчика(входит в комплекты компиляторов), который будет являться основным инструментом при изучении форматов команд, их кодирования, а также представления переменных программы в памяти.
Примеры команд создания программ для компилятров Tasm или Masm можно найти в книге С.Зубкова
Есть версии компиляторов для Dos(16-bit) и Windows(32-bit-компоновщики которых НЕ СОЗДАЮТ 16-битный код):
16-bit:tasm 4.10, masm 5.10, masm 6.11;
32-bit:www.wasm.ru masm, tasm и др.
Отдельно нужно сказать о компиляторе Fasm(cm. wasm.ru)-позволяет создавать как 16-битный, так и 32-битный код.
Удачи!
--------- И только наступив на грабли мы приобретаем драгоценный опыт!
Здраствуйте уважаемые эксперты! Подскажите пожалуйста как скопировать текущее значение EIP в регистр общего назначения (например в еах)!? Если Вас не затруднит, напишите пару строк кода!!!
С уважением к Вам, max!!!
Отправлен: 14.10.2007, 16:01
Вопрос задал: Maksim/max (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Овчинников Алексей
Здравствуйте, Maksim/max!
воспользуйтесь оператором $
например
MiEIP equ $
mov eax,MiEIP
команда mov eax,MiEIP занимает 4 байта поэтому если вам необходим eip после выполнения этой команды, можно записать MiEIP equ $+4
Ответ отправил: Овчинников Алексей (статус: 1-ый класс)
Ответ отправлен: 14.10.2007, 16:59 Оценка за ответ: 5 Комментарий оценки: Здраствуйте Алексей! Спасибо Вам за ответ! Однако есть одно "НО"!Моя программа после компиляция и загрузки ее в память будет затем сама себя перемещать в другое место и соответственно адрес в еах будет уже неверным!!!Ведь он определяется компилятором, в вашем случае!!! А мне необходимо чтобы его определила сама программа!!!Поэтому вопрос остается
по-прежнему открытым!!! Ставлю Вам оценку 5! Так как на вопрос вы ответили!!!
Отвечает: Sergijj
Здравствуйте, Maksim/max!
Можно сделать это, например, использовав свойство команды CALL, которая при работе заносит в стек адрес возврата.
Написав процедуру типа DisplayRegs можно в нужном месте сделать её вызов, а в ней залезть в стек и увидеть EIP, указывающий на команду, следующую за CALL.
Подробный пример писать было лень, поэтому взял первое, что нашёл в www.google.ru (в приложении).
Ну, если в кратце это выглядит так:
.386
.model flat
.code
start:
jmp short begin
get_eip:
pop eax
; ...
begin:
call get_eip
end start
Приложение:
--------- Стучитесь! И Вас откопают...
Ответ отправил: Sergijj (статус: 10-ый класс)
Ответ отправлен: 15.10.2007, 10:16 Оценка за ответ: 5 Комментарий оценки: Здраствуйте Sergijj! Большое Вам спаибо за то, что откликнулись на мою просьбу и за ответ! Ваш вариант я изучил! Однако хотел спросить следующее: вот допустим моя программма: код вот здесь необходимо узнать смещение sring,с учетом того что она будет сама себя перемещать!!! код код ... код string db 'text'
Если пользоваться call-ом
то достаточно сложно и громоздко получится, да и не удобно!? Или для таких случаев есть что более приемлемое? И еще вы пишите :выделим OutBufferSize байт стэка для формирования строки ;Часто так выделяют память под небольшие локальные переменные. Почему допустим нельзя выделить байт в памяти и обращатся к нему!??Чем это черевато???