Názor k článku Specifika instrukční sady mikroprocesorů Intel 8086/8088 od Wladows - Zdravím kolegu z VUT! Předně musím pochválit za velmi...

  • 12. 9. 2024 4:12

    Wladows

    Zdravím kolegu z VUT!

    Předně musím pochválit za velmi pěkně napsaný úvod do x86 assembleru. Vyrostl jsem na něm od roku 1989, ale některé v článku zmíněné širší spojitosti jsem neznal.

    V článku se vyskytuje několik nepřesností:

    * Kapitola 7. na konci:
    - Poznámka: povolení a zákaz přerušení se provádí instrukcemi STI (Enable Interrupt) a CLI (Disable Interrupt).

    (Instrukce EI a DI měly procesory i8080 a Z-80)

    * Kapitola 14. Použití instrukcí DEC a JZN pro implementaci počítané programové smyčky
    - Překlep: instrukce se jmenuje JNZ

    * Systémové volání na ukončení procesu má DVA parametry:
    AH=0x4C (Terminate process with return code)
    AL=návratový kód (return code, ErrorLevel v .BAT skriptech), měl by být 0 při úspěšném dokončení programu

    Tedy všechny tyto kusy kódu:
    ; ukonceni procesu a navrat do DOSu
    mov ah, 0x4c
    int 0x21

    by měly vypadat takto:
    ; ukonceni procesu a navrat do DOSu s navratovym kodem 0
    mov ax, 0x4c00
    int 0x21

    nebo
    mov ah, 0x4c
    mov al, 0 ; pripadne xor al, al
    int 0x21

    Alternativně lze v .COM programech použít již dávno nedoporučovanou (ale funkční) instrukci int 0x20, která ukončí program a neočekává na vstupu žádný návratový kód. Totéž dělá i mov ah, 0 a int 0x21.

    Frajer ovšem prostě zavolá ret, protože na vrcholu zásobníku je uložena 0, ret skočí na offset 0, kde se na začátku Program Segment Prefixu nachází instrukce int 0x20 (Exit program). :)

    Toto funguje jen pokud je CS segment registr je identický s PSP segmentem, tj. v .COM programech startujících od adresy 0x100. MS-DOS má kořeny v systému CP/M a je to všude znát.

    (Vidím, že můj manuál k OPL3 FM čipu si vesele žije dál svým životem). :)

    12. 9. 2024, 04:15 editováno autorem komentáře