IS1200 Exempelsamling till övning CE_O3, 2015 CE_O3. Nios II. Inför lab nios2time 3.1. Logiska operationer (se uppgift 1.2 c) Repetera (eller lär dig) innebörden av de logiska operationerna "bitvis AND", "bitvis OR" och "bitvis XOR". Undersök vad Nios II har för instruktioner för logiska operationer, och hur de används för registeroperander och med Immediate operand. Det finns även en NOR-instruktion. Studera hur man med dessa instruktioner kan nollställa, ettställa eller invertera utvalda enskilda bitar i ett register, till exempel r8. a) Vilka operandutpekningsmetoder kan användas? b) Vilka typer av operander kan instruktionerna operera på? c) Hur kan man nollställa enstaka bitar i ett register? Ge exempel på en instruktion som nollställer bit 4 i register r8. d) Hur kan man ettställa enstaka bitar i ett register? Ge exempel på en instruktion som ettställer bit 2 i register r9. e) Hur kan man invertera enstaka bitar i ett register? Ge exempel på en instruktion som inverterar bit 7 i register r10. f) Hur kan man invertera samtliga bitar i ett register? Ge exempel på en instruktion som inverterar samtliga 32 bitar i register r11. Uppgifter till övning CE_O3, sida 1 (av 5) 2015-01-13
3.2. Ladda en konstant till ett register Med hjälp av den syntetiska instruktionen (pseudoinstruction) MOVIA R dst, Imm kan man ladda ett konstant värde. Imm, till ett register R dst. Föreslå hur man med verkliga Nios-II-instruktioner kan utföra denna operation för olika värden. Skilj på konstanter som kan lagras i 16 bitar och konstanter som kräver 32 bitar för att lagras. a) Konstanten ryms i 16 bitar. Kan man använda 16-bitars negativa värden? b) Konstanten ryms i 32 bitar. Kan man använda 32-bitars negativa värden? Ett 32-bitars ord kan vara "data" eller "adress" beroende på hur det används i ett program. c) Ge exempel på instruktioner för att nollställa register r17. Ange för- och nackdelar med de olika förslagen. Översätt koden till binär och/eller hexadecimal kod. d) Ge exempel på instruktioner för att ladda register r17 med värdet +1, och med värdet -1. Översätt koden till binär och/eller hexadecimal kod. 3.3. Pseudo-instruktioner och makron En pseudo-instruktion är fördefinierad, och expanderas av assemblern (översättarprogrammet) till en eller flera andra instruktioner. Nios II Processor Reference Manual beskriver de tillgängliga pseudoinstruktionerna. Programmeraren kan också definiera egna koder som liknar pseudo-instruktioner, men de kallas för makron. Efter makrodefinitionen.macro CLR ADD.endm reg \reg, r0, r0 kommer assemblern att byta ut raden CLR R17 mot makroexpansionen ADD R17,R0,R0 a) Skriv makrodefinition för INV reg som inverterar samtliga 32 bitar i angivet register. b) Skriv makrodefinition för NEG reg som negerar innehållet i angivet register. Negera betyder "ta fram 2-komplementet". c) Skriv makrodefinition för ADDIA ra, rb, value som ska fungera som ADDI, men för godtycklig 32-bitars konstant (i 2-komplementrepresentation). Uppgifter till övning CE_O3, sida 2 (av 5) 2015-01-13
3.4. Subrutin för multiplikation av två godtyckliga tal, med hjälp av additioner och skift. Skriv en subrutin mul som multiplicerar två positiva 32-bitars heltal. Förutsätt att produkten av de två talen kan lagras i 32 bitar. Du behöver inte skriva kod för att kontrollera om resultatet blir för stort. Som vanligt för Nios-II finns inparametrar i register r4 och r5, och det beräknade resultatet ska vid returen levereras i register r2. Multiplikationen ska utföras som en loop med 32 varv som gör upprepade additioner och skift med mera. Du får använda register r2 till och med r15 som arbetsregister. Alla andra register ska ha oförändrat innehåll vid returen från din subrutin. Den algoritm du ska använda liknar den "algoritm" som man vanligen använder vid decimal multiplikation för hand med penna och papper. a) Rita ett flödesschema för subrutinen mul. b) Skriv assemblerkod för subrutinen mul. c) Ungefär hur lång tid tar multiplikation med denna subrutin? d) Kan det bli overflow? (Överkursfråga.) e) Hur fungerar programmet för negativa tal? (Överkursfråga.) 3.5. Programutveckling Diskutera de olika steg som ingår i arbetet med att skriva och provköra ett program i C-kod och assemblerkod. Vilken typ av kommandon kan vara praktiskt att ha tillgång till och vilka filer vill man ha genererade? Om detta finns en hel del föreläsningsbilder från föreläsning 3 och/eller 4. 3.6. Minnesdisposition Visa hur den tillgängliga adressrymden disponeras. Av dessa adresser är vissa reserverade för speciella ändamål som inte avslöjas ännu. Din programkod, text och data, kommer att placeras på adress 0x800000 och uppåt Om Du vill använda en stack måste stackpekaren (sp=r24) initieras till ett värde som pekar på ledigt minnesutrymme. Vårt programutvecklingssystem för Nios-II fungerar bäst om Du glömmer att själv reservera plats för stack och initera stackpekare. Vi rekommenderar/befaller att Du helt och hållet överlåter reservering av stackarea och initiering av stackpekare till programutvecklingssystemet. Uppgifter till övning CE_O3, sida 3 (av 5) 2015-01-13
3.7. Mall för ett program Diskutera en vanlig utformning av ett program dvs vilka delar som brukar ingå samt lite tips om hur man kan utnyttja include-satser, define-satser och macros för att underlätta hanteringen. 3.8. Vilka program ska skrivas i laboration nios2time I laborationspm för laborationen Nios2Time finns specifikationer för de subrutiner som ska skrivas som förberedelse inför laborationen. På övningen diskuteras subrutinerna HEXASC, PUTTIME, TICK och DELAY med möjlighet att få konkreta tips på bra algoritmer och instruktioner. Studera även i lab-pm hur man kan använda flödesschema för att beskriva algoritmer i sina programkoder. 3.9. Biblioteksrutinen putchar Det finns en användbar uppsättning av subrutiner som tillhandahålls av programutvecklingssystemet. Här nämner vi bara (klippt ur lab-pm för nios2time) The standard C library routine putchar To send output to the Console window, we use the built-in function putchar. The putchar subroutine expects one parameter: r4 contains the byte to be sent. Den kan anropas från program skrivna i C-kod eller assemblerkod med följande parameteröverföring. Anrop ska ske med en parameter i C-kod. I assemblerkod placeras motsvarande parameter i register r4. Parametern innehåller ASCII-koden för det tecken som ska skrivas. Skriv Nios-II-assembler för en del av ett program som skriver ut texten "Hej!" i början på en ny rad. Subrutinen putchar ska användas för att skriva ut varje tecken. 3.10. Hallå där vänta en liten stund Det behövs en subrutin WAIT som medför att instruktionen CALL WAIT tar cirka 1 millisekund att exekvera. Subrutinen WAIT ska exekveras på labutrustningen med en processor Nios II med klockfrekvensen 50 Mhz. Subrutinen WAIT ska återlämna alla register med samma innehåll som vid anropet. Körtiden kan approximeras genom att anta att varje instruktion tar en klockcykel. a) Rita flödesschema för subrutinen. b) Skriv assembler-programkod för subrutinen i Nios-II-assembler. Uppgifter till övning CE_O3, sida 4 (av 5) 2015-01-13
3.11. Hallå där vänta en lite längre stund Det behövs en subrutin WAITX som medför en fördröjning av så många 1-millisekunders intervall som anges av innehållet i r4 vid anrop av WAITX. Det är svårt på gränsen till omöjligt att få en exakt fördröjning, så det räcker att det blir ungefär rätt. Denna rutin är ett exempel på en parameterstyrd fördröjning. a) Rita flödesschema för subrutinen. b) Skriv assembler-programkod för subrutinen i Nios-II-assembler. 3.12. Assemblerdirektiv Diskutera olika assemblerdirektiv som finns (och borde finnas eller tvärtom)! Uppgifter till övning CE_O3, sida 5 (av 5) 2015-01-13