BGE Инструкция ARM - PullRequest
       70

BGE Инструкция ARM

0 голосов
/ 28 ноября 2018

Этот тест запрашивает ответвление при условии 'BGE' ответвление к метке.Значения, хранящиеся в моих сравниваемых регистрах:

LDR r0,=0X3
LDR r1,=0X8F
CMP r0,r1
BGE a_label
SUBS r1,r1, #0XC9

Я ожидал, что он разветвится, но каким-то образом 0X8F не превышает 0X3.Эмуляция моего кода на Keil доказывает это.

Мне интересно, кто-нибудь знает, почему он не ветвится и как 0X8F читается как значение, превышающее 0X3!

Большое вам спасибо <3 </p>

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Я думаю, что вы неправильно интерпретируете, как CMP работает с вариантами «сравнения» кодов условий.Когда вы читаете CMP, за которым следует условная инструкция, в вашей голове переместите код условия между двумя аргументами в CMP.Следовательно,

CMP r0, r1
BGE label

означает «разветвление, если r0 равно г больше или e соответствует r1».В вашем случае r0 - это 3, а r1 - это 0x8F (143), и поэтому ясно, что ветвление не произойдет.

0 голосов
/ 28 ноября 2018

Помните, что BGE - это сравнение со знаком, поэтому в вашем примере оно не будет разветвляться, учитывая, что первый операнд (r0) не больше или равен второму (r1).

LDR r0,=0X3       ; load 0X00000003
LDR r1,=0X8F      ; load 0x0000008F
CMP r0,r1         ; (r0 - r1) and sets the condition register
BGE a_label       ; Conditional branch which checks if it was greater or equal (False)
SUBS r1,r1, #0XC9

Ради полноты и, как предположил Майкл, более распространено (или рекомендуется) использование MOV r0,#0X00000003 вместо LDR r0,=0X00000003 для загрузки констант (наиболее вероятно, что сгенерированный файл будет точното же самое) см. это .

...