Gregory Fenn
Gregory Fenn

Reputation: 488

ARM-GCC code directives for ArmV7A assembly code: .code vs .arm instruction mode directives

What is the difference between .code32, .code 32, and .arm directives in an assembly file?

The .S file will be compiled with arm-none-eabi-as

Are the three directives identical? None of these directives are explained in the programmer's guide (https://developer.arm.com/documentation/den0013/d/Introduction-to-Assembly-Language/Introduction-to-the-GNU-Assembler/Assembler-directives?lang=en), so it's hard to answer this myself.

Essentially, we wish to ensure that all functions writen in a given .S file are in ARM32 instruction mode (i.e. not Thumb).

-- Update: looks like I imagined .code32! The other two directives are identical, .arm is literally just shorthand for .code 32.

Cheers for fast replies!

Upvotes: 0

Views: 381

Answers (1)

Nate Eldredge
Nate Eldredge

Reputation: 58705

They are documented in the GNU assembler manual at https://sourceware.org/binutils/docs/as/ARM-Directives.html#ARM-Directives.

.code [16|32]

This directive selects the instruction set being generated. The value 16 selects Thumb, with the value 32 selecting ARM.

.arm

This performs the same action as .code 32.

So either one would do what you want.

The .code32 variant is not mentioned. As you note, it doesn't actually work in GNU as. It could be a typo, or maybe some versions have permissive syntax that makes the space optional.

Upvotes: 2

Related Questions