簡體   English   中英

ARM 程序集中的立即數是否需要散列?

[英]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

文檔說https://sourceware.org/binutils/docs-2.26/as/ARM_002dInstruction_002dSet.html#ARM_002dInstruction_002dSet

兩種稍微不同的語法是支持 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 指令實際上#是可選的,例如movwmovt沒有錯誤:

   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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM