Код счетчика сборки не будет работать или зацикливаться вечно - PullRequest
0 голосов
/ 12 октября 2018

Итак, моя цель - заставить цикл пройти x прогонов и печатать msgTrue до тех пор, пока счетчик не станет равным нулю.Теоретически это должно работать.Я, возможно, просто испортил регистры.

comparesCounter:

    cmp ah, 0     ;ah stores the amount of repetitions I want the code to go through
    jne notNull   ;jump if not true  
    jmp exit

notNull:      
    dec ah             ;ah -- 
    mov eax, 4         ;|
    mov ebx, 1         ;|
    mov ecx, msgTrue   ;|>this code prints out what's stored in msgTrue
    mov edx, len1      ;|
    int 80h            ;|

    jmp comparesCounter ;jumps up into counter

Должен ли я использовать другие регистры, возможно, или это просто концепция моего кода на уровне глупости вне всякой помощи?

1 Ответ

0 голосов
/ 12 октября 2018

Проблема в том, что изменение eax также изменяет ah.Вот простая диаграмма, показывающая соотношение между ah и eax:

           eax
--------------------------
|           |     ax      |
|           | ----------- |
|           | | ah | al | |
|           | ----------- |
---------------------------
  3      2      1     0

Как видите, ah является самой значимой половиной ax, что, в свою очередь, является наименее значимымполовина eax.Поэтому, когда вы устанавливаете eax = 4, вы неявно устанавливаете ah = 0.

Если вы хотите продолжать использовать ah для своего счетчика циклов, вы можете временно поместить его в стек:

push eax    ; Save eax's current value on the stack
mov eax, 4
...         
int 80h            
pop eax     ; Restore eax from the stack
...