Subrutiner-parametrar, returvärden och lokala variabler

1.4.1. De globala variablerna
unsigned int a,b;
int c,d;

är definierade. Visa hur följande programsekvens kodas i assemblerspråk:

if( a < b )
{
  if ( c < d )
    L1;
}
L2;
	LDR	R3,a
	LDR	R2,b
	CMP	R3,R2
	BCS	.L2	@	komplementärt villkor, inget tecken
	LDR	R3,c
	LDR	R2,d
	CMP	R3,R2
	BGE	L2 	@	komplementärt villkor, med tecken
.L1:
	…
.L2:


1.4.2. De globala variablerna
int a,b,c;

är definierade. Visa hur följande programsekvens kodas i assemblerspråk:

while( a >= 0 ) { if( a < b ) c++; a--; }
While_Continue:
	LDR	R3,a
	TST	R3,R3
	BMI	While_Break @ komplementärt villkor
	LDR	R2,b
	CMP	R3,R2		@ a-b
	BGE	.L1		@ komplementärt villkor
	LDR	R1,=c
	LDR	R2,[R1]
	ADD	R2,R2,#1
	STR	R2,[R1]		@ c++;
.L1:
	LDR	R1,=a
	SUB	R3,R3,#1
	STR	R3,[R1]
	B	While_Continue
While_Break:
	...


1.4.3. Funktionen
int mini( int a, int b);

och de globala variablerna
int x,y,z;

är definierade. Visa hur funktionsanropet:
x = mini( x, y );

kodas i assemblerspråk.

    LDR     R0,x
    LDR     R1,y
    BL      mini
    LDR     R1,=x
    STR     R0,[R1]


1.4.4. Funktionen
char minc( char a, char b);

och de globala variablerna
char x,y,z;

är definierade. Visa hur funktionsanropet:
x = minc( x, y );

kodas i assemblerspråk.

    	LDR	R0,=x
	LDRB	R0,[R0]
	SXTB	R0,R0
	LDR	R1,=y
	LDRB	R1,[R1]
	SXTB	R1,R1
	BL	minc
	LDR	R1,=x
	STRB	R0,[R1]


1.4.5. Följande funktion är definierad:

int g( int a, int b, int c, int d ) { return (a+b+c+d); }
Visa hur funktionen kodas i assemblerspråk.
g:  ADD     R0,R0,R1
	ADD     R0,R0,R2
	ADD     R0,R0,R3
	BX	LR


1.4.6. Följande funktion är definierad:

int mean( int a, int b ) { return (a+b)>>1; }
Visa hur funktionen kodas i assemblerspråk.
mean:
	ADD	R0,R0,R1
	ASR	R0,R0,#1
	BX	LR


1.4.7. Följande funktion är definierad:

int mini( int a, int b ) { if( a < b ) return a; return b; }
Visa hur funktionen kodas i assemblerspråk.
mini:
	CMP	R0,R1
	BLT	.L1
	MOV	R0,R1
.L1:
	BX		LR


1.4.8. Följande funktion är definierad:

char minc( char a, char b ) { if( a < b ) return a; return b; }
Visa hur funktionen kodas i assemblerspråk.
minc:
	CMP	R0,R1
	BLE	.L1
	MOV	R0,R1
.L1:
	UXTB	R0,R0	@ konvertera till char
	BX	LR


1.4.9. Funktionen int testme( int a, int b ) är definierad. Visa hur följande funktion kan kodas i assemblerspråk:

int f ( int x, int y ) { if ( testme( x,y) ) return 1; return 0; }
f:
	PUSH	{LR}
	BL	testme
	TST	R0,R0
	BNE	.L1
	MOV	R0,#0
	B	.L2
.L1:
	MOV	R0,#1
.L2:
	POP	{PC}


1.4.10. Funktionen int g( int ) är definierad. Visa hur följande funktion kan kodas i assemblerspråk:

int f ( int a ) { if ( a > g(a+1) ) return 1; return 0; }
f:	PUSH	{R4,LR} 
	MOV	R4,R0	@ spill parameter till R4
	ADD	R0,R0,#1
	BL	g
	CMP	R4,R0
	BGT	.L1
	MOV	R0,#0
	B	.L2
.L1:
	MOV	R0,#1
.L2:
	POP	{R4,PC}