2015-12-04 8 views
-1

Я начал изучать сборку в этом году в своей школе, и мы только начали изучать пиксели.Проблемы с функцией задержки BIOS (INT 15h/AH = 86h)

Наш учитель дал нам некоторый код и сказал нам, чтобы он общался с ним, он также сказал нам попробовать и реализовать задержку в коде (ah = 86h | int 15h), но когда я попытался использовать его, цвета некоторых пикселей были изменены, и я не понимаю, почему

код: (просто кусок кода, есть еще некоторые там также получить разрушил после задержки)

mov cx, 20 

add [y], 2 
mov dx, [y] 

paint1RowOf10: 

mov bh, 0h 
mov bx, cx 

add [x], 1 
mov cx, [x] 

add [y], 4 
mov dx, [y] 

mov ax, [red] 
mov ah,0ch 
int 10h 

    ; here is a delay part, it waits for 1 seconde 
    ; from the help of assembly: 
    ; INT 15h/AH = 86h - BIOS wait function. 
    ;CX:DX = interval in microseconds (these are notes from my teacher) 

mov ah, 86h 
mov cx, 1 
mov dx, 2 
int 15h 

mov cx, bx 
loop paint1RowOf10  

Это результат http://prntscr.com/9a8lpw Можете ли вы сказать мне, почему это происходит? потому что, насколько я вижу, пиксели должны идти в одной строке и не менять цвета.

+1

Это выглядит как проблема 'mov bh, 0h;', за которой следует 'mov bx, cx'. , Сначала вы перемещаете 0 в _BH_ для 'int 10h/ah = 0ch call' (BH = номер страницы). Это нормально, тогда сразу после этого вы перезаписываете ВСЕ _BX_ (включая _BH_ и _BL_), выполняя команду 'mov bx, cx'. _BL_ и _BH_ являются частями регистра _BX_. Перемещение чего-то в _BX_ приведет к сбою _BH/BL_. Либо нажмите _CX_ в стеке (и поместите его позже), либо используйте регистр, отличный от _BX_, в качестве временного хранилища (в данном случае _SI_ или _DI_) выглядят безопасно с указанным кодом. –

+0

Я говорю _look safe_, но вы не показываете весь свой код, чтобы они не были в безопасности. Вы должны убедиться, что все, что вы используете, не используется (или будет сбито) в коде, который вы показываете (и части, которые вы не сделали). Было бы лучше просто изменить свой вопрос, чтобы показать весь ваш код, что сделало бы его хотя бы поддающимся проверке полным примером. –

+1

Если вы хотите увеличить свои шансы на получение решения, напишите весь свой код, а не только фрагмент. Хотя в показанном коде есть потенциальные проблемы, не видя остальной части вашей программы, людям будет труднее помогать. –

ответ

0

Попробуйте использовать отладчик, чтобы убедиться, что все регистры по-прежнему имеют ожидаемые значения после вызова системы/BIOS (что бы это ни было). Я не проверял документы, но может ли он клонировать другие регистры?

Или, может быть, ваша проблема:

mov ax, [red] 
mov ah,0ch 
int 10h 

Помните, что ah является высокая половина ax. Поэтому, если вы измените ah сразу после загрузки чего-либо в ax, это ВАШ код, который изменил ваше значение цвета.


Кроме того, код, как

add [y], 2 
mov dx, [y] 

ужасна. Попытайтесь сохранить переменные в регистрах, когда сможете. Если вам нужно пролить некоторые, постарайтесь не делать этого с переменными, которые меняются каждый раз через цикл.

mov dx, [y] 
add dx, 2 
mov [y], dx 

бы быть несколько лучше, потому что ое будет поступать из первой нагрузки, а не цепочка для чтения-записи изменения -> нагрузки. Это больше инструкций, поэтому сохранение важных переменных цикла в памяти является плохим.

+0

al для цвета и ах делает фактическое действие. это написано так, потому что красный - это dw, а не db, если бы это было так: это было бы: mov al, [red] || mov ah, 0ch || int 10h – Hadarsi320

+0

@ user5561744: почему вы делаете 16-битную нагрузку, если вы не хотите все 16b? 'mov al, [red]', если вы просто хотите установить 'al'. Если вам нужно убедить MASM, что вы знаете, что делаете, вам может понадобиться «mov al, byte ptr [red]'? ИДК. –

+0

@PeterCordes: Хотя это плохой стиль (я полностью согласен) он вытаскивает. Цвет - это просто байт (хотя он и определил его как слово). Часть, которая имеет значение, будет загружена в нижнюю половину регистра (_AL_). Затем он изменяет верхнюю половину вызова _INT_. Поэтому, хотя это неортодоксальный и плохой способ сделать это, я не думаю, что это его проблема в этом случае. Я согласен с определением цветов как байта, а затем с использованием 'byte ptr'. –

1

Существует странный факт, о INT 15h ах = 86h также необходимо установить AL = 0, если он не получит неустойчивое поведение

Задержка Код:

mov al, 0 mov ah, 86h mov cx, 1 mov dx, 2 int 15h

я обнаружил это с методом try-and-error, и я понимаю, когда al = 0 он работает.

 Смежные вопросы

  • Нет связанных вопросов^_^