atarionline.pl MADS - etykiety tymczasowe i skok w przód. - Forum Atarum

    Jeśli chcesz wziąć udział w dyskusjach na forum - zaloguj się. Jeżeli nie masz loginu - poproś o członkostwo.

    • :
    • :

    Vanilla 1.1.4 jest produktem Lussumo. Więcej informacji: Dokumentacja, Forum.

      • 1:
         
        CommentAuthorwilly
      • CommentTime16 May 2013 21:05 zmieniony
       
      Mam taki sobie kod:

      org $600
      opt l+ h-

      Label1 ldx <Label1
      ?L1 dex
      bmi ?L2 ;Ta instrukcja jest kompilowana jako skok do 2 etykiety (RTS)
      jmp ?L1
      ?L2 nop

      Label2 ldx <Label2
      ?L1 dex
      bmi ?L2 ;Ta jest kompilowana jako skok do 1 etykiety (NOP)
      jmp ?L1
      ?L2 rts rts

      mads 1.9.6 build 89 (3 Apr 13)
      2 opt l+ h-
      3
      4 0600 A2 00 Label1 ldx <Label1
      5 0602 CA ?L1 dex
      6 0603 30 0C bmi ?L2 ;Ta instrukcja jest kompilowana jako skok do 2 etykiety (RTS)
      7 0605 4C 02 06 jmp ?L1
      8 0608 EA ?L2 nop
      9
      10 0609 A2 09 Label2 ldx <Label2
      11 060B CA ?L1 dex
      12 060C 30 FA bmi ?L2 ;Ta jest kompilowana jako skok do 1 etykiety (NOP)
      13 060E 4C 0B 06 jmp ?L1
      14 0611 60 ?L2 rts
      15


      I albo ja nie zrozumiałem zasady działania etykiet tymczasowych, albo to się źle kompiluje.
      Nijak nie jestem w stanie sobie wytłumaczyć dlaczego ten kod tak się kompiluje.
      • 2: CommentAuthorVidol
      • CommentTime18 May 2013 07:05 zmieniony
       
      za intrukcja:
      Dla etykiet anonimowych został zarezerwowany znak '@', po takim znaku musi wystąpić znak określający skok w przód '+' lub w tył '-'.
      czyli jak dobrze zrozumialem to Twoj przyklad powinien wygladac tak:
      org $600
      opt l+ h-

      Label1 ldx <Label1
      @ dex
      bmi @+
      jmp @-
      @ nop

      Label2 ldx <Label2
      @ dex
      bmi @+
      jmp @-
      @ rts
      • 3:
         
        CommentAuthorwilly
      • CommentTime18 May 2013 10:05
       
      Dokładnie tak jak napisałeś.
      I z takim zapisem działa wszystko jak należy. Jednak czasami wolałbym mieć zapis nieco więcej mówiący niż stado małp ... jednym słowem dżungla :D
      • 4: CommentAuthor0xF
      • CommentTime18 May 2013 10:05
       
      opt ?+
      • 5:
         
        CommentAuthorwilly
      • CommentTime18 May 2013 17:05
       
      Teraz działa tak jak bym się tego spodziewał. Dziękuję.

      I chyba doszedłem dlaczego tak to się kompiluje jak podałem.
      Pierwszy skok do etykiety, wykonuje się do ostatnio zapamiętanego miejsca - z poprzedniego przebiegu kompilacji. Drugi skok, wykonuje się też do ostatnio zapamiętanego miejsca, tyle że z aktualnego przebiegu - bo w tym przebiegu etykieta już wystąpiła.
      • 6: CommentAuthortebe
      • CommentTime18 May 2013 19:05
       
      etykiety tymczasowe zaczynające się od znaku ? albo definiowane przez pseudorozkaz SET nigdy nie służyły do skoków warunkowych, obliczenia w pętlach czy makrach to ich przeznaczenie

      ?tmp=15

      .rept 8
      ...
      ...
      ?tmp++
      .endr


      etykiety anonimowe @[-+0..9] pojawiły się w ostatniej wersji mads-a, zostały podpatrzone w innych assemblerach, służą do skoków warunkowych


      Fox wskazał Ci najwłaściwszą odpowiedź, etykiety lokalne w stylu assemblera MAE

      ->link<-

      MADS traktuje etykiety ze znakiem ? domyślnie jako tymczasowe, a po użyciu przełącznika OPT ?+ jako lokalne MAE (MAE jest natywnym assemblerem dla XL/XE, wspiera 65816, używa go chętnie Drac030)
      • 7:
         
        CommentAuthorwilly
      • CommentTime18 May 2013 20:05 zmieniony
       
      To wiele tłumaczy. Dziękuję.

      Ostatni assembler z którym miałem do czynienia (Na Atari oczywiście) to był QA ... a od tego czasu wieeele się zmieniło.

      A Mads bardzo mi podpasował głównie ze względu na elastyczność. Makr i reszty cudów na kiju dopiero powoli się uczę.