Выход из процедуры родителя

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Выход из процедуры родителя

Сообщение Лекс Айрин » 22.01.2015 20:01:13

SSerge, а я не умею((
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Выход из процедуры родителя

Сообщение SSerge » 23.01.2015 05:51:02

Лекс Айрин

ну, скажем для следующей программки (файл pppp.pp):

Код: Выделить всё
program pppp;

Var a,b:integer;

begin
  write('enter a:'); readln(a);
  b:=100;
  if (a=0) then
    b:=200;
  writeln('a=',a,' b=',b);
end.


делаем:

fpc -al pppp.pp

и в файле pppp.s получаем следующее:

Код: Выделить всё
   .file "pppp.pp"
# Begin asmlist al_procedures

.section .text.n__main,"x"
   .balign 16,0x90
.globl   PASCALMAIN
PASCALMAIN:
.globl   _main
_main:
# Temps allocated between ebp-4 and ebp+0
# [pppp.pp]
# [5] begin
   pushl   %ebp
   movl   %esp,%ebp
   leal   -4(%esp),%esp
   pushl   %ebx
   call   FPC_INITIALIZEUNITS
# [6] write('enter a:'); readln(a);
   call   fpc_get_output
   movl   %eax,%ebx
   movl   $_$PPPP$_Ld1,%ecx
   movl   %ebx,%edx
   movl   $0,%eax
   call   fpc_write_text_shortstr
   call   FPC_IOCHECK
   movl   %ebx,%eax
   call   fpc_write_end
   call   FPC_IOCHECK
   call   fpc_get_input
   movl   %eax,%ebx
   leal   -4(%ebp),%edx
   movl   %ebx,%eax
   call   fpc_read_text_sint
   call   FPC_IOCHECK
   movw   -4(%ebp),%ax
   movw   %ax,U_$P$PPPP_$$_A
   movl   %ebx,%eax
   call   fpc_readln_end
   call   FPC_IOCHECK
# [7] b:=100;
   movw   $100,U_$P$PPPP_$$_B
# [8] if (a=0) then
   cmpw   $0,U_$P$PPPP_$$_A
   je   .Lj25
   jmp   .Lj26
.Lj25:
# [9] b:=200;
   movw   $200,U_$P$PPPP_$$_B
.Lj26:
# [10] writeln('a=',a,' b=',b);
   call   fpc_get_output
   movl   %eax,%ebx
   movl   $_$PPPP$_Ld2,%ecx
   movl   %ebx,%edx
   movl   $0,%eax
   call   fpc_write_text_shortstr
   call   FPC_IOCHECK
   movswl   U_$P$PPPP_$$_A,%ecx
   movl   %ebx,%edx
   movl   $0,%eax
   call   fpc_write_text_sint
   call   FPC_IOCHECK
   movl   $_$PPPP$_Ld3,%ecx
   movl   %ebx,%edx
   movl   $0,%eax
   call   fpc_write_text_shortstr
   call   FPC_IOCHECK
   movswl   U_$P$PPPP_$$_B,%ecx
   movl   %ebx,%edx
   movl   $0,%eax
   call   fpc_write_text_sint
   call   FPC_IOCHECK
   movl   %ebx,%eax
   call   fpc_writeln_end
   call   FPC_IOCHECK
# [11] end.
   call   FPC_DO_EXIT
   popl   %ebx
   leave
   ret
# End asmlist al_procedures
# Begin asmlist al_globals

.section .bss
   .balign 2
# [3] Var a,b:integer;
U_$P$PPPP_$$_A:
   .zero 2

.section .bss
   .balign 2
U_$P$PPPP_$$_B:
   .zero 2

.section .data.n_INITFINAL,"d"
   .balign 4
.globl   INITFINAL
INITFINAL:
   .long   2,0
   .long   INIT$_$SYSTEM
   .long   0
   .long   INIT$_$FPINTRES
   .long   0

.section .data.n_FPC_THREADVARTABLES,"d"
   .balign 4
.globl   FPC_THREADVARTABLES
FPC_THREADVARTABLES:
   .long   1
   .long   THREADVARLIST_$SYSTEM

.section .data.n_FPC_RESOURCESTRINGTABLES,"d"
   .balign 4
.globl   FPC_RESOURCESTRINGTABLES
FPC_RESOURCESTRINGTABLES:
   .long   0

.section .data.n_FPC_WIDEINITTABLES,"d"
   .balign 4
.globl   FPC_WIDEINITTABLES
FPC_WIDEINITTABLES:
   .long   0

.section .data.n_FPC_RESSTRINITTABLES,"d"
   .balign 4
.globl   FPC_RESSTRINITTABLES
FPC_RESSTRINITTABLES:
   .long   0

.section .fpc.n_version
   .balign 16
   .ascii   "FPC 3.1.1 [2015/01/10] for i386 - Win32"

.section .data.n___heapsize,"d"
   .balign 4
.globl   __heapsize
__heapsize:
   .long   0

.section .data.n___fpc_valgrind,"d"
.globl   __fpc_valgrind
__fpc_valgrind:
   .byte   0
# End asmlist al_globals
# Begin asmlist al_typedconsts

.section .rodata.n__$PPPP$_Ld1,"d"
   .balign 4
.globl   _$PPPP$_Ld1
_$PPPP$_Ld1:
   .ascii   "\010enter a:\000"

.section .rodata.n__$PPPP$_Ld2,"d"
   .balign 4
.globl   _$PPPP$_Ld2
_$PPPP$_Ld2:
   .ascii   "\002a=\000"

.section .rodata.n__$PPPP$_Ld3,"d"
   .balign 4
.globl   _$PPPP$_Ld3
_$PPPP$_Ld3:
   .ascii   "\003 b=\000"
# End asmlist al_typedconsts


SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Выход из процедуры родителя

Сообщение sign » 23.01.2015 06:38:42

zub писал(а):Единственная проблема с Exit может быть в случае
Код: Выделить всё
procedure qwerty
begin
  myInitialize(something);
  //тут чтото делаем и exit нельзя использовать - something утекет
  myFinalize(something);
end;

Моё железное правило.
Код: Выделить всё
procedure qwerty;
begin
  myInitialize(something);
  try
    //тут что-то делаем и exit можно использовать
  finally
    myFinalize(something);
  end;
end;
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Пред.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 223

Рейтинг@Mail.ru
cron