call LABEL / call PROC
От: Аноним  
Дата: 20.11.06 15:59
Оценка:
В чем разница между вызовами (если есть):

call LABEL
      ; ...
LABEL:
      ; do something
      ret


и


call some_proc
     ; ...

some_proc PROC

      ; do something
      ret

some_proc ENDP
Re: call LABEL / call PROC
От: Аноним  
Дата: 20.11.06 16:04
Оценка: -1
Здравствуйте, Аноним, Вы писали:

А>В чем разница между вызовами (если есть):


А>
А>call LABEL
А>      ; ...
А>LABEL:
А>      ; do something
А>      ret
А>


А>и


А>

А>call some_proc
А>     ; ...

А>some_proc PROC

А>      ; do something
А>      ret

А>some_proc ENDP

А>


В первом случае флаги не сохраняются перед вызовом и не восстанавливаются после ret, во втором — сохраняются и восстанавливаются.
Re[2]: call LABEL / call PROC
От: DOOM Россия  
Дата: 21.11.06 04:19
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>В чем разница между вызовами (если есть):


А>>
А>>call LABEL
А>>      ; ...
А>>LABEL:
А>>      ; do something
А>>      ret
А>>


А>>и


А>>

А>>call some_proc
А>>     ; ...

А>>some_proc PROC

А>>      ; do something
А>>      ret

А>>some_proc ENDP

А>>


Запись эта эквивалентна с точки зрения процессора. call — это запихивание CS и IP в стэк (или только IP в случае ближнего вызова) и jmp на какую-то метку. Как она написана в ассемблеоре это уже дело десятое... Например, в nasm'е такой формы просто нету (я про some_proc PROC и some_proc ENDP).
Насчет ее смысла в tasm'е могу и ошибаться, но вроде это нужно линкеру, чтобы он правильно сливал exe'шник из нескольких файлов...




А>В первом случае флаги не сохраняются перед вызовом и не восстанавливаются после ret, во втором — сохраняются и восстанавливаются.

Флаги сохраняются и восстанавливаются только при при командах int и iret!
Re[3]: call LABEL / call PROC
От: Privalov  
Дата: 21.11.06 06:07
Оценка:
Здравствуйте, DOOM, Вы писали:

DOO>Насчет ее смысла в tasm'е могу и ошибаться, но вроде это нужно линкеру, чтобы он правильно сливал exe'шник из нескольких файлов...


Если не ошибаюсь, то же самое. Для многофайловой сборки используются директивы PUBLIC и/или GLOBAL. А операндом к ним может служить как имя процедуры, так и метка. Опять же, если не ошибаюсь, PROC придумали, чтобы поддержать в асме структурное программирование.

Да, есть еще директива EXTERN, говорящая о том, что метку следует брать из другого модуля.

Директивы ассемблера
Re[4]: call LABEL / call PROC
От: DOOM Россия  
Дата: 21.11.06 06:35
Оценка:
Здравствуйте, Privalov, Вы писали:

P>Здравствуйте, DOOM, Вы писали:


DOO>>Насчет ее смысла в tasm'е могу и ошибаться, но вроде это нужно линкеру, чтобы он правильно сливал exe'шник из нескольких файлов...


P>Если не ошибаюсь, то же самое. Для многофайловой сборки используются директивы PUBLIC и/или GLOBAL. А операндом к ним может служить как имя процедуры, так и метка. Опять же, если не ошибаюсь, PROC придумали, чтобы поддержать в асме структурное программирование.


P>Да, есть еще директива EXTERN, говорящая о том, что метку следует брать из другого модуля.


В общем. Скажу так... Помню, что при сборке многосегментного exe'шника разница между proc и label в tasm'е может проявится... С чем это конкретно связано — не помню уже... На tasm'е писал последний раз очень давно... Скорее всего связано это будет с разрешением каких-нибудь макросов (типа call, ret и т.п.), а также правильной обработкой всяких там assume...
Re[5]: call LABEL / call PROC
От: Privalov  
Дата: 21.11.06 06:43
Оценка:
Здравствуйте, DOOM, Вы писали:

DOO>В общем. Скажу так... Помню, что при сборке многосегментного exe'шника разница между proc и label в tasm'е может проявится... С чем это конкретно связано — не помню уже... На tasm'е писал последний раз очень давно...


Писал на нем примерно тогда же.

DOO>Скорее всего связано это будет с разрешением каких-нибудь макросов (типа call, ret и т.п.), а также правильной обработкой всяких там assume...


В tasm еще от режима зависит: MASM или IDEAL. Что-то было в нем похожее на прототипы функций. Уже не помню.

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.