2016-11-12 4 views
-1

Я думаю, что я должен изменить эту строку:Что следует изменить для выхода из цикла?

inc byte [nr] 

для выхода из цикла, и моя программа должна печатать 512.

%include "io.inc" 
section .data 
    nr: db 0x88, 0x1 
section .text 
    global CMAIN 
    CMAIN: 
    for: 
     inc byte [nr] 
    jnc for 
     inc byte [nr + 1] 
     PRINT_UDEC 2, nr 
     xor eax, eax 
    ret 
+2

Если вы посмотрите на набор инструкций ссылки на инструкции [INC] (http://www.felixcloutier.com/x86/INC.html) вы увидите, что ИНК не изменить флаг Carry. Ссылка на набор команд говорит _ ** Флаг CF не влияет **. Флаги OF, SF, ZF, AF и PF устанавливаются в соответствии с результатом. Из-за этого ваш цикл никогда не заканчивается с тех пор, как вы используете _JNC_ (Jump no carry). Может быть, вы хотите _JNZ_ (прыгать не ноль) вместо _JNC_? –

+0

Если вы хотите увеличить на 1 и установить флагов Carry, вы можете использовать инструкцию [_ADD_] (http://www.felixcloutier.com/x86/ADD.html), например 'add byte [nr], 1' –

+0

Side заметка. Существует один из двух возможных результатов для этого кода, который вы используете _INC_. Если флаг переноса был очищен до начала цикла, он будет бесконечно циклически (это, скорее всего, то, что вы видите). Если это было установлено перед циклом, тогда оно будет печатать 649 (0x200 + 0x89) –

ответ

1

nr Когда приближается байтовый предел 255, INC превзойдет он и оберточного от 255 до 0.

к сожалению не установлен в CARRY флаг a wraparound - вызывает бесконечный цикл, потому что условие JNC всегда выполняется.

Так одно решение будет меняться

inc byte [nr] 

в

add byte [nr], 1 

который изменяет ?CARRY флаг. Тогда весь алгоритм должен преуспеть, как ожидалось.

+0

INC не изменяет флаг переноса (вы можете увидеть мой комментарий в вопросе OPs) –

+0

@MichaelPetch: Да. Я подозревал это, когда писал этот ответ, но не проверял. Я исправлю свой ответ. – zx485

+1

Ответ на этот вопрос по-прежнему несовместим, потому что вы сначала указываете OP _This будет продолжаться до тех пор, пока nr не будет 0FFh = 255. Затем INC превзойдет 8-битный предел 255 и установит флаг «CARRY», потому что обход 255 до 0 приведет к этому. –

0

Вы не указали какие у вас изменение. Таким образом, в таком случае:

%include "io.inc" 
section .text 
    global CMAIN 
    CMAIN: 
    mov eax,512 
    PRINT_UDEC 4,eax 
    ret ; and not caring to return 0 
+0

Я думаю, что, как минимум, они, вероятно, искали петлю с тегом. –

+0

@MichaelPetch конечно .. но правильная формулировка вопроса важна, и этот код также выходит из (несуществующего) цикла. QED – Ped7g

+0

Несомненно. Но перед комментированием я исследовал источник вопроса. Если вы просмотрите эту [лабораторную ссылку] (http://ocw.cs.pub.ro/courses/iocla/laboratoare/laborator-07) и посмотрите на _ [2p] 2. Increment flags_ вы увидите, что было намерение , Идея заключалась в том, что мы не изменяли операнды, исправляем цикл, меняя одну строку, поэтому она больше не является бесконечным циклом и в результате выводит 512. Использование чего-то вроде _JNZ_ сделало бы трюк. Я согласен, что вопрос может быть написан гораздо лучше. –

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