Вопрос № 101124: зндрастуйти :) я решил чуток поизучять асм и у меня есть вопрос
inc edi
or al, al
jz loc_00416074
mov ecx, edi
push edi
dec eax
repne scasb
push ebp
call dword ptr [esi+161f4h]
or eax, eax
...Вопрос № 101145: 1)как обьявляются переменные?
2)как обьявляются и описяваются функции?
3)как подключяются библиотеки?...
Вопрос № 101.124
зндрастуйти :) я решил чуток поизучять асм и у меня есть вопрос
inc edi
or al, al
jz loc_00416074
mov ecx, edi
push edi
dec eax
repne scasb
push ebp
call dword ptr [esi+161f4h]
or eax, eax
jz loc_004160b0
mov [ebx], eax
add ebx, 04h
jmp loc_00416091
вставьте коментарии к каждой строке(хочется узнать что это за операторы или что тут)
Отвечает: Лысков Игорь Витальевич
Здравствуйте, Stachovskis valerijus henriko!
Тяжело судить о смысле каждой команды из вырванного из контекста программы
куска дизассемблерного текста...
Можно только смутно догадываться, для чего они...
inc edi; в EDI очевидно хранится адрес последовательности байт, в которой потом будет искаться байт из AL, для чего инкрементируется - неясно, надо знать структуру последовательности байт
or al, al ; проверим на 0
jz loc_00416074 ; если 0, то ничего не делаем
mov ecx, edi ; непонятно, зачем в ECX адрес строки - там должна быть длина строки
push edi ; сохраняем в стеке адрес строки, где-то должно быть восстановлено
dec eax ; в строке значения с 0, для этого уменьшаем на 1
repne scasb ; ищем значение из AL в строке по адресу [EDI], ищем пока не найдем, либо пока не обнулится ECX
push ebp ; сохраним в стеке EBP, где-то должно быть либо восстановлено, либо удалено из стека как параметр
call dword ptr [esi+161f4h] ; вызов подпрограммы по адресу из таблицы по адресу 161f4h, индекс в регистре ESI
or eax, eax ; проверяем результат
jz loc_004160b0 ; если ноль, то уходим на указанный адрес (метку)
mov [ebx], eax ; иначе сохраняем результат
add ebx, 04h ; увеличиваем адрес, где что-то там сохраняется, для сохранения при последующих вызовах
jmp loc_00416091 ; очевидно, идем куда-то, возможно, для повтора операций
PS Боюсь, что, изучая дизассемблерный текст, весьма тяжело изучать ассемблер.
После моего ответа, наверняка, появится еще больше вопросов...
Рекомендую сначала изучить ассемблер на "нормальных" текстах, а уж потом
разбирать дизассемблерный текст.
--------- Удачи!
Ответ отправил: Лысков Игорь Витальевич (статус: Практикант)
Ответ отправлен: 07.09.2007, 10:39 Оценка за ответ: 5
Отвечает: Зенченко Константин Николаевич
Здравствуйте, Stachovskis valerijus henriko!
1)С помощью псевдокоманд определения переменных. Псевдокоманда — это директива ассемблера, которая приводит к включению данных или кода в программу, хотя сама она никакой команде процессора не соответствует. Псевдокоманды определения переменных указывают ассемблеру, что в соответствующем месте программы располагается переменная, определяют тип переменной (байт, слово, вещественное число и т.д.), задают ее начальное значение и ставят в соответствие переменной метку, которая будет использоваться для обращения к этим данным.
DB —определить байт;
DW —определить 2 байта;
DD —определить 4 байта;
DF —определить 6 байт;
DQ —определить 8 байт;
DT —определить 10 байт.
2)Процедурой в ассемблере является все то, что в других языках называют подпрограммами, функциями, процедурами и т.д. Ассемблер не накладывает на процедуры никаких ограничений — на любой адрес программы можно передать управление командой CALL, и оно вернется к вызвавшей процедуре, как только встретится команда RET. Такая свобода выражения легко может приводить к трудночитаемым программам, и в язык ассемблера были включены директивы логического оформления процедур.
метка proc язык тип USES регистры; TASM
или
метка proc тип язык USES регистры;MASM/WASM
. . .
ret
метка endp
Все операнды PROC необязательны (описание операндов можно найти в книге см. ссылку).
3)С помощью директивы INCLUDELIB имя_файла —директива, указывающая компоновщику имя дополнительной библиотеки или объектного файла, который потребуется при составлении данной программы. Например, если используются вызовы процедур или обращение к данным, определенным в других модулях. Использование этой директивы позволяет не указывать имена дополнительных библиотек при вызове компоновщика.
ps:Скачайте книгу Зубкова
Удачи!
--------- И только наступив на грабли мы приобретаем драгоценный опыт!
Ответ отправил: Зенченко Константин Николаевич (статус: Специалист)
Ответ отправлен: 07.09.2007, 11:59 Оценка за ответ: 5