Как 0x3F800000 относится к числу 1?Я предполагаю, что это ссылка, однако я не понял, к чему это относится.
0x3F800000 - 1,0 в представлении IEEE с одинарной точностью.Вы можете щелкнуть правой кнопкой мыши на этом 0x3F800000 и выбрать представление с плавающей запятой, чтобы преобразовать его в 1.0.
Почему MOVS вызывается три раза вместо четырех (потому что есть четыре аргумента)?
В стандартном соглашении о вызовах ARM первые 4 аргумента хранятся в R0-R3 соответственно.Инструкция ldr r1, =0x3f800000
уже хранит второй аргумент.
Являются ли регистры ЦП R0, R1, R2 и т. Д.?
Да.
Может ли кто-нибудь объяснить это:
Пожалуйста, не разбирайте непоследовательные инструкции, так как r3 в 2-й инструкции и в 3-й отличаются,
Если вы проверитеВо всей функции вы должны увидеть, что «var_4C» - это адрес переменной ctx
в стеке.Следовательно,
add r3, sp, #0x50+var_4c
ldr r2, [r3]
просто означает r2 = ctx
.Инструкция movs r0, r2
намного позже поместила контекст в качестве 1-го аргумента.
Также в ARM var_ ??эквивалентно значению -0x ??.В ARM 5-й аргумент и выше хранятся в стеке в [sp, # 0], [sp, # 4] и т. Д. Следовательно, инструкция
ldr r3, =0x3f800000
str r3, [sp, #0] ;// #0x50+var_50 = 0x50 - 0x50 = 0
помещает 1.0 в 5-е числоаргумент.