Я сталкивался с вопросом, работая над языком ассемблера. Вот вопрос:
Предположим, что бит P2.2 используется для управления наружным освещением, а бит P2.5 - освещением внутри здания. Покажите, как включить внешний свет и выключить внутренний.
Решение дано:
SETB C ; CY = 1
ORL C, P2.2 ; CY = P2.2 ORed w/ CY
MOV P2.2, C ; turn it on if not on
CLR C ; CY = 0
ANL C, P2.5 ; CY = P2.5 ANDed w/P2.5
MOV P2.5,C ; turn it off if not off
Я просто чувствовал, что он будет делать ту же работу, чтобы кодировать:
SETB P2.2
CLR P2.5
Что в этом плохого?
microprocessor
assembly
8051
Илкер Демирель
источник
источник
Ответы:
Вы правы в том, что кажется, код, который вы показываете, глупый. Возможно, какая бы машина ни работала на этом компьютере, она не может выполнять немедленные операции по установке битов на портах ввода / вывода, и именно поэтому что-то вроде SETB P2.2 невозможно.
Все еще устанавливая бит CY на 1, тогда ИЛИ что-либо в это просто глупо. То же самое касается установки бита CY на 0, а затем ввода чего-то в него. Ясно, что бит CY может быть непосредственно скопирован в бит вывода ввода / вывода, поскольку код делает это. Максимум это должно быть 4 инструкции, а не 6.
источник
SETB bit
иCLR bit
инструкции, что и дляMOV bit,C
. Кроме того, при использовании дискретных инструкций для чтения порта ввода-вывода, обновления значения и обратной записи получится другая семантика при использовании инструкций чтения-изменения-записи, все побитовые инструкции используют одну и ту же семантику чтения-изменения-записи в I / O порты.Код почти наверняка предназначен для процессора, использующего набор команд 8051. На этом процессоре изменение кода, которое вы предоставляете, будет иметь тот же эффект, что и оригинал, за исключением того, что оно будет работать быстрее. Выполнение «ORL C, P2.2» при установленном переносе не будет иметь никакого наблюдаемого эффекта, кроме как потратить некоторое количество циклов (два цикла ЦП на 2451 такта на 8051, если я правильно помню; вероятно, другое число на некоторых других вариантах) , Аналогично с выполнением «ANL C, P2.5», когда перенос очищен. Хотя могут быть некоторые типы процессоров, в которых запрос на считывание некоторых местоположений ввода-вывода будет иметь некоторый наблюдаемый эффект, я не думаю, что какой-либо процессор в стиле 8051 когда-либо имел такое поведение для любых бито-адресуемых расположений ввода-вывода, очень меньше для битов P2.
Возможно , цель кодекса было продемонстрировать
ORL C,bit
иANL C,bit
инструкции, но это кажется странным , например , чтобы продемонстрировать их.источник
Данный код ассемблера, вероятно, генерируется компилятором. Это неоптимизированная версия следующих операторов C, где
P2_2
иP2_5
являются объектами с битовой адресацией:Это может показаться эквивалентным
P2_2 = 1;
иP2_5 = 0;
, но это не так, если регистры с битовой адресацией являются энергозависимыми объектами. Операция чтения-изменения-записи в энергозависимом объекте должна выполнять чтение и запись в указанном порядке. Это гарантирует, что любые побочные эффекты от чтения или записи в регистре действительно происходят.Хотя я не знаю ни одного 8051-битового адресуемого регистра с побочными эффектами, компилятор не может предположить, что его нет или никогда не будет.
источник
Реальная разница между ними может быть тонкой.
В вашем упрощенном ответе логика считывает порт, устанавливает или сбрасывает значение бита и затем записывает его обратно в порт. Обратите внимание, что весь порт может быть переписан здесь.
Решение, с другой стороны, использует битовую инструкцию MOV, которая может работать несколько иначе.
Не вдаваясь в детали конкретной детали, используемой здесь, трудно определить, есть ли разница или имеет значение.
Или это может быть просто инструктор решил заставить вас думать .... что в конце концов ... его настоящая работа.
источник
Единственный ответ - процессор не поддерживает 1-битные инструкции напрямую. Однако, когда используется бит переноса, он знает, что манипулируется только одним битом.
источник