Борьба с языком ассемблера - PullRequest
1 голос
/ 22 сентября 2011

Мне трудно понять концепции ассемблера. Мне дают этот пример кода:

ploop:  mov  ax, 0201h
        add  al, ah
        cmp  al, 5
        jb   ploop
eloop:

Шестнадцатеричное значение в конце цикла равно 0205, но я не уверен, что понимаю почему.

Для первой строки мы перемещаем 0201 в топор, поэтому al = 01 и ah = 02. Затем вы добавляете ah к al, делая al = 03. Сравниваем al с 5 и, так как 3 <5, это соответствует jb и снова проходит через шлюп. Мы проходим все этапы и в cmp al = 05 == 5, так что он больше не подходит jb. </p>

Это правильный взгляд на это?

Ответы [ 2 ]

3 голосов
/ 22 сентября 2011

Почти правильно.За исключением того, что вы, вероятно, хотите, чтобы он выглядел следующим образом:

        mov  ax, 0201h
ploop:  add  al, ah
        cmp  al, 5
        jb   ploop
eloop:

Поскольку в противном случае он войдет в бесконечный цикл, поскольку al и ah перезаписываются в каждой итерации цикла.

2 голосов
/ 22 сентября 2011

Я бы поспорил, что вы расшифровали код неправильно.В его нынешнем виде у вас есть бесконечный цикл.Это должно быть примерно так:

        mov  ax, 0201h
ploop:  add  al, ah
        cmp  al, 5
        jb   ploop
eloop:

Когда вы отправили сообщение, ax перезагружается с 0201h в начале каждой итерации цикла.Затем вы добавляете 02 в ah к 01 в al.Это даст 3. Вы сравниваете это с 5, и если оно меньше (очевидно, что так будет всегда), вы снова запускаете цикл.

С перемещенной меткой мы начинаем с 02в ah и 01 в al.Однако на каждой итерации цикла мы добавляем 02 к текущему содержимому al, поэтому он будет следовать последовательности 1, 3, 5. На каждой итерации мы сравниваем его содержимое с 5 и продолжаем цикл, если и толькоесли он меньше чем (рассматривается как беззнаковый), то цикл с выполнением трех итераций, затем остановитесь с al = 5.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...