Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как вызвать процедуру по метке 
:(
    Опции темы
Курсант
Дата 15.8.2017, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 338
Регистрация: 21.2.2009
Где: Балашиха или Воро неж

Репутация: нет
Всего: 4



Всем привет! Решил освоить язык ассемблера... Пока есть небольшие проблемы с синтаксисом. Накорябал вот такой вот исходник:
Код

format PE GUI 4.0

entry Start

section '.text' code executable

Start:
  push 3
  push Bytes1
  push Bytes2
  push 0
  call [func_1]
  sub eax, 6
  jnz Start
  push 0
  call [func_2]
  jmp Start

section '.data' data readable

Bytes1:
db 72, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100, 33, 0
Bytes2:
db 72, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100, 63, 0

section '.idata' data import readable

dd 0, 0, 0, RVA lib_name_1, RVA lib_table_1
dd 0, 0, 0, RVA lib_name_2, RVA lib_table_2
dd 0, 0, 0, 0

lib_table_1:
func_1 dd RVA pointer1
dd 0
lib_table_2:
func_2 dd RVA pointer2
dd 0

lib_name_1:
db 'user32.dll', 0
lib_name_2:
db 'kernel32.dll', 0

pointer1:
dw 0 
db 'MessageBoxA', 0
pointer2:
dw 0
db 'ExitProcess', 0


Всё работает. Теперь хочу попробовать вызвать функцию, но не с помощью макроса proc, а хардкорно, с помощью адреса. Т.е. пытаюсь изменить код следующим образом:
Код

format PE GUI 4.0

entry Start

section '.text' code executable

Start:
  push 3
  push Bytes1
  push Bytes2
  push 0
  call [routine]
  sub eax, 6
  jnz Start
  push 0
  call [func_2]
  jmp Start

routine:
  call [func_1]
  ret

section '.data' data readable

Bytes1:
db 72, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100, 33, 0
Bytes2:
db 72, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100, 63, 0

section '.idata' data import readable

dd 0, 0, 0, RVA lib_name_1, RVA lib_table_1
dd 0, 0, 0, RVA lib_name_2, RVA lib_table_2
dd 0, 0, 0, 0

lib_table_1:
func_1 dd RVA pointer1
dd 0
lib_table_2:
func_2 dd RVA pointer2
dd 0

lib_name_1:
db 'user32.dll', 0
lib_name_2:
db 'kernel32.dll', 0

pointer1:
dw 0 
db 'MessageBoxA', 0
pointer2:
dw 0
db 'ExitProcess', 0


Но компилятор ругается на call [routine], мол, error: operand size not specified.
Вопрос: что я делаю не так.

Ну и вообще хотелось бы взять несколько уроков по ассемблеру у более опытных товарищей. С помощью TeamViewer. За вознаграждение smile
PM ICQ Skype   Вверх
JAPH
Дата 23.8.2017, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 8.1.2007
Где: Ленобласть

Репутация: 5
Всего: 23



Дело в том, что в fasm метка и обозначает адрес, поэтому, чтобы вызвать процедуру по метке, достаточно написать
Код

        call   routine

Тогда код скомпилируется. Но работать пока не будет, поскольку когда routine вызовет MessageBoxA, она некорректно передаст ей параметры, ведь на стеке окажется адрес возврата к команде, следующей за call routine. Поэтому нужно переписать эту процедуру, например, так:
Код

routine:
        jmp     [func_1]


О квадратных скобках в fasm можно думать как об операторе разыменования * в С. Если нужно получить значение по адресу a, пишут [a]. Если при этом размер этого значения не удается понять по контексту (по размеру второго операнда или по директиве, с которой была объявлена метка а), то его можно указать явно, например, dword [a].


--------------------
Что непонятно - спрашиваем smile
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0970 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.