Ассемблер Intel x86 Loop n раз с пользовательским вводом - PullRequest
0 голосов
/ 03 июня 2019

Я изучаю сборку x86 и пытаюсь написать программу, которая читает число n (2 цифры) из пользовательского ввода и повторяет n раз.

Я пробовал много способов, но получаюошибка бесконечного цикла или сегмента.

input:

    push    msgInputQty
    call    printf
    add     esp, 4

    push    quantity    
    call    gets    
    add esp, 4

    mov     ecx, 2
    mov     eax, 0
    mov     ebx, 0
    mov     edi, 0
    mov     dl, 10

transform:
    mul     dl

    mov     ebx, 0
    mov     bl, byte[quantity+edi]
    sub     bl, 30h

    add     eax, ebx

    inc     edi

    loop    transform

    mov ecx, eax

printNTimes:

    push    msgDig
    call    printf
    add     esp, 4
        loop printNTimes

Я хотел бы сохранить в ecx и повторить n раз это число

1 Ответ

0 голосов
/ 03 июня 2019

Ваш ecx регистр сдувается вызовом printf.

ecx является изменчивым регистром в некоторых соглашениях о вызовах, и вполне вероятно, что ваш loop поврежден тем, чтоprintf уходит туда.

Для начала я бы следовал совету Рэймонда в комментарии, приложенном к вашему первоначальному вопросу, и прикрепил бы отладчик, чтобы засвидетельствовать это поведение самостоятельно.

Что касаетсяВ качестве решения вы можете попытаться сохранить ecx и восстановить его после вызова, чтобы увидеть разницу:

; for example
mov edi,ecx
call printf
mov ecx,edi

Здесь может быть больше проблем (трудно знать наверняка, так как ваш код неполон ...но такие вещи, как распределение стеков, которые по какой-то причине не кажутся интересными), но это хорошее начало.

Питер оставил комментарий под моим ответом, чтобы указать, что вы можете удалитьпроблема и оптимизирует мое решение, просто не используя ecx для вашего цикла вообще, а вместо этого сделайте это вручную, внеся изменения в код:

   mov edi, eax

printNTimes:

    push msgDig
    call printf
    add esp, 4
    dec edi
    jnz printNTimes
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...