2015-03-18 5 views
0

У меня возникли трудности с очисткой флага переноса, но я придумал способ очистить его с помощью вычитания, но мне было интересно, есть ли лучший способ, которым кто-то мог бы поделиться со мной как установить и очистить флаг переноса с помощью сложения и вычитания.Установка и очистка флага переноса с добавлением и вычитанием

.data 

    binNum1 BYTE 11111111b 

    binNum2 BYTE 00000001b 

.code 

    main PROC 

    mov al, binNum1  ; AL = 0FFh 

    add al, binNum2  ; AL = 00h CF = 1 

    sub al, binNum2  ; AL = FFh CF = 1 

    sub al, binNum2  ; AL = FEh CF = 0 

Это то, что я должен установить и очистить флаг переноса. Когда я сначала вычитаю binNum2 из AL, я возвращаю свое исходное значение FFh, но флаг Carry все еще установлен до тех пор, пока я не вычитаю binNum2 из AL снова. Затем он устанавливает AL в FEh и очищает флаг Carry.

Есть ли у кого лучший способ очистки флага переноса?

ответ

1

Лучшим способом очистки флага переноса является использование инструкции CLC; и лучший способ установить флаг переноса - использовать команду STC.

Если вы должны сделать это с добавлением или вычитанием по какой-то причудливой причине; наименее худший метод (для размера кода), вероятно, sub eax,eax, чтобы очистить флаг переноса, и xor eax,eax; sub eax,1, чтобы установить флаг переноса.

Примечание: чтобы установить флаг переноса, stc; sbb eax,eax будет еще менее плохим, но это решение, вероятно, делает очевидным бессмысленность.

+0

Но дело в том, что я должен это делать, используя сложение и вычитание:/ – Josefhu15

+0

Erm, Ok. Я добавил методы, которые используют вычитание. – Brendan