Проблема в том, что вы используете JMP
вместо CALL
.
Когда вы используете JMP
(или любое из его условных отклонений), вы инструктируете ЦПУ заменить текущий указатель инструкциис непосредственным или вычисленным значением, закодированным с операндом.Не предусмотрено отслеживание того, где вы были.
Когда вы используете операцию CALL
, адрес следующего кода операции помещается в стек, SP
уменьшается на соответствующую ширину стека,и немедленное / вычисленное значение в вызове помещается в указатель инструкции.Это позволяет использовать инструкцию RET
для возврата к предыдущему месту выполнения.
Пример кода, который использует CALL
, входит в графический режим, строит пиксель, ждет клавишу, возвращается в текстовый режим итогда выход обратно в DOS может выглядеть так:
org 100h
main:
CALL initgraph
MOV CX, 320
CALL drawpixel
CALL waitforkey
CALL returntext
MOV AX, 4C00h ; Exit to DOS returning exit code 00h
INT 21h
waitforkey:
MOV AH, 0 ; Int 16h/AH=0 get key BIOS call
INT 16h
RET
initgraph:
MOV AX, 13h
INT 10h
MOV CX, 0
RET
returntext:
MOV AX, 0x03
INT 0x10
RET
drawpixel:
MOV AX, 0A000h
MOV ES, AX
MOV AX, CX
MOV DI, AX
MOV DL, 0xE
MOV [ES:DI], DL
RET