Faktaruta 1 ************************* * Allmänna register * * * * Bit 15-8 7-0 * * Ax Ah, Al * * Bx Ah, Al * * Cx Ah, Al * * Dx Ah, Al * *************************MOV är den vanligaste assembler instruktionen. Den flyttar data till en destinationen från en källa.
Exempel på inline assembler i C: asm mov Ax, 5 // flyttar talet 5 till Ax, asm betyder att nu //kommer en assembler instruktion.Nästa exempel är ett fullt körbart exempel som använder instruktionen ADD. ADD adderar två register och placerar resultatet i det första.
;Exempel på körbart program som adderar två tal och placerar resultatet i variabeln resultat
.model small .Data ; segment för data TAL1 DW 5 ; deklarera variabler TAL2 DW 7 ; deklarera tal2 som ett word med startvärde 7 RESULTAT DW ? ;resultat word som vi inte vet värdet av än .Code ; segment för kod Start: mov Ax, TAL1 ;kopierar tal1 till ax (talet 5 alltså) add Ax, TAL2 ;adderar tal2 (7) till Ax (5) och placerar ;resultatet (12) i Ax mov RESULTAT,Ax ;kopierar Ax (12) till variabeln resultat END Start ;talar om för assemblatorn att programmet slutar här och att det börjar vid startförsta raden talar om vilken typ programmet skall vara av, small är den minsta modellen men fungerar för alla program som jag tänker gå igenom (det går t ex att ställa in borland c's kompilator för vilken modell man vill ha och det är precis samma namn där Huge är den största). Den andra raden talar om att nu kommer variabeldeklarationer precis som man gör överst i ett c eller pascal program. DW betyder declare word, man kan även skriva DB som betyder declare byte. .Code betyder att nu börjar själva koden. Mellan .Code och END är programmet, vanligtvis litet längre men strukturen på assemblerprogrammen ser ut på det här sättet. Ett program innehåller alltid minst två segment. Först datasegmentet som innehåller variabler och arrayer och sen kodsegmentet som innehåller själva programmet.
Nu kommer samma program i inline assembler i c:
// addera två tal med hjälp av inline assembler
void main(void)
{
int tal1 = 5,tal2 = 7,resultat;
asm{
mov Ax,tal1 // kopiera tal1 till Ax OBS att tal1
// måste vara int (16 bitar)
add Ax,tal2
mov resultat,Ax
}
} // slut på main
Detta program gör exakt samma sak som resultat = tal1 + tal2; skulle ha gjort fast litet snabbare.
Det är dock inte vid vanlig addition man gör de största tidsvinsterna med assembler utan vid olika slags
grafik hantering. Bara att använda register istället för minnesvariabler går upp till 100 ggr fortare.
Observera att man istället för Ax kunnat använda enbart Al eller Ah (eller vilket som helst av de andra
allmänna registren) eftersom talen var mindre än 256.
Faktaruta 2
***************************************** * Uppbyggnad av ett assemblerprogram * * * * .model Small ;Storlek * * .Data ;Datasegment * * . . . * * . . . ;Variabeldeklarationer * * . . . * * .Code ;Kodsegment * * Start: * * . . . ;Huvudprogram * * . . . * * . . . * * END Start ;Slut * *****************************************
Faktaruta 3Cs:ip innehåller adressen till nästa instruktion som ska utföras (behöver vi inte bry oss om). Flags innehåller information om senast utförda beräkning eller jämförelse (om noll eller spill osv), används bl a vid villkorliga hopp.
***************************************************************** * Alla registren * * * * Bit 15-8 7-0 * * Ax Ah, Al * * Bx Ah, Al Allmänna register * * Cx Ah, Al * * Dx Ah, Al * * * * Bit 15-0 * * Si Indexregister * * Di * * * * Sp Stackpekare * * Bp * * * * Cs * * Ds Segmentregister * * Ss * * Es * * * * ip Instruktionspekare * * Flags Flaggregister * *****************************************************************
Exempel: mov Ax,10 ;laddar Ax med 10 mov Bx,5 ;laddar Bx med 5 mul Bx ;multiplicerar Bx med Ax, resultatet (50) placeras i AxDe 16 lägsta bitarna placeras i Ax och de 16 högsta bitarna placeras i DX. Om resultatet är mindre än 65536 hamnar alltså alla signifikanta bitar i Ax (alla bitar som betyder något).
Exempel: mov Cx, 50 ;flytta antalet ggr något ska göras till Cx enloop: ... ;enloop är en sk label som markerar en ;position i minnet ... ;namnet på labeln byts ut av assembleraren ;mot en minnesadress ... loop enloop ;minskar cx med ett och hoppar tillbaka till labeln ;som anges efter loop ;om cx är skilt från nollLoop-instruktionen motsvarar en for-sats i c eller pascal och använder alltid Cx som loopräknare. Vad som skall göras i loopen bestäms naturligtvis av programmeraren.
Exempel: .Data . . Palett DB 0,1, 2, 3, 4, 5 . . . .Code . . . mov Si, OFFSET Palett ;laddar si med ;offseten till arrayen palett lodsb ;laddar Ax med innehållet i . ;adressen DS:SI . ;som är första byten i arrayen palettOFFSET Palett ger skillnaden (offseten) mellan adressen till Palett och Ds (datasegmentet). Instruktionen lodsb kopierar en byte från adressen som ds:si pekar på, till Ax. Dessutom räknas si upp ett steg så att om man gör lodsb igen, laddas andra byten i Palett till Ax. Lodsw laddar två byte (ett word) på samma sätt fast räknar upp Si med två steg.
Exempel: mov Ax, 0B800H ;adressen till skärmen i textmod ;H betyder hexadecimalt mov Es,Ax ;ladda es med adressen till bildminnet mov Di, 0 ;första byten på skärmen ;(längst upp till vänster) mov Ah, 'A' ;bokstaven stora A ska skrivas mov Al, 7+ 4*16 ;vit (färg 7) text på röd (färg 4) bakgrund stosw ;skriv ut tecknet och färgattributet ;till skärmenInstruktionen stosw kopierar ett word från Ax till adressen som es:di pekar på. Dessutom räknas di upp två steg så att om man gör stosw igen, skrivs samma tecken och attribut ut på nästa position på skärmen. (se Avsnittet Bildskärmen i Textmod för mera information om adresser, färger osv). Stosb gör samma sak som stosw fast flyttar bara en byte och räknar bara upp di ett steg.