![]() |
Parität in Assembler
Hallo zusammen,
ich bin absoluter Frischling in Assembler. Meine Aufgabe ist es eine 4-Bit-Zahl um den dazugehörigen Paritätsbit zu erweitern. Wie ich ihn anhängen kann, denke ich zu wissen: shll $1, %eax or p,%eax , wobei in p entweder eine 0 oder eine 1 drinsteht. Bei der Berechnung des Paritätsbits hapert es aber doch gewaltig, da ich weder Sprung-, noch Konditionalbefehle benutzen darf. Könnt ihr mir weiterhelfen? Mit freundlichen Grüßen Woyzeck |
AW: Parität in Assembler
Also die Berechnung sollte doch eigentlich kein Problem sein :gruebel:
1234 mod 2 = 0 => gerade 2345 mod 2 = 1 => ungerade ... und da hast du schon deine 0/1. |
AW: Parität in Assembler
meine letzten Assemblerroutinen habe ich vor 16 Jahren geschrieben, aber nach dem SHL müsste IMHO in das erste BIT der Inhalt des 2. Bit eingetragen werden.
|
AW: Parität in Assembler
Zitat:
Zitat:
Ich hab mittlerweile eine Lösung entwickelt, die nicht sonderlich elegant, aber funktionsfähig ist.
Code:
Ich teste das jetzt nochmal schnell durch, aber eigentlich sollte das tun.movl $15,%eax # wertübergabe movl %eax,%edx # mit edx rechne ich movl $0,%ecx # ecx speichert die anzahl der 1er and $1,%edx # edx= letzte Stelle von eax addl %edx,%ecx # summieren der quersumme movl %eax,%edx shrl %edx and $1,%edx addl %edx,%ecx movl %eax,%edx shrl $2,%edx and $1,%edx addl %edx,%ecx movl %eax,%edx shrl $3,%edx and $1,%edx addl %edx,%ecx and $1,%ecx shll %eax or %ecx,%eax |
AW: Parität in Assembler
Zitat:
Dann würde ich ihm eine Lösung präsentieren, die er vielleicht nicht erwartet hat. Man nehme vorberechnete 16 Bytes in denen der Wert der Parität steht.
Code:
In Assembler wird das mit Define Byte abgelegt:
Zahl | Parität
0000 => 0 0001 => 1 0010 => 1 0011 => 0 ... 1111 => 0
Code:
Also ich stehe ja mit X86-Assembler auf Kriegsfuss, daher sind bestimmt noch Fehler in obigem Code.
.data
LU_TABLE: DB 0,1,1,0,....,0 .text LEA %ebx, LU_TABLE # jetzt die Zahl in Register %eax dazuaddieren und man hat die Adresse # an der die Parität steht ADD %ebx, %eax # Inhalt des Bytes auslesen MOVB %cx, [%ebx] Aber das Prinzip der Nachschlagetabelle sollte klar geworden sein. |
AW: Parität in Assembler
Wenn ich mich richtig erinnere, gibt es ein Parity Flag im Flagregister. Müsste daher ausreichen, dieses Flag abzufragen. Es sollte auch Assemblerbefehhle geben, die das Flagregister laden können. Auf jeden Fall PUSHF, welcher das Flagregister auf den Stack schreibt. Von da aus in ein CPU Register POPen sollte kein Problem sein. Dann das Flag per Bitmaske auswerten.
Bei Sprungbefehlen in Abhängigkeit vom Parity Flag bin ich mit nicht sicher. Aber auf den Stack pushen und in ein Register poppen, um dann das Parity Flag abzufragen sollte klappen. |
AW: Parität in Assembler
Code:
Aber darf er ja nicht benutzen :wink:
JNP [Ziel] -> Sprung wenn Parity-Flag Null
JP [Ziel] -> Sprung wenn Parity-Flag Eins EDIT: ![]() |
AW: Parität in Assembler
Wie wär es hiermit ?
Delphi-Quellcode:
Achtung :
FUNCTION AddParity(value:byte):byte;
asm test al,al // Setzt u.a. das Parity-Flag lahf // Flags in AH (Bit 2 = Parity Flag) shr ah,2 // Parity-Flag in Carry-Flag schieben rcl al,1 // AL um 1 Bit nach oben und Carry-Flag in Bit 0 end; Das Parity-Flag ist dann = 1, wenn die Anzahl der 1er-Bits gerade ist. Wenn 32-Bit Werte benutzt werden sollen, wird es etwas länger
Delphi-Quellcode:
FUNCTION AddParity(value:integer):integer;
asm mov edx,eax test eax,eax lahf shr ah,2 rcl edx,1 mov eax,edx end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz