Løsningsforslag til ukeoppgaver 5. november 2009 Oppgave 1 --------- 1a v1 = -17; Code 12: Instruksjoner kan ikke inneholde negative tall. Korrekt: Code 12: 201000000000017 SET 1 0 17 # 17 Code 13: 501000000000001 SUB 1 0 1 # R1 = - Code 14: 301000000000005 STORE 1 0 5 # v1 = 1b v2 = v1 - 1; Code: 16: Siste parameter i SUB-instruksjonen angir et _registernummer_, ikke en _verdi_. Angitt kode vil trekke fra innholdet av register R1, og det er ikke det vi ønsker. Korrekt: Code 15: 101000000000005 LOAD 1 0 5 # R1 = v1 Code 16: 203010000000000 SET 3 1 0 # Code 17: 201000000000001 SET 1 0 1 # R1 = 1 Code 18: 501030000000001 SUB 1 3 1 # - Code 19: 301000000000006 STORE 1 0 6 # v2 = 1c v3 = v1*-2; Code 21+: Instruksjonen som kopierer R1 til R3 mangler. Korrekt: Code 20: 101000000000005 LOAD 1 0 5 # R1 = v1 Code 21: 203010000000000 SET 3 1 0 # Code 22: 201000000000002 SET 1 0 2 # 2 Code 23: 501000000000001 SUB 1 0 1 # R1 = - Code 24: 601030000000001 MUL 1 3 1 # * Code 25: 301000000000007 STORE 1 0 7 # v3 = 1d v4 = 2*v2 + 2; Code 32+: STORE-instruksjonen mangler. Korrekt: Code 26: 201000000000002 SET 1 0 2 # R1 = 2 Code 27: 203010000000000 SET 3 1 0 # Code 28: 101000000000006 LOAD 1 0 6 # R1 = v2 Code 29: 601030000000001 MUL 1 3 1 # * Code 30: 203010000000000 SET 3 1 0 # Code 31: 201000000000002 SET 1 0 2 # R1 = 2 Code 32: 401030000000001 ADD 1 3 1 # + Code 33: 301000000000008 STORE 1 0 8 # v4 = 1e v5 = v1*3 - v2*2; Uttrykket skal regnes ut som ((v1*3)-v2)*2 (slik reglene for RusC tilsier): Code 34: 101000000000005 LOAD 1 0 5 # R1 = v1 Code 35: 203010000000000 SET 3 1 0 # Code 36: 201000000000003 SET 1 0 3 # R1 = 3 Code 37: 601030000000001 MUL 1 3 1 # * Code 38: 203010000000000 SET 3 1 0 # Code 39: 101000000000006 LOAD 1 0 6 # R1 = v2 Code 40: 501030000000001 SUB 1 3 1 # - Code 41: 203010000000000 SET 3 1 0 # Code 42: 201000000000002 SET 1 0 2 # R1 = 2 Code 43: 601030000000001 MUL 1 3 1 # * Code 44: 301000000000009 STORE 1 0 9 # v5 = Oppgave 2 --------- public static void noteCode(int addr, String instrName, int instrNo, int op1, int op2, int op3, String comment) { if (! doLogCode) return; writeLogLine("Code " + fNum(addr,4) + ": " + fNum(((instrNo*100 + op1)*100 + op2)*10000000000L + op3,16) + " " + fStr(instrName,8) + fNum(op1,3) + fNum(op2,3) + fNum(op3,11) + " # " + comment); } public static void noteRes(int addr, int nWords, String comment) { if (! doLogCode) return; writeLogLine("Code " + fNum(addr,4) + ": " + fStr("",18) + fStr("RES",8) + fNum(nWords,17) + " # " + comment); } public static void noteUpdate(int addr, long newVal, int op3, String comment) { if (! doLogCode) return; writeLogLine("---> " + fNum(addr,4) + ": " + fNum(newVal,16) + fNum(op3,27) + " # " + comment); } private static String fNum(long n, int w) { String s = "" + n; while (s.length() < w) s = " " + s; return s; } private static String fStr(String s, int w) { while (s.length() < w) s += " "; return s; }