Forum: Mikrocontroller und Digitale Elektronik Assembler Befehl


von Janine (Gast)


Lesenswert?

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

von Cyblord -. (cyblord)


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.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Die beiden Befehle gibt es beim MSP430. Auch die Operandensyntax scheint
es zu geben. Ich habe aber sonst keine Ahnung von diesen Controllern,
deswegen lege ich mich nicht auf ein eindeutiges Ja oder Nein fest.

von Janine (Gast)


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

von Carl D. (jcw2)


Lesenswert?

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

von Maxx (Gast)


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.

von Janine (Gast)


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

von Karl H. (kbuchegg)


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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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?

von Janine (Gast)


Lesenswert?

Hallo
Vielen Dank Lothar Miller, Karl Heinz und die anderen auch.
es klingt total Logisch.
ihr seid Schätze
Gruß
Jani

von Carl D. (jcw2)


Lesenswert?

[sidekick]
Wie war das noch mal: jeder Assemblerbefehl sagt klar aus, was er macht, 
oder?  ;-))
[/sidekick]

von ?!? (Gast)


Lesenswert?

Carl D. schrieb:
> [sidekick]
> Wie war das noch mal: jeder Assemblerbefehl sagt klar aus, was er macht,
> oder?  ;-))
> [/sidekick]

Stimmt doch auch. Hat jemand was anderes behauptet? Ich sehe hier keine 
gegensätzliche Aussage!

von Guido Körber (Gast)


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.

von Karl H. (kbuchegg)


Lesenswert?

Guido Körber schrieb:

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

Lass das mal bloss nicht Moby hören. Der kennt sich dann überhaupt nicht 
mehr aus, welche der beiden Varianten denn dann die 'optimale' ist.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Karl H. schrieb:
> Lass das mal bloss nicht Moby hören. Der kennt sich dann überhaupt nicht
> mehr aus, welche der beiden Varianten denn dann die 'optimale' ist.

Kein Problem: Die optimale Variante ist seine :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.