Odpovídáte na názor k článku Specifika instrukční sady mikroprocesorů Intel 8086/8088. Názory mohou přidávat pouze registrovaní uživatelé. Nově přidané názory se na webu objeví až po schválení redakcí.
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