Exempelsamling Assemblerprogrammering

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.