assembly - How are encoded register operands in ARM assembler ? -
i decompiled arm elf files , read assembler code. but, don't see how codes translated mnemonics. example code this:
#hex code | #mnemonic | #binary 0xb480 | push {r7} | 1011 0100 1000 0000 0xb580 | push {r7, lr} | 1011 0101 1000 0000 0xb5f0 | push {r4,r5,r6,r7,lr} | 1011 0101 1111 0000 so, can see opcode push 0xb4 or 0xb5 if pushing multiple values. how list of registers created ?
the first example clear, r7 coded 8th bit, set. but, why second opcode pushes lr? there no bit flag ?
there 3 encodings of push instruction in thumb mode. first 1 16 bits long , exists since armv4t (original thumb implementation):
15141312|11|109|8| 7..0 | 1 0 1 1| 0| 10|m| register_list| since register_list 8 bits, can push registers r0 r7 (and lr, if m bit set).
in thumb-2 (armv6t2, armv7 , later), 2 more encodings have been added. both 32 bits long:
1514131211|109|876|5|4|3210||151413| 12 .. 0 | 1 1 1 0 1| 00|100|1|0|1101|| 0 m 0| register_list | in one, register_list 13 bits, can push r0 r12 , lr.
i won't list third encoding, can push single register.
btw, pop encodings similar.
16-bit pop:
15141312|11|109|8| 7..0 | 1 0 1 1| 1| 10|p| register_list| can pop r0 r7 , pc (bit p).
32-bit pop multiple:
1514131211|109|876|5|4|3210||151413| 12 .. 0 | 1 1 1 0 1| 00|010|1|0|1101|| p m 0| register_list | can pop r0 r12, pc (bit p) , lr (bit m).
Comments
Post a Comment