Ensuring 16-bit THUMB Instruction Encoding for Code Execution from SRAM on STM32F103
I'm working on a project where I want to execute code from internal SRAM on an STM32F103 as an exercise. My goal is to write some THUMB assembly by hand, assemble it using
arm-none-eabi-as
, load the machine code into SRAM with OpenOCD's mwh
command, set the PC to the beginning of SRAM using reg pc 0x20000000
, and step through the instructions.
The assembly code I wrote is a simple loop:
Here are the commands I used to assemble and disassemble the code:
The disassembler output is as follows:
My understanding is that THUMB instructions should be 16 bits long, but the disassembler is showing some instructions (like mov.w r0, #40
as f04f 0028
) that are 32 bits. I was expecting 16-bit instructions since I am working with THUMB.
Why are some of my instructions encoded as 32-bit THUMB-2 instructions, and how can I ensure that the machine code is 16-bit THUMB-only instructions for loading into SRAM?2 Replies
@Sterling You’re seeing 32-bit instructions in your THUMB assembly code disassembly for an STM32F103, even though you expect only 16-bit THUMB instructions. This discrepancy arises because your assembler defaults to using THUMB-2, which includes both 16-bit and 32-bit instructions.
you can try this out if your intent on 16bit
Alrightt, thanks for this