Ausgabe auf die 7-Segment Anzeige
MOV [253], 119 MOV [254], 124 MOV [255], 57
For-Loop
MOV A, 10 ; loop counter MOV B, 232 ; start output address MOV C, '0' ; start letter loop: MOV [B], C ; Write letter to address pointed at by B INC B ; Increase output position INC C ; Increase letter DEC A ; Decrease loop counter JNZ loop ; last result not zero? Then jump to loop HLT
Produzieren Sie die Ausgabe 'abcdefghijklmnopqrstuvwx'
Subroutine, Parameter in Registern
start: MOV C,232 ; Address in to C MOV B,4 ; Digit in to B CALL showDigit ; Display the digit MOV B,2 ; new digit in B INC C ; Increase address CALL showDigit HLT ; Params in registers: ; B digit to print (as a number 0-9) ; C address where to print showDigit: PUSH B ; Save B onto the stack ADD B,'0' ; Add 48 (Code of '0') MOV [C], B ; Write ASCII to address pointed by C POP B ; Restore B from the stack RET ; Return
Eine subroutine sollte Register nicht verändern. Braucht man trotzdem Register, sollen diese erst auf den Stack gesichert und danach wieder vom Stack in umgekehrter Reihenfolge wieder hergestellt werden.
Der CALL
-Befehl schreibt die Rücksprung-Adresse auf den Stack, die dann vom RET
-Befehl wieder gelesen wird. Verfolgen Sie diese im Simulator.
Es ist darum absolut notwendig, dass SP vor dem RET
auf die gleiche Adresse zeigt, wie am Anfang der subroutine. D.h. es müssen gleich viele PUSH
und POP
Befehle ausgeführt worden sein.
Subroutine, Parameter auf dem Stack
MOV A,42 ; set A PUSH 13 ; we want mod 13, so push it onto the stack CALL mod ; call mod INC SP ; correct Stack-Pointer (Same as POP, but ignore value) HLT ; Result now in register A ; Computes A mod X, where X is on the stack ; Result will be in A mod: PUSH B ; Save B PUSH A ; Save A DIV [SP+4] ; SP+1 is A, SP+2 is B, SP+3 is return address MUL [SP+4] MOV B,A ; B = A - A % X POP A ; restore A SUB A,B ; now A = A % X POP B ; restore B RET ; return, result in A
Unter Verwendung der obigen Beispiele und subroutinen, schreiben Sie ein Programm, das ein Byte dezimal in die Ausgabe schreibt.
Verzweigungen (if, else)
MOV A, 42 ; 1st value to compare MOV B, 23 ; 2nd value to compare CMP A,B ; Compare (subtraction, sets Z,C flags) JB less ; Carry flag set? then it's less JE equal ; Zero flag set, then it's equal MOV [232],'>' ; Not jumped, so it's greater JMP endif ; Jump to 'after if' less: MOV [232],'<' JMP endif equal: MOV [232],'=' endif: HLT
Schreiben Sie eine oder mehrere Subroutinen, die ein Byte als zweistellige Hexadezimalzahl in die Ausgabe schreibt (0-padded). Verwenden Sie dafür bitweise logische Operationen.
Arrays Studieren Sie folgenden Sortier-Algorithmus:
JMP start arrayStart: DB 's' DB 'y' DB 'i' DB 'b' DB 'p' DB 'o' start: ; copy to output aerea MOV A, arrayStart MOV B, 232 copyLoop: MOV C,[A] MOV [B],C INC A INC B CMP A,start JNE copyLoop ; Write len variable, setup start address MOV A, start MOV B, arrayStart SUB A,B ADD A,232 MOV [last], A MOV A, 232 ; Start sorting loopA: MOV B,A loopB: INC B CMP B,[last] JNC nextA MOV C,[A] MOV D,[B] CMP C,D JBE loopB MOV [A],D MOV [B],C JMP loopB nextA: INC A CMP A,[last] JB loopA HLT last: DB 0
Ziffern auf 7-Segment-Anzeige
Mit Hilfe eines Arrays, schreiben Sie eine subroutine, die eine Ziffer auf der 7-Segment-Anzeige ausgibt.
Zusatz: Geben Sie ein Byte auf der 7-Segmentanzeige dezimal aus.
Bonus: Implementieren Sie QuickSort.
L O L
in der 7-Segment Anzeige ausgegeben wird. (Das Programm sonst darf nicht verändert werden!); Dieses Programm gibt den String rechtsbündig ab ; Adresse 250 aus. ; JMP start DB "hello world" ; ; Register ; A Ausgabe-Adresse ; B Position in DB ; C temporär start: MOV A,250 ; Adresse Ausgabe (letzter Buchstabe) MOV B, start ; Adresse+1 vom letzten Buchstaben DEC B ; B vermindern CALL ausgabe HLT ausgabe: MOV C,[B] ; Buchstabe in C MOV [A],C ; Ausgabe DEC A ; A vermindern DEC B ; B vermindern CMP B,1 ; ist B am Anfang angekommen? JNE ausgabe ; sonst wiederholen RET
Die Ausgabe auf die drei 7-Segment Anzeigen erfolgt auf die Adressen 253 bis 255.
Die Bits auf der Anzeige sind wie folgt nummeriert:
+--0--+ 5 1 :--6--: 4 2 +--3--+