Краткий ответ: я думаю, что эти 2 строки:
MOV CX, [EAX] ;x
MOV DX, [EBX] ;y
должны быть:
MOV CX, AX ;x
MOV DX, BX ;y
(без квадратных скобок, используйте младшие 16 бит).
Более длинный ответ: я не думаю, что код висит там, где вы думаете.Я ожидаю, что он зависнет из-за этих двух строк:
MOV CX, [EAX] ;x
MOV DX, [EBX] ;y
Ваши комментарии кода указывают, что вы понимаете C, поэтому я объясню в этих терминах.Инструкции:
MOV EAX, 0x00
MOV CX, [EAX]
эквивалентны:
unsigned int EAX = 0;
unsigned short CX;
CX = (unsigned short)(*EAX);
У меня может быть неправильное наложение.Дело в том, что при заключении скобок в EAX («[EAX]») содержимое EAX используется в качестве указателя.Я ожидаю, что ваш код разыменует указатель NULL, который может вызывать зависание.
EDIT, в соответствии с вашим обновлением
Вы пытаетесь записать пиксель наэкран с использованием этого прерывания:
MOV AH, 0x09 ;func number - WritePixelOnScreen [wiki]
MOV AL, 0x05 ;color - Magenta
MOV BH, 0x00 ;Page no
INT 0x10 ;Video interrupt - BIOS
Я не вижу там никаких параметров координат.Я просмотрел функции int 10h и обнаружил, что AH = 09h - это «запись символа и атрибута в позиции курсора» - не то, что вы хотите.Посмотрите на AH = 0Ch - «изменить цвет для одного пикселя» .Эта ссылка имеет короткий пример, демонстрирующий правильное использование.