Вопрос о логике установки флагов на ассемблере - PullRequest
0 голосов
/ 08 февраля 2019

Для заданных кодов в C, например,

if a>b
  c=a+b+10
else
  c=b-a

Мой код на языке ассемблера без использования перехода:

ADR R0,a
ADR R1,b
ADR R2,c
LDR R0,[R0]
LDR R1,[R1]

CMP R0,R1
ADDGT R0,R0,R1
ADDGT R0,#10
STRGT R0,[R2]

SUBLE R1,R1,R0
STRLE R1,[R2]

Предположим, R0> R1, поэтому флаги были установлены в строках CMP

ADDGT и STRGT будут работать из-за флагов.Что если ADDGT R0, R0, R1 имеет значение, которое изменит флаг (возможно, причина V = 1).мы не делали здесь «ADDGTS», чтобы следующий ADDGT мог работать, но не влиял бы на действительное значение R0 ??

Спасибо

1 Ответ

0 голосов
/ 08 февраля 2019

Из Справочного руководства по архитектуре ARM® v7-M (эти инструкции были доступны вплоть до ARM 1).

§A4.4.1 В дополнение к размещениюрезультат в регистре назначения, эти команды могут (необязательно) [используя постфикс 'S'] установить флаги кода состояния в соответствии с результатом операции.Если инструкция не устанавливает флаг, существующее значение этого флага из предыдущей инструкции сохраняется.

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

Регистры кода состояния ортогональны работе ALU - это может иметь значение только в том случае, если выЯ хотел бы сделать 64-битное сложение или вычитание, и в этом случае вы можете позаботиться о флагах o V erflow или C arry.

Ваш код на ассемблере, кажется, соответствует псевдокоду.

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