Hi Leute,
ich verzweifle noch...weiß jemand wie man im 8086 Code einzelne Bits vertauschen kann?
Die Aufgabe ist folgende:
"Erstellen Sie ein Programm, welches eine 8-Bit-Folge (Byte), die im Datenbereich unter der Adresse "Original" abgelegt ist in umgekehter Reihenfolge (d.h. Bit 7 mit Bit 0, Bit 6 mit Bit1 usw vertauscht) wieder unter der Adresse "REVERSE" im Datenbereich ablegt."
Hab schon den swap befehl probiert doch bekomm die meldung das tasm den befehl nicht kennt, auch mit push und pop hab ich mir überlegt aber das problem ist das da nur bytes auf den stack können! wie kann ich einzelne bits vertauschen,,,alle überlegungen mit xor, ROR usw haben bisher nicht geklappt.
Wäre dankbar für jede Hilfe!
Gruß
Programmieren - alles kontrollieren 4.941 Themen, 20.715 Beiträge
Hi!
Beim bitweisen Schieben werden die Bits in eine Richtung rolliert (entspricht einer Multiplikation * 2 oder Division / 2). Das Bit das rausfällt wandern meistens ins Carry-Flag. Dazu passend gibt's bei vielen CPUs dann Roll befehle, die das Carryflag wieder ins Byte rollen.
Muss mal kurz für 8086 nachschlagen, damit ich nicht doch C64 ASM-Code raushaue. ;-)
Die Bfehle lauten RCL und RCR (Rotate with Carry Left und Rotate with carry Right). Es gibt noch haufenweise andere Varianten SAR, SAL, SHR, SHL, ROR, ROL. Am besten du schaust selbst mal kurz in eine Referenz rein.
Wie's realisiert wird ist klar, oder? Z.B. Rechts rausscheiben und links wieder rein.
Bis dann
Andreaas
ja aber wie kann ich zb wenn ich: 01001100 habe dies zu 00110010 vertauschen das muss doch immer elementweise geschehen Bit 7 mit Bit 0, bit 6 mit bit 1 usw
mit RCL oder RCR komm ich da nicht weiter und die anderen dinger verschieben nur aber wie kann ich tauschen?
Hi!
Am besten aufmalen (kein Witz):
- schiebe das byte um 1 Bit nach Rechts
-> 1 Bit landes im Carry
- Schiebe das Carry-Bit nach Links in ein anderes Byte
Mach das ganze 8mal hintereinander (immer schön Rechts raus und Links rein ins zweite Byte).
Bis dann
Andreas
Danke euch!
Habs jetzt geschafft mein schlüsselbefehl der mir zum Glück verholfen hatte war RCL nun hauts hin schauts euch an. Aber vorher noch weiß jemand vielleicht du Andreas oder mr.escape wie man eine Eingabe der 8Bit machen könnte, weil momentan hab ich ja einen festen wert immer. Und noch was beim Aufgabenblatt stand "8 Bit Folge im Datenbereich unter der Adresse original"
ich habs mit original db xxxxxxxx gemacht ist das jetzt die adresse oder nur ne variable?
Start:
mov dh,ORIGINAL ; Original in dh schreiben
Schleife: SHR dh,1 ; bitweise rechtsschiebung um 1
RCL dl,1 ; CF ins LSB reinschieben,
INC cl ; cl um 1 erh”hen
CMP cl,8 ; vergleich ob cl und 8 gleich
JL Schleife ; Sprung solang cl kleiner 8
mov REVERSE,dl ; vertauschter wert in Reverse schreiben
; Programmende
mov al,0 ; Fehlercode 0
mov ah,4Ch ; Funktion: Programm verlassen
int 21h ; Schnittstelle zu DOS
;********************************************************************
;Datenbereich
ORIGINAL db 10011001b
REVERSE db 0
Hi!
Du arbeiteset jetzt auf der Ebene der CPU, da gibt es sowas wie Variablen streng genommen nicht. Es gibt zwar einige Assembler die Variablen unetrstützen, aber letztendlich reichen die dann auch nur die Adressen auf einen reservierten Speicherbereich weiter.
Es kann aber auch sein, dass die SHR&Co auch direkt Speicheradressen rotieren können, ich schu mal kurz nach...
Ich denke, dass geht ab 80186-CPUs.
Damit wären wir bei der ersten Frage. Ich weiss nicht, was du mit Eingabe meinst. Es gibt keinen ASM-Befehl, der einfach eine taste oder sowas einliest, dazu muss man entsprechende Routinen schreiben bzw. bei PCs unter DOS die richtigen Interrupts aufrufen.
Oder möchtest du dein Programm als ASM-Unterroutine einsetzen? Dann müsstest du einfach festlegen, wie der Zähler für deine Bits übergeben wird. Man könnte zum beispiel festlegen, dass die Anzahl der zu verscheiebenden Bits in AL übergeben wird. Am Anfang der Routine wird dann CL mit (AL-8) belegt. (Du müsstest CL sowieso nich intialisieren, also mit Null vorbelegen.)
Bis dann
Andreas
ok danke.
mit der eingabe hab ich nochmal einen kumpel gefragt man müsste mov ah,1 machen und dann per interrupt die Dos schnittstelle aufrufen aber passt schon.
Bedanke mich nochmal recht herzlich!
gruß
start: 01001100 ? ????????
1. 00100110 0 ????????
2. 00100110 ? ???????0
3. 00010011 0 ???????0
4. 00010011 ? ??????00
5. 00001001 1 ??????00
6. 00001001 ? ?????001
7. 00000100 1 ?????001
8. 00000100 ? ????0011
9. 00000010 0 ????0011
10. 00000010 ? ???00110
11. 00000001 0 ???00110
12. 00000001 ? ??001100
13. 00000000 1 ??001100
14. 00000000 ? ?0011001
15. 00000000 0 ?0011001
16. 00000000 ? 00110010
jeder ungerade schritt ist ein links-schieben (bit null wandert ins carry) von register1 und jeder gerade schritt ist ein rechts-schieben (carry nach bit null) von register2.
mr.escape