[英]Is the hash required for immediate values in ARM assembly?
我一直在閱讀由 gcc 生成的一些不同的 arm 匯編代碼,但我遇到了一些我在規范中找不到的東西。
movw r0, #39784
movt r0, 1
顯然,第一個是將值 39784 移動到底部 16 位或 r0,但 movt 的操作數 '1' 是奇怪的,因為它前面沒有散列,我的印象是立即數需要散列。 在某些情況下它是否是可選的? 還是我錯過了一些神奇的東西?
GNU 匯編器在 ARM 匯編代碼的立即數操作數之前不需要 octothorpe。 你的印象是錯誤的。
ARMv7 的 GNU gas
行為取決於.syntax
兩種稍微不同的語法是支持 ARM 和 THUMB 指令。 默認情況下,划分使用舊樣式,其中 ARM 和 THUMB 指令具有自己的獨立語法。 新的、統一的語法,可以通過 .syntax 指令選擇,具有以下主要特點:
- 立即數操作數不需要 # 前綴。
和https://sourceware.org/binutils/docs-2.26/as/ARM_002dChars.html#ARM_002dChars說:
'#' 或 '$' 可用於指示立即操作數。
對於 ARMv8 #
始終是可選的
https://sourceware.org/binutils/docs-2.26/as/AArch64_002dChars.html#AArch64_002dChars文檔:
可以選擇使用“#”來指示立即操作數。
測試
Ubuntu 16.04,Binutils 2.26.1。
v7.S:
/* These fail */
mov r0, 1
mov r0, 0x1
/* These work */
mov r0, #1
mov r0, #0x1
mov r0, $1
mov r0, $0x1
.syntax unified
mov r0, 1
mov r0, #1
mov r0, 0x1
mov r0, #0x1
mov r0, $1
mov r0, $0x1
v8.S:
mov x0, 1
mov x0, #1
mov x0, 0x1
mov x0, #0x1
集合:
arm-linux-gnueabi-as v7.S
aarch64-linux-gnu-as v8.S
結果:v8 成功,v7 在沒有#
的divided
線上失敗:
v7.S:1: Error: immediate expression requires a # prefix -- `mov r0,1'
v7.S:2: Error: immediate expression requires a # prefix -- `mov r0,0x1'
去做
嗯,但有一些 v7 指令實際上#
是可選的,例如movw
和movt
沒有錯誤:
movw r0, 1
movt r0, 0x1
但有以下錯誤:
movw r0, $1
movt r0, $0x1
ARM 參考手冊
ARMv8-fb 手冊本身有匯編/反匯編建議/要求,在 C1.2“A64 匯編語言的結構”:
A64 匯編語言不需要 # 字符來引入常量立即數操作數,但匯編程序必須允許使用或不使用 # 字符引入立即數。 Arm 建議 A64 反匯編器在立即操作數之前輸出 #。
個人推薦
在 v7 代碼中使用.syntax unified
,不要在 v7 或 v8 的任何文字上使用#
。
統一語法更新更好,而那些#
和$
符號只是更多的代碼噪音。
Linux內核同意我: https : //github.com/torvalds/linux/blob/v4.19/arch/arm/include/asm/unified.h#L23
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.