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