I have written one code in the assembly language for mixing C and assembly. The compiler is not properly generating the code for one instruction. I have written the following code,
LDR r0,[pc, #74]
here I want to load a word value from the PC+offset. Here I want the 16 bit LDR instruction should be used by the compiler. But compiler is taking LDR.W instruction, which is general instruction for +/- offset and which is 32 bit. But I want to instruct the compiler for the usage of the 16 bit instructions, how to do this? Also if I want to use the LDR.W instruction I will write the same, but why the compiler is generating a different instruction, although syntax of both instruction is different?
Code is as follows,
void assemblytestcode(void) { __asm { LDR r0,[pc,#74] LDRSB r0,[r0,#0x00] LDR r1,[pc,#74] STR r0,[r1,#0x00] } }
and the assembly viewed in the simulation is as follows,
42: __asm 43: { 0x00005000 B510 PUSH {r4,lr} 44: LDR r0,[pc,#74] 0x00005002 F8DF004A LDR.W r0,[pc,#74] ; @0x00005050 45: LDRSB r0,[r0,#0x00] 0x00005006 F9900000 LDRSB r0,[r0,#0x00] 46: LDR r1,[pc,#74] 0x0000500A F8DF104A LDR.W r1,[pc,#74] ; @0x00005058 47: STR r0,[r1,#0x00] 48: } 49: 50: 0x0000500E 6008 STR r0,[r1,#0x00]
Do you get the same behaviour in a pure assembler module?
ie, not inline assembler in a 'C' file.
I just checked the same code using pure assembler. It's generating code properly. So unable to figure out the problem. Although my work will not hamper, still the question will remain unanswered.
Mukund Kumbhar:
www.keil.com/.../armcc_chr1359124249383.htm
The inline assembler provides no direct access to the physical registers of an ARM processor. If an ARM register name is used as an operand in an inline assembler instruction it becomes a reference to a variable of the same name, and not the physical ARM register.
The compiler implicitly declares registers R0 to R12 and r0 to r12 as auto signed int local variables, regardless of whether or not they are used. If you want to declare them to be of a different data type, you can do so. For example,
John, basically my question was different and you have added a different context. I wasn't discussing about the register usage. Although the references given by you are correct, keil has provided another way to use the registers in the code. The details of it are present at following path, www.keil.com/.../armcc_chr1359125006491.htm Also if you can give information about the abnormal behavior of compiler, it will be beneficial.
You need to read the documentation