Assembler Bits im byte tauschen

(Firma: Anscheinend Corner-Cases ;-)) #2478660
Lesenswert?

Holger Gebauer schrieb:
> Hallo,
>
> wie kann ich es am einfachsten die Bits eines bytes zu tauschen?
> Ich möchte das aus
> 01011010
> 10100101
> wird.
> Das ist für das Invertieren eines Displays.
>...
>
Wahrscheinlich weißt DU es bereits.

COM – One’s Complement
Description:
This instruction performs a One’s Complement of register Rd.

Oder ganz einfach, alle Bits werden invertiert, genau was DU brauchst.
Geht sogar mit allen Arbeitsregistern ( General Purpose Register 0-31 )

ldi r1, 0b01011010
com r1

Bernd_Stein
Gast #2479770
Lesenswert?

Super danke.
Ja da habe ich schön öfters gelesen, nur machmal sitz man auf dem 
Schlauch.
Jetzt hae ich noch was.
Bin gerade dabei den GLCD Treiber von Bascom in asm umzuwandeln.
Momentan fast 4mal schneler. :-)

Das war z. eine Schleife.

 If G_erase = 1 Then
   Gl_rstflag = 1
 Else
   Gl_rstflag = 0
 End If

das in ams

 LDS R25, {G_erase}
 ANDI  R25, 1           'alles ausser 1 wegmaskieren
 STS {Gl_rstflag} , R25

-----------------------
Jetzt brauche ich das.
Wie mache ich das am kürzesten:

If G_erase = 1 Then
  Gl_rstflag = 0
Else
  Gl_rstflag = 1
End If

wäre das dann so?

 LDS R25, {G_erase}
 ANDI  R25, 0           'alles ausser 0 wegmaskieren
 STS {Gl_rstflag} , R25

Danke.
Gast #2479837
Lesenswert?

Hi,

geht ja alles schon.
Nur bin ich gerade dran das Display zu Invertieren.
Das ist für das
SED1335 und SED13700 in 320*240

Ja man kann in Bascom einfach mitten im Programm mit Assembler 
weiterprogrammieren.

z.B.:
 'DISP ON
 Gl_cmd = Lcd_disp_on
 Gosub Send_cmd
 Gl_byte = Lcd_on
 Gosub Send_dat

   '--- Mod 8  'Calculate which bit to set  ----
   $asm
   lds R24, {Gl_x}
   Mod8:
    subi r24, 80
    brcs rest8
    subi r24, 80
    brpl sub8
   Rest8:
    subi r24, -80
   Sub8:
    subi r24, 8
    brpl sub8
    subi r24, -8
   Mod8_exit:
   LDI R25, 7
   !sub r25, r24

   sts {Gl_bit} , R25
   $end Asm
   '--------------------------------


    If Gl_rstflag = 0 Then
      Set Gl_read.gl_bit
    Else
      Reset Gl_read.gl_bit
    End If
    Gl_pix = Gl_read
Moderator (Firma: Titel) Persönliche Seite #2479852
Lesenswert?

Holger Gebauer schrieb:
> Da war z. eine Schleife.
>  If G_erase = 1 Then
>    Gl_rstflag = 1
>  Else
>    Gl_rstflag = 0
>  End If
www.if-schleife.de

Holger Gebauer schrieb:
> If G_erase = 1 Then
>    Gl_rstflag = 1
>  Else
>    Gl_rstflag = 0
>  End If
>
> das in ams
>
>  LDS R25, {G_erase}
>  ANDI  R25, 1           'alles ausser 1 wegmaskieren
>  STS {Gl_rstflag} , R25
Was für ein Variablentyp ist G_erase?
Was ist Gl_rstflag?
Woher kommen die Werte und was wird mit dem Ergebnis gemacht?
Ohne diese Information würde ich diese 5 Bascom-Zeilen so abkürzen:
1
  Gl_rstflag = G_erase
Und damit:
1
  LDS R25, {G_erase}
2
  STS {Gl_rstflag},R25
Oder, was ohne weitere Information auch geht:
1
  mov Gl_rstflag,G_erase
Oder gar:
1
  .def  Gl_rstflag = r16
2
  .def  G_erase    = r16

Kurz: oft ist es einfacher, die Funktion zu verstehen und 
nachzuprogrammieren, als selber Compiler spielen zu wollen,
und Zeile für Zeile nachzuprogrammieren...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren