230 likes | 468 Views
Cosc 2150: Computer Organization. ARC assembly code Simplified SPARC language. ARC Hardware. There are 32 32-bit registers. %r0 through %r31. Reserved registers: %r0 is always 0. Storing anything in %r0 will be lost. %r14 is a stack pointer register also called %sp
E N D
Cosc 2150:Computer Organization ARC assembly code Simplified SPARC language
ARC Hardware • There are 32 32-bit registers. %r0 through %r31. • Reserved registers: • %r0 is always 0. • Storing anything in %r0 will be lost. • %r14 is a stack pointer register • also called %sp • %r15 is link register (used for subroutine calls)
There are two addition registers • %pc, a 32-bit program counter register • %psr, which is a processor status register Where arithmetic/logic flags are set. • They are N,Z,V,C, • where N is a negative flag • Z is the zero flag • V is the overflow flag • C is the carry flag. • The lowest 211 = 2048 addresses of the memory map are reserved for use by the operating system.
A Basic ARC assembly program .begin .org 2048 !Lowest space in memory a program can go main: !special label, for start of your code !Assembly instructions halt !end of assembly code var: value ! variable: value of the variable. .end
Arithmetic instructions • All arithmetic and logic instructions have 3 opcode: instruction op1, op2, op3. • Only op2 can be immediate load/ number otherwise, they will refer to a register. • Any instructions that end in a cc, set condition codes (NZVC) • addcc %r0, 1, %r1 • (%r1 = 0 + 1) would set N=0, Z=0, V=0, and C=0 • subcc %r0, 1, %r1 • (%r1 = 0 – 1) would set N=1, Z=0, V=1, and C=0 • Assuming %r1 = 1, subcc %r1, 1, %r1 • (%r1 = %r1 –1), would set N=0, Z=1, V=0, and C=0
Data transfer instructions • All have 2 opcode instructions. • load: • ld [x], %r1 !load the value of x into %r1 • ld %r1+x, %r2 !load the value found by %r1 +x (offset) into %r2 • store: • st %r1, [x] !store the value of %r1 into x • st %r2, %r1+x ! store the value of %r2 into the address %r1 +x
Branch instructions • All but one branch instruction have a single opcode in the following format • branch label ! branch conditionally or unconditionally to the label • example: ba done !branch to the label done ! assembly code done: halt ! stop the program • be, bcs, bcc, bneg, bvs, bvc, bne, bpos all use the NZVC condition flags to as the condition whether to branch or not. • jmpl and call are used for subroutines, which will be covered later.
The ARCTools Edit Window • • The Edit window with an asm file and the file dialog
Assembly • The arc4 program after assembly, showing arc4.lst, the listing file.
Binary File • The arc4 bin file, displayed after pressing the Show Binary File button.
Simulation • The ARCTools simulator window after pressing Bin -> Sim.
Simulator note. • You need a blank line at the end of the program or the program will not compile with normally a very strange error that makes no sense.
ARC example code (1) Example 1 main () { int a=15, b=5,c; c = a+ b; } .begin .org 2048 main: ! c = a +b ld [a], %r1 ld [b], %r2 addcc %r1, %r2, %r3 st %r3, [c] halt a: 15 b: 5 c: 0 .end
ARC Example code (2) Example 2 main() { int a =2, c=0; if (a == 2) { c =a*4; } else { c = a/2; } } .begin .org 2048 main: ld [a], %r1 !if (a==2) subcc %r1, 2, %r0 bne else ! true c= a*4 sll %r1, 2, %r1 ba done ! false c = a/2 else: srl %r1, 1, %r1 done: st %r1, [c] halt a: 2 c: 0 .end
ARC code example (3) Example 3 main () { int a=15, b=5, c; if (a>=b) c = a - b; else c a + b; } .begin .org 2048 main: ld [a], %r1 ld [b], %r2 !if (a>=b) subcc %r1, %r2, %r3 bneg false st %r3, [c] ba done false: add %r1, %r2, %r3 st %r3, [c] done: halt a: 15 b: 5 c: 0 .end
ARC code example (4) Example 4 main () { int x = 0; while (x <5) { x = x +1; } .begin .org 2048 main: ld [x], %r1 !while (x<5) top: subcc %r1, 5, %r0 bpos done !x = x+1 add %r1, 1, %r1 st %r1, [x] ba top done: halt x: 0 .end
ARC code example (4 modified) • Example 4 main () { int x = 0; while (x <=5) { x = x +1; } .begin .org 2048 main: ld [x], %r1 top: subcc %r1, 5, %r2 subcc %r2, 1, %r0 bpos done add %r1, 1, %r1 st %r1, [x] ba top done: halt x: 0 .end
Helpful things to know • What is the logic to figure out the following • If (a>=b) or (a>=1) or any constant • If (a>b) or (a> 1) • If (a < b) or (1 < b) • If (a <= b) or (1 <= b) • If (a==1) or (a==b) • Complex if statements • If ( (a >10) && (b < 10) )
ARC code example (5) • Example 5 int a=2, b=2, i=1; while (i < 5) { a += b; ++i; } } • Give it a try
ARC code example (5 cont.) .begin .org 2048 main: ld [i], %r1 top: subcc %r1, 5, %r0 bpos done ld [a], %r2 ld [b], %r3 add %r2, %r3, %r2 st %r2, [a] add %r1, 1, %r1 st %r1, [i] ba top done: halt a: 2 b: 2 i: 1 .end
Q A &