Advertisement
Guest User

moinmoinhoho

a guest
Dec 9th, 2016
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.23 KB | None | 0 0
  1. .include "m32def.inc"
  2.  
  3. .cseg
  4. .org 0x0000 ; Platziert das Programm ab Adresse 0x0000 im Programm-speicher
  5.  
  6. ldi r17,low(RAMEND) ; Low Stackpointer und
  7. out spl,r17
  8. ldi r17,high(RAMEND) ; High Stackpointer auf
  9. out sph,r17 ; Ende des SRAMs setzen
  10.  
  11. ldi r26,$10 ; Zeiger auf Ende des Ausgabestrings
  12. ldi r27,$02
  13.  
  14. rcall ausgabe_loeschen
  15.  
  16. ;-----------------------------------------------------------
  17. ; Eingabe für die Konvertierung
  18.  
  19. ldi r16,188 ; Unteres Bytes der Dezimalzahl
  20. ldi r17,154 ; oberes Byte der Dezimalzahl
  21. ldi r18,10 ; Basis
  22. ldi r19,0
  23.  
  24. ;-----------------------------------------------------------
  25. ; Konvertierung der Eingabe nach dem Horner-Schema
  26.  
  27. ldi r24,0
  28. horner:
  29. rcall div_16
  30. rcall ausgabe_ziffer
  31. mov r16,r20
  32. mov r17,r21
  33. cp r20,r24
  34. cpc r21,r24
  35. brne horner
  36. end:
  37. rjmp end ; Endlosschleife am Programmende
  38.  
  39. ;-----------------------------------------------------------
  40. ; Routinen zur 8- und 16-Bit Division
  41.  
  42. div_8:
  43. ; Vorzeichenlose 8-Bit Division
  44. ; Eingabe: r16 - Dividend; r18 - Divisor
  45. ; Ausgabe: r16 - Teilungsrest; r20 - Ergebnis
  46.  
  47. ldi r20,0
  48. ldi r22,1 ; Hilfswert
  49.  
  50. loop_8:
  51. cp r16,r18
  52. brlo less8
  53.  
  54. sub r16,r18
  55. add r20,r22
  56.  
  57. rjmp loop_8
  58.  
  59. less8:
  60. ret
  61.  
  62.  
  63. div_16:
  64. ; Vorzeichenlose 16-Bit Division
  65. ; Eingabe: <r17,r16> - Dividend; <r19,r18> - Divisor
  66. ; Ausgabe: <r17,r16> - Teilungsrest; <r21,r20> - Ergebnis
  67.  
  68. ldi r20,0
  69. ldi r21,0
  70. ldi r22,1 ; Hilfswert
  71. ldi r23,0
  72.  
  73. loop_16:
  74. cp r16,r18
  75. cpc r17,r19
  76. brlo less16
  77.  
  78. sub r16,r18
  79. sbc r17,r19
  80. add r20,r22
  81. adc r21,r23
  82.  
  83. rjmp loop_16
  84.  
  85. less16:
  86. ret
  87.  
  88. ;-----------------------------------------------------------
  89. ; Vorgegebene Routinen zur Initialisierung und Ausgabe
  90.  
  91. ausgabe_ziffer:
  92. ; Wandelt die Binärziffer in r16 in eine ASCII-Ziffer [0-9][A-F]
  93. ; und schreibt diese in den Speicher, auf den das X-Register zeigt
  94. ; Eingabe: <r16> - Binärziffer, <r27,r26> - Speicheradresse
  95. ; Ausgabe: <r27,r26> - nächste Speicheradresse
  96.  
  97. cpi r16,0x0a ; Hex-Ziffer?
  98. brsh hex
  99. ldi r31,0x30 ; Offset für ASCII Konvertierung in [0-9]
  100. rjmp write
  101. hex:
  102. ldi r31,0x37 ; Offset für ASCII Konvertierung in [A-F]
  103. write:
  104. add r16,r31 ; Umwandlung in ASCII
  105. st -X,r16 ; Ziffer in den Speicher schreiben
  106. ret
  107.  
  108. ausgabe_loeschen:
  109. ; Füllt das Feld für die Ausgabe mit Leerzeichen
  110. ; Eingabe: <r27,r26> - Speicheradresse der Ausgabe
  111. ; Ausgabe: -
  112.  
  113. push r26 ; ursprünglichen Registerinhalt auf dem Stack sichern
  114. push r27
  115. ldi r31,0x20 ; 0x20 = Leerzeichen
  116. ldi r30,0x10 ; Schleifenvariable r30 = 16 Durchläufe
  117. loeschen:
  118. st -X,r31
  119. dec r30
  120. brne loeschen
  121. pop r27 ; Registerinhalt wiederherstellen
  122. pop r26
  123. ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement