| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Asm для начинающих > Как вызвать процедуру по метке |
| Автор: Курсант 15.8.2017, 11:04 | ||||
Всем привет! Решил освоить язык ассемблера... Пока есть небольшие проблемы с синтаксисом. Накорябал вот такой вот исходник:
Всё работает. Теперь хочу попробовать вызвать функцию, но не с помощью макроса proc, а хардкорно, с помощью адреса. Т.е. пытаюсь изменить код следующим образом:
Но компилятор ругается на call [routine], мол, error: operand size not specified. Вопрос: что я делаю не так. Ну и вообще хотелось бы взять несколько уроков по ассемблеру у более опытных товарищей. С помощью TeamViewer. За вознаграждение |
| Автор: JAPH 23.8.2017, 20:42 | ||||
Дело в том, что в fasm метка и обозначает адрес, поэтому, чтобы вызвать процедуру по метке, достаточно написать
Тогда код скомпилируется. Но работать пока не будет, поскольку когда routine вызовет MessageBoxA, она некорректно передаст ей параметры, ведь на стеке окажется адрес возврата к команде, следующей за call routine. Поэтому нужно переписать эту процедуру, например, так:
О квадратных скобках в fasm можно думать как об операторе разыменования * в С. Если нужно получить значение по адресу a, пишут [a]. Если при этом размер этого значения не удается понять по контексту (по размеру второго операнда или по директиве, с которой была объявлена метка а), то его можно указать явно, например, dword [a]. |