Assembler Befehl

#4258712
Lesenswert?

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 #4258819
Lesenswert?

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
Gast #4258859
Lesenswert?

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 #4258890
Lesenswert?

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
#4258909
Lesenswert?

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 #4258915
Lesenswert?

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 #4259108
Lesenswert?

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

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