Vlákno 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...

  • Článek je starý, nové názory již nelze přidávat.
  • 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

  • 12. 9. 2024 9:13

    Pavel Tišnovský
    Zlatý podporovatel

    Zdravím!

    Díky za upozornění, hnedle opravím ty DI/EI, nějak to mám v hlavě už pomotané :-)

    Hele OPL3 - zrovna tady s mladým stavíme nad OPL3 syntetizér (s RP2040
    ), tak se na to po letech dívám znovu. A nic lepšího, než ten tvůj manuál asi není, všichni si to jen linkují, ale pořád je to origoš.

  • 12. 9. 2024 9:17

    Pavel Tišnovský
    Zlatý podporovatel

    Tak kromě toho exitu opraveno. My jsme si už ten trik s "ret" probírali někdy u prvního článku, asi se k tomu i vrátím, než natahovat COM soubory kvůli exitu, nejsme na Linuxu :-)

  • 13. 9. 2024 18:59

    atarist

    "MS-DOS má kořeny v systému CP/M " no to je kulantne receno :) Hodne tech syscallu je snad uplne identickych, kdyz se namisto AX doplni A

  • 14. 9. 2024 17:05

    Pavel Tišnovský
    Zlatý podporovatel

    Tisk řetězce v CP/M (8080/Z80):
    - řetězec musí být ukončen dolarem
    - C=9
    - DE=adresa stringu

    Tisk řetězce v DOSu (8086):
    - řetězec musí být ukončen dolarem
    - AH=9
    - DX=adresa stringu

    Čistá náhoda, no ne?