GNU asembler as

 


1.              Úvod

Tento návod stručně shrnuje některá základní syntaktická pravidla, platná pro GNU překladač asembleru as. Jsou vybrány jen některé direktivy, potřebné pro řešení jednoduchých úloh v předmětu POT. Předpokládá se použití překladače pod vývojovým prostředím HEW, proto nebudeme popisovat volby pro spuštění v řádkovém režimu.

Přeložené programy jsou po sestavení určené pro simulaci výpočtu na simulátoru procesoru H8S/2600.

Kompletní manuál k asembleru as je součástí instalační sady nástrojů GNU nebo jej lze stáhnout samostatně např. ze stránek firmy KPIT Cummins Infosystems ltd.

 


2.              Direktivy překladače

Parametry u některých z následujících direktiv jsou uvedeny ve zjednodušeném tvaru, přizpůsobeném typickému použití dané direktivy.

 

Direktiva Příklad použití Význam

.h8300s

.h8300s

Generování kódu pro procesor H8S/2600.

.text

.text

Začátek sekce .text (obvykle obsahující kód programu).

.data

.data

Začátek sekce .data.

.section  jméno

.section  .vects

Začátek sekce se jménem jméno.

.byte  výrazy

.byte  0x23,0xAB,'A'+1

Definice 8bitových položek (byte) s obsahem daným jednotlivými výrazy.

.word  výrazy

.word  0x1234

Definice 16bitových položek (word) s obsahem daným jednotlivými výrazy.

.long  výrazy

.long 0x12345678

Definice 32bitových položek (long word) s obsahem daným jednotlivými výrazy.

.space nn

.space  20

Vyhražení místa o délce nn bytů.

.ascii řetězec

.ascii  "Ahoj"

Definice bytů, obsazených jednotlivými znaky řetězce.

.asciz  řetězec

.asciz  "Ahoj"

Definice bytů, obsazených jednotlivými znaky řetězce. Řetězec je zakončen bytem s obsahem 0x00.

.align  výraz

.align   3

Zarovnání počítadla adres na hodnotu dělitelnou číslem 2 ^ výraz .

.equ  symbol,výraz

.equ   BASE,0x1234

Definuje symbol symbol s hodnotou výraz .

.extern  jména

.extern VAR1,VAR2

Definuje symboly jména jako externí (tj. definované v jiném modulu).

.global  jména

.global  VAR3,VAR4

Definuje symboly jména jako globální (tj. známé i v jiných modulech).

.macro  jméno

.macro  SECTI

Začátek definice makra se jménem jméno.

.endm

.endm

Konec definice makra.

.altmacro

.altmacro

Začátek platnosti speciální syntaxe pro makra (dovoluje použití direktivy LOCAL) .

.noaltmakro

.noaltmakro

Konec platnosti speciální syntaxe pro makra.

LOCAL  jména

LOCAL  VAR5,VAR6

Definuje symboly jména jako lokální v makru. Použitelné jen při předchozím použití direktivy .altmacro  .

.end

.end

Konec překladu. Řádky uvedené za .end nebudou překládány.

 


3.              Příklad

V následujícím velmi jednoduchém programu si uvedeme některá základní pravidla, která by měla být dodržena při psaní programů v asembleru.

 

       

        .h8300s

 

        .data             ; začátek datové sekce

VAR1:   .word   0xABCD    ; word s obsahem 0xABCD

VAR2:   .word   0x4321    ; word s obsahem 0x4321

VAR3:   .space  2         ; word (2 byty) s nedefinovaným obsahem

 

        .align  1         ; zarovnani adresy

        .space  100       ; 100 bytů pro zásobník

STCK:

 

        .text             ; začátek kódové sekce

        .global _start    ; _start je globální návěští

 

_start: mov.l   #STCK,ER7 ; hodnota STCK do SP

        mov.w   @VAR1,R0  ; obsah VAR1 do R0

        mov.w   @VAR2,R1  ; obsah VAR2 do R1

        add.w   R0,R1     ; R1 -> R0 + R1

        mov.w   R1,@VAR3  ; uložení R1 do VAR3

 

KON:    bra     KON       ; nekonečná smyčka na konci

        .end

       

Program sečte obsah proměnných VAR1 a VAR2 a výsledek uloží do proměnné VAR3.

  1. Direktiva .h8300s na začátku programu je nutná pro generování výstupního kódu pro procesor H8S/2600.

  2. Direktiva .data uvozuje datovou sekci, ve které jsou definovány dvě "proměnné" typu word se symbolickou adresou VAR1 a VAR2 a dále volné místo o velikosti 2 byty (odpovídá velikosti word) se symbolickou adresou VAR3.

  3. Dále je v datové sekci vytvořeno volné místo o velikosti 100 bytů pro zásobník (potřebná velikost zásobníku závisí na hloubce vnoření procedur a počtu ukládaných registrů). Symbolická adresa STCK má hodnotu, která odpovídá adrese prvního bytu za zásobníkem a je použita k naplnění registru ER7, který je standardně používán jako SP.

  4. Položky v zásobníku musí ležet na adrese zarovnané způsobem "word alignment". Proto je před definicí místa pro zásobník vložena direktiva .align 1, která zajistí zarovnání adresy začátku zásobníku. Protože se zásobník plní "shora dolů", tj. počínaje od nejvyšší adresy, musí být délka zásobníky sudé číslo, aby potřebné zarovnání bylo dosaženo i na konci zásobníku pro symbol STCK jehož hodnotou je inicializován SP.

  5. Direktiva .text uvozuje sekci s kódem programu.

  6. První instrukce programu je označena návěštím _start , které musí být definováno jako globální, tj. známé i mimo právě vytvářený modul. Jméno návěští _start koresponduje se symbolem, který je použit v modulu vects.c a umožňuje spuštění programu zavedeného do paměti simulátoru nebo skutečného procesoru. Při změně tohoto návěští je nutné příslušně upravit i soubor vects.c .

  7. První instrukcí v programu je naplněn registr ER7 (tj. SP) hodnotou symbolické adresy STCK, která ukazuje na horní konec zásobníku (zásobník není v tomto programu dále využíván, naplnění SP je zde jen pro ilustraci postupu při inicializaci zásobníku).

  8. Program je spuštěn na počítači bez jakéhokoliv operačního systému. Po provedení všech instrukcí programu proto nemůže být výpočet ukončen "předáním řízení operačnímu systému". Nekontrolovanému průběhu dalšího výpočtu je zabráněno nekonečným cyklem na návěští KON.

  9. Direktiva .end na konci programu je nepovinná. Pokud není uvedena, končí překlad nalezením konce souboru.

 


Návrat na hlavní stránku POT.

Poslední změna stránky byla provedena 12.02.2008