Exempelsamling Assemblerprogrammering I uppgifterna nedan utgå från följande programskelett: #include<iregdef.h> .data var1: .word 12 var2: .word 19 sum: .word 0 prod: .float 0 .set noreorder .text .globl start .ent start start: #koden läggs här # .end start Uppgift 1 Skriv ett assemblerprogram som adderar talen i var1 och var 2 och lagrar summan i sum. Uppgift 2 Skriv ett assemblerprogram som multiplicerar talen var1 och var2 och lagrar produkten i prod. GÅ INTE VIDARE FÖRRÄN DU LÖST UPPGIFTERNA 2,3 OCH 4 KAP 4 I BOKEN Uppgift 3 Ett program för att översätta ascii-tecken till positiva heltal ser ut enligt följande i C. void main() { char strTal[10]=”1248”; int resultat=0; int temp; int counter=10; int firsttime=1; temp=strTal[counter]; while(temp != 0) { temp=temp-48; /* gör om från alfanumeriskt till tal */ if(!firsttime) result=result*10; result=result+temp; counter--; firsttime=0; temp=strTal[counter]; } } Översätt detta program till assembler och implementera det. Uppgift 4 Modifiera assembler programmet i uppgift 3 så att det även kan hantera negativa heltal. Uppgift 5 Skriv ett assemblerprogram som läser in två tal från tangentbordet och skriver ut summan av dessa på konsolen. Se appendix A för funktioner för in och utmatning. Använd programmet i uppgift 4 som en subrutin för att konvertera inmatningar till siffror. I uppgifterna nedan utgå från följande programskelett: #include<iregdef.h> .data var1: .word 0 var2: .word 0 sum: .word 0 veck: .word 0 .word 0 .word 0 .word 0 .word 0 .word 0 .word 0 .word 0 .set noreorder .text .globl start .ent start start: #koden lägs här # .end start Uppgift 6 Skriv ett assemblerprogram som läser in 8 tal från tangentbordet, lagrar dessa i vektorn vekt och skriver ut summan av talen på konsolen. Uppgift 7 Gör ett tillägg till uppgift 6 så att vektorn också skrivs ut på konsolen Uppgift 8 Skriv ett assemblerprogram som initierar vektorn vek till {1,2,3,5,10,11,4,6}och sedan utför linjärsökning på vektorn baserad på en fråga till användaren. Uppgift 9 Skriv ett assemblerprogram som initierar vektorn vek till {1,2,3,5,10,11,4,6}och sedan sorterar vektorn enligt bubblesort. Till nedanstående uppgifter finns inga skelett utan du måste konstruera dem själv. Uppgift 10 Översätt följande C kod till assembler. #include<stdio.h>; int raisedto(int base, int exponent) { if (exponent== 0) return 1; else return base * raisedto(base, exponent-1); } main() { int inbas,inexp; printf(“ange basen :”); scanf(”%d”,&inbas); printf(”ange exponent: ”); scanf(“%d”,&inexp); printf(“Resultatet är: %d”, raisedto(inbas, inexp)); } Uppgift 11 Kombinera uppgift 6,7 och 8 på ett sådant sätt att linjärsökning och sortering blir separata subrutiner och låt användaren välja om han/hon skall söka eller sortera. Resultatet efter varje val skall skrivas ut på konsolen. Uppgift 12 Gör om uppgift 11 men låt arrayen innehålla pekare till structar av följande typ. struct person{ char namn[14]; int alder; }; Låt användaren söka på namn eller ålder. Om flera personer har samma ålder returneras den första. Uppgift 13 Lös och implementera övningsuppgift 3 i kap 5 i kursboken. Uppgift 14 (Det är lämpligt att lösa uppgift 5.8.5 i boken innan du löser denna uppgift.) Modifiera programmet i uppgift 4 så att det kan generera en interupt om något otillåtet tecken (inte en siffra eller minustecken) finns i strängen. Uppgift 15 Konstruera ett program i assembler för att hantera länkade listor. Varje nod i den länkade lista skall kunna innehålla ett heltal och en referens till nästa nod i listan. Det skall vara möjligt att ta bort och lägga till noder samt söka efter en viss nod. Utnyttja det faktum att du vet var datasegmentet slutar till att hantera din egen heap. Appendix A printf Formatted print to standard output (the console). Argument(s): a0 - address to format string a1..a3 - arguments 1..3 (sp+n) - arguments 4..n Return value: none Switches: Linking a argument to the text is accompliced by inserting a %-sign followed by a character signifying the desired formate of the argument. Example of possible switches: d- argument is formated to a decimal string s- argument is interpreted as an address to an string. f- argument is formated to a float string Example: string1: .asciiz "Number %d of %d" ... la a0, string1 li a1, 12345 li a2, 67890 jal printf Will print the string "Number 12345 of 67890" to standard output. putchar Print a character to standard output (the console). Argument(s): a0 - character Return value: none Example: li a0, ’A’ jal putchar Will print character A on standard output. getchar Get a character from standard input (the keyboard). Argument(s): none Return value: v0 - character Example: none puts Print a null-terminated string to standard output (the console). Argument(s): a0 - address to string Return value: none Example: string1: .asciiz "MIPS is fun!" ... la a0, string1 jal puts Will print the string "MIPS is fun!" to standard output. gets Get a string from standard input (the keyboard). Argument(s): a0 - address to string Return value: v0 - address to string Example: string1: .space 128 ... la jal a0, string1 gets . promstrcmp Compare two null-terminated strings. Argument(s): a0 - address to string 1 (s) a1 - address to string 2 (t) Return value: v0 - result –<0 if s<t, >0 if s>t, 0 if s=t Example: string1: .asciiz "I'm bigger than you are" string2: .asciiz "No, you aren't!" ... la a0, string1 la a1, string2 jal promstrcmp Register v0 will have a value less than zero. promstrlen Determine the number of characters in a null-terminated string. Argument(s): a0 - address to string Return value: v0 - length of the string Example: string1: .asciiz "How long am I?" ... la a0, string1 jal promstrlen Register v0 will be 14. install_normal_int Install user exception/interrupt handler. The interrupt handler should return non-zero if it processed the interrupt, otherwise it should return zero. The return value is set in register v0. Argument(s): a0 - address to interrupt handler Return value: none Example: my_handler: # check if interrupt is NOT for me, if so return 0 li v0, 0 j ra # otherwise do something useful and return non-zero ... li v0, 1 j ra ... la jal a0, my_handler install_normal_int fptodp Converts arguments from single precision floating-point to double precision. Needs to be called before passing a floating-point argument to printf. Argument(s): a0 - floating-point argument Return value: v0 - msb of double precision v1 - lsb of double precision Example: string1: .asciiz "Number %f" ... li.s jal a0, 3.5 fptodp la move move jal a0, string1 a1, v0 a2, v1 printf Will print the string "Number 3.5" to the standard output.