2014-01-13 3 views
2

флаг переноса, когда я делаю негативную операцию на A79CDB48h на ассемблере, я получаю CF (флаг переноса), чтобы установить 1. Может кто-то пожалуйста, объясните, почему это произошлоотрицательная операция на языке ассемблера и

+1

_ «на языке ассемблера» _ Для чего процессор? Кроме того, что вы подразумеваете под «отрицательной операцией»? 'NEG',' SUB', ...? – Michael

+0

intel x86 и отрицательные рабочие средства -NEG –

ответ

2

Confused? Понятный.

Предполагаю, что вы работаете с машиной x86 некоторого разнообразия.

Флаг переноса в этом случае не ведет себя так, как вы ожидали бы, что он будет себя вести. Вместо этого он следует этим правилам ...

«... Флаг CF установлен в 0, если исходный операнд равен 0, в противном случае он равен 1. Флаги OF, SF, ZF, AF и PF устанавливаются в соответствии с результатом. .... "

Я выбрал это из THIS PAGE. Посмотрите в поле «Flags affected».

Я забыл, что у руководства intel это документировано, поэтому кто-то, пожалуйста, помогите этому парню со ссылкой.

У них были причины для этого, и они позаботились об аномалии, задокументировав это. На данный момент это ваша работа, чтобы жить с путаницей и писать код, чтобы разместить его.

Если вы делаете что-то вроде ...

Neg Eax     ;Negate some value 
Jc  It_was_positive  ;It was a positive number 
Jmp It_was_negative  ;It was negative 

... то изменить Jc инструкцию к одному из подписанных арифметических условных переходов; и предостережение: я не знаю, как писать код для вашей конкретной проблемы, так что это может быть совершенно неправильно для вашей неотложной необходимости. Проверьте это, прежде чем доверять ему.

О, предупреждение о ваших будущих усилиях: Другие чипы других компаний определяют поведение флага переноса в соответствии с их собственными желаниями. Я думаю, что это Microchip; может быть, кто-то другой; без разницы; они разработали свой флаг переноса для работы точно противоположно тому, как работают другие флаговые флаги. то есть состояния 1 и 0 могут означать прямо противоположное тому, что вы думаете.

Краткая версия: Хорошее общее правило: не используйте Jc и Jnc. Вместо этого используйте условные условные инструкции.

3

Первый вообще, предполагая, что мы имеем дело с архитектурой x86, она определена как в руководстве Intel reference.

IF DEST = 0 
    THEN CF ← 0; 
    ELSE CF ← 1; 
FI; 
DEST ← [– (DEST)] 

Возможная причина такой конструкции состоит в том, что функция может быть реализована в качестве побочного эффекта обобщенного сложения/вычитания в качестве

DEST ← [ TEMP - (DEST) ] 

Где ТЕМП может быть [R/M] или непосредственными 0, когда Операционный код - NEG. В качестве побочного эффекта ALU вычисляет CF и остальные флаги, как если бы операции выполнялись между двумя регистрами общего назначения. Такая схема просто позволяет повторно использовать дорогостоящее оборудование. Более поздние процессоры просто подтвердили спецификации, хотя реализация не была основана на одной и той же микрокодированной архитектуре.