- LiTime Speicher und Akkus         
Ergebnis 1 bis 8 von 8

Thema: if in Assembler???

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    08.08.2005
    Ort
    RP, Westerwald
    Beiträge
    50

    if in Assembler???

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo, ich hab da mal ne Frage…
    Ich hab folgenden Code in einem Assembler Listing im Internet gefunden.
    if ADC_Wert << 39
    BSF PORTB, 0
    else
    BCF PORTB, 0
    endif
    Hab das mal ausprobieren wollen, da ich das bis jetzt so noch nie gesehen hab.
    MPASM meckert auch nicht und Wandelt das in eine Hex um aber es tut sich nichts.
    Kann jemand was damit anfangen?
    Ich verstehe das so:
    Wenn der Wert von Reg. "ADC_Wert" kleiner als 39 dann PB,0 setzen ansonsten löschen.
    ODER?
    Geht das überhaupt in einem Assembler Code? Wie gesagt, MPASM lässt es mit sich machen.
    Danke für Eure Antworten im Voraus!
    Gruß

  2. #2
    << ist ne Bitverschiebung: 39 in Binär ist 00100111 und wird zu 01001110 (oder?)
    kann dir auch nicht gerade sagen, was das soll...
    für "kleiner als" müsstest du < verwenden

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    17.08.2004
    Beiträge
    1.065
    das if / endif bezieht sich auch nicht auf eine if-fallunterscheidung sondern ist ein conditional assembly, dh wenn die bedingung erfüllt ist wird der code erst assembliert und ins hex file eingebunden. zumindest wenns eine assembler direktive ist. so kann man einen modularen code machen um zb software für verschieden hardwareversionen zu schreiben. welche sprache und compiler wurd denn ursprünglich für diesen code genommen?

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.10.2004
    Ort
    Nordschwarzwald
    Alter
    41
    Beiträge
    506
    Wenn du ein if in Assembler umsetzen willst, musst du das mit bedingten Sprüngen machen. Du musst erst die Bedingung prüfen (und das Ergebnis in ein Bit schreiben) und dann abhängig vom Ergebnis einen Befehl überspringen (BTFSC/BTFSS).

    MfG
    Stefan

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    08.08.2005
    Ort
    RP, Westerwald
    Beiträge
    50
    Danke erstmal für die Antworten!
    @ stegr
    Also wie man das normalerweise in Assembler macht, ist mir klar.
    BTFSC F,x
    goto X

    Oder eine Subtraktion durchführen und des Z Bit testen.
    Ich wollte eigentlich nur wissen was es mit dem if auf sich hat.

    @ the_Ghost666
    Ich denke als Compiler wurde MPASM genommen.Der Rest war auch in Assembler geschrieben. Ich hab das mal aus dem Internet geladen um es mir in Ruhe anzuschauen aber woher kann ich dir jetzt auch nicht mehr sagen.
    Meinst also das diese stelle nur dann vom Compiler beachtet wird wenn bestimmte Bedingungen vorher erfüllt wurden. Ist also kein Assembler Code sondern, spricht den Compiler direkt an?! oder so?
    hmmmm…

    Gruß David

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    17.08.2004
    Beiträge
    1.065
    schau mal in die dokumentation von MPASM, dort müsste dazu was stehen, ebenso wenn du ein .inc file auf machst.
    IFNDEF __16F648A
    MESSG "Processor-header file mismatch. Verify selected processor."
    ENDIF
    wo ich mir jetzt nicht sicher bin, ist, dass es ein ifndef ist, das n ist nur eine verneinung, ein "nicht", aber in deinem code steht ja nur ein if, kein ifdef. beendet wirds dennoch mit nem endif, sehr seltsam. ich habe ein Buch wo das drin steht, aber das ist leider nicht griffbereit

    achja, und das <<39 bringt auch keinen sinn, wenn es ein schiebeoperator ist, dann würde das bedeuten, dass der wert um 39 stellen geschoben wird, was ja völlig nutzlos ist, im assembler sprichst du nur eine speicherzelle an, dh verschiebungen von 0 bis 7 sind sinnvoll.
    und wenn es doch ein größer/kleiner ist, dann bringts auch keinen sinn, denn der assembler kennt diese syntax nicht. dh es müsste zu dem conditional assembly befehl gehören, aber dieser wiederum hat wenig sinn, da er sich auf einen wert bezieht der wahrscheinlich erst zur laufzeit generiert wird, also wäre ADC_Wert beim compilieren wohl eh 0, wenn man es nicht vorher setzt. sehr sehr seltsam

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    08.08.2005
    Ort
    RP, Westerwald
    Beiträge
    50
    Logo, hast recht, da könnte was darüber stehen . Werde mir die Docu mal runterladen und anschauen. Danke!

    gruß David

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    08.08.2005
    Ort
    RP, Westerwald
    Beiträge
    50
    – BEGIN CONDITIONALLY ASSEMBLED CODE BLOCK
    Begin execution of a conditional assembly block. If expr evaluates to true, the code
    immediately following the if will assemble. Otherwise, subsequent code is skipped
    until an else directive or an endif directive is encountered.

    Hast also (weiter oben) recht gehabt. Die stelle nach den if wird nur dann übersetzt wenn eine bestimmt Bedingung vorher erfüllt wurde, Andernfalls else…
    Dann ist es aber so, dass sich der Code obern irgendwie nicht reimt…
    Ich stelle immer wieder fest, dass es im Internet auch VIEL Müll gibt .
    Danke für die Antworten noch mal (Besonders an the_Ghost666)!!!

    Gruß David

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiTime Speicher und Akkus