2016-10-14 5 views
2

Я написал код сборки, который включает в себя:Монтаж: счетчик цикла

XOR BL,BL 
    MOV CX,0 
TOP: 
    INC BL,1 
    MOV AH,2 
    MOV DL, BL 
    INT 21H 
    LOOP TOP 

Цикл выполняется действительно большое число раз (более чем 10000 наверняка). Какая может быть возможная причина выполнения цикла такого высокого времени? Я очень новичок в ассемблере и не нашел ничего эффективного для моего кода, связанного с CX = 0. Заранее спасибо.

+0

Одиночный шаг в вашем коде в отладчике, наблюдая за регистрами, поймал бы это. Вы увидите CX = 0xFFFF после первой итерации, которая предложит вам просмотреть его в руководстве и узнать, что он не проверяет до декремента. –

ответ

3

Ваш счетчик cx не был правильно инициализирован. Инструкция loop делает две вещи:

dec cx   ;◄■■■ DECREASE THE COUNTER. 
jnz label   ;◄■■■ IF COUNTER IS NOT ZERO, JUMP TO LABEL TO REPEAT. 

В коде счетчика cx был инициализирован равным нулю, так что, когда loop инструкция выполняется, она делает cx - 1, который 0 - 1, поэтому cx становится 0ffffh и ваш цикл будет повторяться 0ffffh раз.

Переместить другое значение на ваш счетчик cx, например, mov cx, 10, поэтому ваша петля повторится 10 раз.

+0

Спасибо Joes за подробное объяснение –

1

Инструкция Intel loop сначала уменьшает регистр CX, а затем проверяет нулевое состояние.

Установить CX до 1 до TOP: для проверки.