english version while1 - stránky o programování

Funkce

Popis

Funkce a procedury jsou jenom jiná jména pro podprogramy. Požadavek na jejich provedení nazýváme volání.

  • funkce - podprogram s návratovou hodnotou
  • procedura - podprogram bez návratové hodnotou

Podprogramy usnadňují modifikaci a čitelnost programu. Obsahují často (vzácně pouze jednou) používaný úsek kódu pro jehož vykonání stačí daný podprogram zavolat. Z pohledu procesoru proběhne :

  • uložení adresy následující instrukce
  • skok na začátek podprogramu
  • provedení podprogramu
  • návrat do programu - skok na dříve uloženou adresu

Jazyk C a jazyky od něj odvozené nerozlišují mezi procedurami a funkcemi a používají pouze funkce.

JSA

NASM

  • Aby nedošlo k zničení obsahu registrů, je nutné všechny registry na začátku podprogramu uložit na zásobník a na jeho konci jejich obsah odebráním ze zásobníku opět obnovit.
  • Volání podprogramu instrukcí CALL.
  • Návrat z podprogramu instrukcí RET.


podprogram[ printb.asm ]
; vypis Bajtu 

bits 16
        
segment code 
;----------------------------------------------------------------------------
;  printb : vypis bajtu
;  hodnota pro tisk predana registrem (al)
;----------------------------------------------------------------------------
   printb:
      pushf        ; ulozeni obsahu registru
      pusha
      
      mov si, 2     ; posunuti ve vystupnim retezci
      mov bl, 10    ; zaklad soustavy
      
; opakovane deleni zakladem soustavy (bl)     
; zapis zbytku kazdeho radu do vystupniho retezce
pbdiv: 
      mov ah, 0
      div bl        ; al (div),  ah (mod) 
      add ah, '0'
      mov [strtmp+si], ah
      dec si
      cmp si, 0
      jnz pbdiv
      
      add al, '0'
      mov [strtmp], al
      mov dx, strtmp    ; zacatek retezce do (dx)
      mov si, 0
      
; odstraneni uvodnich nul cisla (001 -> 1)      
pbrem: 
      cmp [strtmp+si], byte '0'
      jne pbprint
      inc dx
      inc si
      cmp si, 2   ; odstranit prvni dve 0, treti nechat (000 -> 0)
      jne pbrem
      
pbprint: 
; vypis retezce
      mov ah, 9 
      int 21h

      popa     ; obnoveni obsahu registru
      popf
      ret      ; navrat do programu
;----------------------------------------------------------------------------	
;  printnl : novy radek
;  prechod na novy radek vystupu
;----------------------------------------------------------------------------
   printnl:
      pushf     ; ulozeni obsahu registru
      pusha
      
      mov dx, strnl ; vypis retezce
      mov ah, 9 
      int 21h

      popa     ; obnoveni obsahu registru
      popf
      ret      ; navrat do programu
;----------------------------------------------------------------------------	
;  press : 
;  cekani na stisk klavesy s vypisem zpravy 'Stisknete klavesu...'
;----------------------------------------------------------------------------
   press:
      pushf     ; ulozeni obsahu registru
      pusha
      
; vypsani zpravy
      mov dx, strwait 
      mov ah, 9 
      int 21h
  
; nacteni klavesy
      mov ah, 8		
      int 21h

      popa     ; obnoveni obsahu registru
      popf
      ret      ; navrat do programu
;----------------------------------------------------------------------------	

..start: 
  mov ax, data	
  mov ds, ax 
  mov ax, stack 
  mov ss, ax 
  mov sp, stacktop


  mov al, 125  ; hodnota pro tisk predana registrem (al)
  call printb  ; volani podprogramu
  
  call printnl ; novy radek
  call press   ; cekej na stisk klavesy


; navrat do OS
  mov ah, 4ch  
  int 21h

segment data 
strwait   	db 'Stisknete klavesu...', 13, 10, '$'
strnl     	db 13, 10, '$'  ; cr lf : '\n'
strtmp      resb 3          ; 3 vyhrazene bajty pro vystup cisla
            db '$'        
            
segment stack stack 
        resb 64 
stacktop:

Kontakt
Prohlášení o dostupnosti
Tisk stránky
Autor: Václav Bubník © 2005
vbubnik@post.cz
XHTML 1.0| CSS