| x |
y |
z |
a |
| 0 |
0 |
0 |
1 |
| 0 |
0 |
1 |
0 |
| 0 |
1 |
0 |
1 |
| 0 |
1 |
1 |
1 |
| 1 |
0 |
0 |
1 |
| 1 |
0 |
1 |
1 |
| 1 |
1 |
0 |
1 |
| 1 |
1 |
1 |
0 |





1001010 x 1101
--------------
1001010
0000000
1001010
1001010
------------
1111000010
Convert to binary and subtract 1:
00111010 - 1 = 00111001
Flipping bits:
~00111001 = 11000110
-58 (base 10) = 11000110
78 (base 10) = 01001110(base 2)
78 +(-58) = 01001110 + 11000110 = 00010100 (base 2) (eliminate
bits beyond 8 bits) = 20 (base 10)
int isLittleEndian()
{
int i = 5;
char * p = (char *) &i;
if (*p==5) {
return 1;
}
return 0;
}
.text
.global main
main:
stmfd sp!, {fp, lr}
ldr r0,
.L2
bl
printf
ldmfd sp!, {fp, pc}
.L2:
.word .LC0
.section .rodata
.LC0:
.ascii "Hello cs250\n\000"
.section .rodata
promptA:
.ascii "a: \000"
promptB:
.ascii "b: \000"
readA:
.ascii "%d\000"
readB:
.ascii "%d\000"
printMax:
.ascii "max=%d\n\000"
printMin:
.ascii "min=%d\n\000"
printAvg:
.ascii "avg=%d\n\000"
.section .data
.align 2
/* Define variable 4 bytes each aligned to 4 bytes
int a;
int b;
*/
.comm a,4,4
.comm b,4,4
.text
/* We need to store the addresses of a and b
in .text to be able to access them in main */
addra: .word a
addrb: .word b
addrPromptA: .word promptA
addrPromptB: .word promptB
addrReadA: .word readA
addrReadB: .word readB
addrPrintMax: .word printMax
addrPrintMin: .word printMin
addrPrintAvg: .word printAvg
.global main /* main() { */
main:
stmfd sp!, {fp, lr} /* Save pc and lr */
ldr r0, addrPromptA /* Prompt a */
bl printf
ldr r0, addrReadA /* Read a */
ldr r1, addra
bl scanf
ldr r0, addrPromptB /* Prompt b */
bl printf
ldr r0, addrReadB /* Read b */
ldr r1, addrb
bl scanf
ldr r0, addra /* r0<- a */
ldr r0, [r0]
ldr r1, addrb /* r1<- b */
ldr r1, [r1]
cmp r1,r0 /* Compute max(a,b)
bgt bgreater /*b is larger. skip. */
mov r1,r0 /* put a in r1*/
agreater:
ldr r0, addrPrintMax /* print Max */
bl printf
ldr r0, addra /* r0<- a */
ldr r0, [r0]
ldr r1, addrb /* r1<- b */
ldr r1, [r1]
cmp r1,r0 /* Compute min(a,b)
blt bsmaller /*b is smaller. skip. */
mov r0,r1 /* put a in r1*/
asmaller:
ldr r0, addrPrintMin /* print Min */
bl printf
ldr r0, addra /* r0<- a */
ldr r0, [r0]
ldr r1, addrb /* r1<- b */
ldr r1, [r1]
add r1, r1, r0 /* r1 = a + b; */
mov r2, #2
sdiv r1, r1, r2 /* r1 = (a + b)/2 */
ldr r0, addrPrintAvg /* print Average*/
bl printf
ldmfd sp!, {fp, pc} /* return from main *//* } */
maxarray.s
/* Find maximum of an array of integers. Called from "C"
extern int maxarray(int *a, int n);
*/
.text
.global addarray /* maxarray(int n, int *a) { */
/* n: r0 */
/* a: r1 */
addarray:
stmfd sp!, {r4, r5, fp, lr}
/* Save pc, lr, r4, r5 */
mov r2,#0 /* sum: r2 */
/* sum= 0 */
mov r3,#0 /* i: r3 */
/* i=0; */
while:
cmp r3,r1 /* while (i!=n) { */
beq endsum
mov r4,r3 /* r4=a[i] */
mov r5,#4
mul r4,r4,r5
add r4,r1,r4 /* as r4=*(int*)((char*)a+4*i)*/
ldr r4,[r4]
add r2, r2,r4 /* sum += a[i] */
mov r5,#1 /* i++; */
add r3,r3,r5
bal while /* Go back to while */
endsum:
mov r0,r2
ldmfd sp!, {r4, r5, fp, pc}
/* return from main */
/* } */
/* Get length of a string.
extern int strlen(char *s);
*/
.text
.global mystrlen
/* s: r0 */
mystrlen:
stmfd sp!, {fp, lr} /* Save pc, lr, r4*/
/* Count chars in a */
mov r1, #0 /* len : r1; len = 0; */
skip:
ldrb r2,[r0] /* r2 <- *a */
mov r3,#0
cmp r2,r3
beq endskip /* if (*a == 0) jump endskip */
mov r3,#1
add r0,r0,r3 /* a++ */
add r1, r1, r3 /* len++ */
bal skip /* go to skip */
endskip:
mov r1, r0 / Return len */
ldmfd sp!, {fp, pc}
void memdump(char * p , int len) {
int i;
int j;
for (i=0; i < len; i++) {
printf("0x%08x: ",p);
int n = len - i;
if ( n > 16 ) n = 16;
for (j = 0; j < n; j++) {
printf("%02x ", *(unsigned char *) (p+j) );
}
for (;j<16;j++) {
printf(" ");
}
for (j = 0; j < n; j++) {
printf("%c", ((*p)>=32 && (*p) <= 127)?*p:'.');
p ++;
i ++;
}
printf("\n");
}
}
Typical output:0xbeab36e0: 41 76 00 40 09 00 00 00 30 00 00 00 e4 36 ab be Av.@....0....6..
0xbeab36f0: 00 00 00 00 00 00 28 40 48 65 6c 6c 6f 20 77 6f ......(@Hello wo
0xbeab3700: 72 6c 64 0a 00 88 00 00 80 2b 2f 40 c0 87 00 00 rld......+/@....
0xbeab3710: fb ff ff ff 05 00 00 00 00 00 00 00 00 00 00 00 ................