Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.06.2010, 16:46   #1
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию FASM. Директива proc

Всем доброго.
Вот такой код:
Код:
format PE GUI 4.0
entry start


section '.data' data readable writeable
a dw 1

section '.code' code readable executable

  start:
   call ww
  ret

proc ww
	ret
endp
Ругается на строке proc ww мол Illegal instruction

Я вроде все верно делаю, но что-то же не так... что?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.06.2010, 18:23   #2
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

А он в макросах определен. Надо include "win32ax.inc" или какой ни будь из них подключить.
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 22.06.2010, 18:27   #3
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Сообщение от Help
3.1 Basic headers
The basic headers win32a.inc and win32w.inc include the declarations of
Win32 equates and structures and provide the standard set of macroinstruc-
tions.
У FASM'а синтаксис свой, а более-менее стандартные вещи типа proc, struct и invoke - это макросы.
proc находится в include\macro\proc[32|64].inc
Всё это инклудится в win[32|64][a[x[p]]].inc, обычно его и инклудят.

[off]А как всегда так получается, что после часа с лишним после создания темы люди начинают отвечать на неё одновременно?[/off]
Somebody вне форума Ответить с цитированием
Старый 23.06.2010, 11:55   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А-а-а ясно...
В общем такое: include 'D:\fasmw16726\INCLUDE\win32w.inc' прокатило, а такое include 'INCLUDE\win32w.inc' нет, интересно почему, но в принципе мне смысл понятен.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.06.2010, 12:27   #5
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Stilet
C точки зрения ассемблера такой код
Код:
start:
   call ww
  ret; выход из программы
;------------------------------
proc ww
	ret
endp
нужно заменять на
Код:
start:
   jmp ww
; выход из программы  
;--------------------------
proc ww
	ret
endp
Mikl___ вне форума Ответить с цитированием
Старый 17.08.2010, 06:07   #6
r9m
₪₪₪₪₪₪₪₪
Форумчанин
 
Аватар для r9m
 
Регистрация: 16.04.2007
Сообщений: 471
По умолчанию

Цитата:
Stilet
C точки зрения ассемблера такой код
Код:


start:
call ww
ret; выход из программы
;------------------------------
proc ww
ret
endp

нужно заменять на
Код:


start:
jmp ww
; выход из программы
;--------------------------
proc ww
ret
endp
Stilet, не слушай его. Чел сказал ересь (без обид). Зачем писать такую ахинею?

Разберёмся.

1) Кто будет сохранять адрес возврата? (call это делает)
2) Очень повезёт и прога не отвалится, если последним значением в стеке будет адрес функции ExitThread (представил каков шанс?)

Ок, разберём даже твой код:

Код:
start:
   push 0 ; << безобидная инструкция, а как поднасрала, да?
   jmp ww
   ret; выход из программы  
;--------------------------
proc ww
	ret ; (1) А вот тут мы отваливаемся (ret - возврат, правильный адрес возврата
             ;      должен быть на верхушке стека
endp
Смотри комментарий (1). Как думаешь, с какой вероятностью в стеке перед выходом из процедуры окажется адрес следующей за jmp ww инструкции? Вот. А теперь представим, что мы перед этим, не самым правильным вызовом (jmp ww) работали например со стеком, или пусть даже вызвали wsprintf (и ещё не раз!) которая cdecl кстати, и стек она не чистит! Правильно, будет стеко-каша. Куда возвращаться ? На кусок инструкции wsprintf ? Вот! А всего и нужно, что использовать call и следить, чтобы не похерился адрес возврата! Вот.

Знаю, что тема старая, но просто так на этот ужас было смотреть нельзя.

Цитата:
а такое include 'INCLUDE\win32w.inc' нет, интересно почему, но в принципе мне смысл понятен.
Файл fasmw.ini, вторая строка - путь к инклудникам. Если верный, можно вызывать просто

Код:
include 'win32w.inc'

Последний раз редактировалось r9m; 17.08.2010 в 06:15.
r9m вне форума Ответить с цитированием
Старый 17.08.2010, 08:19   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Господа, не сорьтесь. JMP меня не очень устраивает, так как справедливо замечено за ним нужен глаз-да-глаз )
а лишней писанины я не оч. хочу.
К тому же call это всего лишь
push eip
jmp куда-то
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.08.2010, 11:12   #8
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Цитата:
Сообщение от r9m
Stilet, не слушай его. Чел сказал ересь (без обид). Зачем писать такую ахинею?
Разберёмся.
1) Кто будет сохранять адрес возврата? (call это делает)
2) Очень повезёт и прога не отвалится, если последним значением в стеке будет адрес функции ExitThread (представил каков шанс?)
Это тебя мама научила писать такую ахинею? В данном случае идет оптимизация как по размеру кода, так и по быстродействию. На кой сохранять адрес возврата из процедуры если она стоит последней и сразу после неё идет выход из "материнской" по отношению к ней процедуры, это всё равно, что ставить retn после ExitProcess(0) хотя некоторые ставят и даже в учебниках такой код попадается. "с какой вероятностью в стеке перед выходом из процедуры окажется адрес следующей за jmp ww инструкции?" С какой вероятностью пишешь правильный код с такой и окажется, а если по всему коду разбросаны беспризорные "push 0" то это уже претензии к автору программы...
Mikl___ вне форума Ответить с цитированием
Старый 17.08.2010, 11:45   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Э-э-э ребята! Закопали штыки!
Я своим примером не имел ввиду оптимизацию, и процедуру в конец кода поставил просто так. Вообще я предполагаю процедуры в начале секции выстраивать, так что мне удобнее именно call. Про оптимизацию речь то не идет )

Да и тема то не об этом была )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.01.2012, 15:31   #10
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Решил поднять тему. Т.к после ее прочтения возникает следующий вопрос. А как передать процедуре в Fasm параметры?
Код:
proc Firstproc argument:dw
Так не пройдет. Я когда с Masm на Fasm переехал не использовал процедуры, а сейчас вдруг понадобилось.
Если таким образом
Код:
Firstproc proc argument:dw
тоже Illegal instruction пишет.
Заранее благодарю.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Директива PUBLIC Doholyan Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 21 19.11.2009 15:18
Масса вопросов по COM (OUT-OF-PROC) PAUK Общие вопросы .NET 3 30.07.2009 17:37
Что такое директива препроцессора? prikolist Общие вопросы C/C++ 7 11.02.2009 11:52
Директива Oracle D-mon БД в Delphi 4 20.05.2008 16:02