Assembler Befehl

Janine schrieb:
> Hallo,
>
> könnte mir jemand bitte sagen ob diese Expression richtig oder falsch
> ist
>
>
> bis.b     #X,&YY
> jz  Label
>
>
> es geht hier um bis und jz
>
> Gruß
> jani

Das ist eine typische "Schrödinger-Expression". Sie ist sowohl richtig 
als auch falsch, beides zur gleichen Zeit, solange bis du verrätst um 
welchen Assembler bzw. welche Zielhardware es geht.
Gast
Hallo

Vielen Dank für Ihre schnelle Antwort.

ich habe den befehl in Assembler code von MSP430 gefunden. und gehe ich 
davon aus, derjeniger, der ihn geschrieben hat, woltte sowas schreiben
"bit.b     #X,&YY" anstatt "bis.b     #X,&YY"


Gruß
Jani
MSP430 kenn ich zwar nicht persönlich, sondern weiß nur, daß die "PDP11 
inspiriert" sind, aber ein kurzer Blick ins Internet verrät:

Bit.b   Bit Test eines Byte-Werts,
        AND der beiden Operanden, Status setzen, Ergebnis verwerfen
        (Op1 & Op2)

Bis.b.  Bit setzen eines ByteWerts,
        Op1 |= Op2
Gast
Warum meinst du das? Geht das aus den vorhergehenden Operationen hervor?

bis (bit set) ist ein gültiger und sinnvoller Opcode.
In anderen Systemen auch OR genannt

PS: das Z in JZ muss sich auf eine vorhergehende Operation beziehen, da 
bis die Status Flags nicht berührt.
Gast
Hallo.
ich meine nicht das bis.b falsch ist aber die Konstellation ist sinnlos.
warum soll ich jz aufrufen und eine Sprung durchführen wenn ich keinen 
Test mit bit.b gemacht habe.
bis.b ist in den fall unabhängig von die Status Bit „ Z“ im Register
Gruß
Jani
Janine schrieb:
> Hallo.
> ich meine nicht das bis.b falsch ist aber die Konstellation ist sinnlos.
> warum soll ich jz aufrufen und eine Sprung durchführen wenn ich keinen
> Test mit bit.b gemacht habe.
> bis.b ist in den fall unabhängig von die Status Bit „ Z“ im Register

Ich geb dir grundsätzlich recht.
Jedoch kommt es auch vor, dass ein Status Bit "verschleppt" wird. D.h. 
der Befehl, auf dessen Ergebnis der JZ aus ist, befindet sich nicht 
unmittelbar davor sondern ein paar Zeilen davor. Wenn alle dazwischen 
liegenden Befehle dieses Status Bit in Ruhe lassen, dann reagiert der JZ 
auf ein Ergebnis das ein paar Befehle zuvor eingetreten ist.
1
   Befehl 1                 ; setzt oder löscht das Zero Bit
2

3
   Befehl 2                 ; lässt Zero Bit in Ruhe
4

5
   Befehl 3                 ; lässt Zero Bit in Ruhe
6

7
   BIS.B   ...              ; lässt Zero Bit in Ruhe
8

9
   JZ ...                   ; reagiert auf den Ausgang von Befehl 1 !!!

d.h. es reicht nicht, einfach nur 2 aufeinanderfolgende Befehle zu 
betrachten. Die Verwicklungen können komplexer sein. In letzter 
Konsequenz bleibt einem nichts anderes übrig als die implementierte 
Logik mit der vorgesehenen Logik (oder dem was man dafür hält) zu 
vergleichen und zu entscheiden, inwieweit das übereinstimmt bzw. ob da 
eventuell tatsächlich ein Fehler vorliegt. Es kann durchaus vom 
Programmierer gewollt sein, dass er den JZ vom Befehl 1 abhänigig macht. 
Es kann aber auch tatsächlich ein Fehler sein und der BIS müsste ein BIT 
sein. Die zu implementierende Logik im Vergleich mit der implementierten 
Logik kann diese Fragestellung beantworten.

Mit formalen Kriterien, wie zb vor einem Conditional Jump muss immer ein 
Vergleich stehen, kommst du da nicht weiter. Dem Prozessor ist es ja 
wurscht welcher Befehl an welcher Stelle das Zero Bit gesetzt oder nicht 
gesetzt hat. Beim JZ wird einfach nur gefragt, ob es gesetzt ist. Wer 
das gemacht hat, interessiert nicht mehr.
Moderator (Firma: Titel) Persönliche Seite
Janine schrieb:
> warum soll ich jz aufrufen und eine Sprung durchführen
Weil sich (wie erwähnt) das jz evtl. auf einen vorhergehenden 
Vergleich oder eine Rechenoperation bezieht. Das kann jetzt so keiner 
wissen.

Kann ja sein, dass derjenige vor dem Sprung hier nur ein Debug-Flag für 
den Logicanalyzer setzt.

So wie sie dastehen, sind die beiden Assemblerzeilen nicht voneinander 
abhängig.

EDIT: Hoppla, war ich soooooo langsam?
Gast
Also nur die zwei Befehle lassen jetzt nicht erkennen was da wirklich 
passiert.

Grundsätzlich solche Konstellationen benutze ich häufig beim 
Programmieren um einen Entscheidungspfad im Programm zu sparen wenn ein 
Zustand abgefragt wird und darauf hin ein Bit auf 0 oder 1 gesetzt wird.

Also in "Pseudo-Assembler":

    cmp n,x            ; Vergleich durchführen
    bitset xxx,k       ; davon ausgehen, dass das Ergebnis 1 sein könnte
    jnz  next          ; es ist 1, also springen
    bitreset xxx,k     ; es ist 0, also wieder zurück setzen
next:

Gegenüber der lehrbuchmäßigen "sauberen" Variante:

    cmp n,x            ; Vergleich durchführen
    jz  setzero        ; springen wenn null
    bitset xxx,k       ; setzen
    jmp done           ; dieser Sprung wird mit der anderen Variante 
gespart

setzero:
    bitreset xxx,k

done:


Damit spart man Speicherplatz für eine Sprunginstruktion, braucht aber 
ggf. einen Tick mehr Ausführungszeit.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.