#assembly #arm #disassembly
#сборка #arm #разборка
Вопрос:
У меня возникли проблемы с расшифровкой этого блока кода сборки. Каким будет значение r1 к концу и как я туда доберусь?
3242ba66 f6454118 movw r1, 0x5c18
3242ba6a 466f mov r7, sp
3242ba6c f6c0415a movt r1, 0xc5a
3242ba70 f2460002 movw r0, 0x6002
3242ba74 f6c0405a movt r0, 0xc5a
3242ba78 4479 add r1, pc
3242ba7a 4478 add r0, pc
3242ba7c 6809 ldr r1, [r1, #0]
Комментарии:
1. Выполнимый пример с утверждениями в: github.com/cirosantilli/arm-assembly-cheat/blob /…
Ответ №1:
movw
за a movt
следует обычный способ загрузки 32-разрядного значения в регистр. Это эквивалентно объединению этих двух непосредственных значений вместе, при movt
этом значение является старшим 16-разрядным. В этом случае r1 = (movt immediate value << 16) | (movw immediate value))
.
3242ba66 f6454118 movw r1, 0x5c18 // r1 = 0x5c18
3242ba6a 466f mov r7, sp
3242ba6c f6c0415a movt r1, 0xc5a // r1 = (r1 amp; 0xffff) | (0xc5a << 16)
3242ba70 f2460002 movw r0, 0x6002
3242ba74 f6c0405a movt r0, 0xc5a
3242ba78 4479 add r1, pc // r1 = r1 pc
3242ba7a 4478 add r0, pc
3242ba7c 6809 ldr r1, [r1, #0] // r1 = *(r1 0)
Комментарии:
1. Итак, в этом случае, каким будет это значение или r1?
2. С какой частью объяснения у вас возникли трудности?
3. Последние два бита. Итак, добавляем r1 на ПК и *(r1 0). Каким будет значение pc? И означает ли * то же самое, что и в c (оператор почтения)?
4. Значение
pc
— это значение счетчика программ, который является первым столбцом разборки. (Хотя есть одна особенность ARM, с которой вам нужно разобраться.) А звездочка — это просто сокращение VLC для «слова, хранящегося в». VLC заимствовал нотацию C для экономии места. (Ранее у вас не было проблем с другой нотацией C …)5. Я думаю, что прошло много времени с тех пор, как вопрос ответил на него. См. infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0473c /…