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

Zápis programu

Popis

Zápisem programu odlišujeme jednotlivé jazyky. Zápis odpovídá formě, z jaké je překladač schopen převést zdrojový kód (Pascal, C++,... ) na kód cílový (strojový kód, bytecode). U interpretů (JavaScript, PHP) je zápis interpretovatelnou formou.

Kaľdý program má právě jeden vstupní bod (začátek).

JSA

Textové soubory (.asm) nebo vkládaný assembler v některém vyšším programovacím jazyce. Zápis odpovídá strojovým instrukcím vyjádřených symbolickým jménem. Například symbolické mov eax, 2 odpovídá 10111000 00000010 00000000 00000000 00000000 ve strojovém kódu (jde o přesun 32-bitového celého čísla do 32-bit registru eax).

Pro zápis existují dvě konvence: Intel a AT&T. Vkládaný Intel používá MS Visual C++ a AT&T zase překladače gcc (MinGW, Dev-C++). Opomineme-li obrácený zápis, má assembler AT&T "blíže" ke strojovému kódu než Intel a programování v něm dá více práce: například je nutné explicitně uvádět formát operandů instrukce (AT&T movb/movd/movl jako přesuň bajt/slovo/dvojslovo vs. Intel mov pro přesun bajtu, slova i dvojslova).

Dva následující kódy uloží hodnotu 2 do registru eax:

  • Intel: operace cíl, zdroj (mov eax, 2)
  • AT&T: operace zdroj, cíl (movl 2, %eax)

Věnujeme se procesorům s instrukční sadou x86 (386, 486, Pentium...) včetně klonů AMD. Jiné procesory budou mít zpravidla odlišnou instrukční sadu a uvedené příklady na ně nebudou přenositelné.

.asm

Zdrojové soubory lze překládat například překladačem NASM (Netwide Assembler pro Windows, Linux, Unix, FreeBSD).



kostra programu[ program.asm ]
;16-bitovy model
  bits 16

;zacatek casti s instrukcemi
  segment code 
	
;zacatek programu
..start: 
    ;nastaveni segmentu
    mov ax,DATA
    mov ds,ax       ;data segment
    mov ax,stack 
    mov ss,ax       ;stack segment
    mov sp,stacktop ;stack pointer

    ;TODO : vlozte svuj kod...
     mov ax, 2
     add ax, 2 ;v ax je 4 = 2 + 2

    mov ah,4ch      ;ukonceni programu
    int 21h

;data programu
  segment DATA

;rezervace pameti pro zasobnik
  segment stack stack 
        resb 1000
         
;vrchol zasobniku = adresa konce rezervovane pameti pro zasobnik
stacktop:	  

Vkládaný assembler Intel

Vkládaný assembler v MS Visual Studio C++ uzavřeme do bloku __asm { } .



__asm { }[ intel.cpp ]
#include <stdio.h>
int main(int argc, char *argv[]) {
  int c;
  
  __asm {
    mov eax, 2  ; eax = 2
    add eax, 2  ; eax = eax + 2
    mov c, eax  ; c   = eax
  }
  
  printf("vysledek 2+2=%d", c);
  return 0;
}

Vkládaný assembler AT&T

Vkládaný assembler pro překladače GCC uzavřeme do bloku asm ( );.



asm ( )[ att.cpp ]
#include <stdio.h>
int main(int argc, char *argv[]) {
    int c;
    
    asm (
          " movl $2, %%eax ; " /*  eax = 2         */
          " addl $2, %%eax ; " /*  eax = eax + 2   */
          " movl %%eax, %0 ; " /*  c   = eax       */   
             
          :"=r"(c)             /*  vystup do c     */
          :                    /*  vstup (prazdne) */
          :"%eax"              /*  pouzity registr */
        ); 
             
        
    printf("vysledek 2+2=%d", c);
    
  return 0;
}

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