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 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 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
     
    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
     
    opt ?+
    • 5:
       
      CommentAuthorwilly
    • CommentTime18 May 2013
     
    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
     
    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 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ę.