簡體   English   中英

匯編代碼x86

[英]Assembly code x86

所以我對匯編代碼完全不了解並且也閱讀它們

所以我有一個簡單的C代碼

void saxpy()
{
  for(int i = 0; i < ARRAY_SIZE; i++) {
  float product = a*x[i];
  z[i] = product + y[i];
}
}

以及使用編譯時的等效匯編代碼

gcc -std=c99 -O3 -fno-tree-vectorize -S code.c -o code-O3.s 

給我以下匯編代碼

saxpy:
.LFB0:
.cfi_startproc
movss   a(%rip), %xmm1
xorl    %eax, %eax
.p2align 4,,10
.p2align 3
.L3:
movss   x(%rax), %xmm0
addq    $4, %rax
mulss   %xmm1, %xmm0
addss   y-4(%rax), %xmm0
movss   %xmm0, z-4(%rax)
cmpq    $262144, %rax
jne .L3
rep ret
.cfi_endproc

我確實了解到已經展開了循環展開,但是我無法理解背后的意圖和想法

addq    $4, %rax
mulss   %xmm1, %xmm0
addss   y-4(%rax), %xmm0
movss   %xmm0, z-4(%rax)

有人可以解釋一下4的用法,這些語句是什么意思y-4(%rax)

xyz是全局數組。 您沒有在列表末尾聲明符號。

為您提供了代碼 ,並定義了必要的全局變量(並修復了縮進)。 看底部。

順便說一句,這里沒有展開。 每個標量單精度mul都有一個,並添加到循環中。 嘗試使用-funroll-loops進行查看。

使用-march=haswell ,gcc將使用FMA指令 如果通過省略-fno-tree-vectorize來取消編譯器的#define ARRAY_SIZE ,並且#define ARRAY_SIZE很小,如100,則它將以32個字節的FMA ymm指令完全展開循環,以16個字節的FMA xmm結尾。

另外,需要向rax寄存器添加立即數4。 按照語句“ addq $ 4,%rax”完成

循環將指針增加4個字節,而不是使用縮放索引尋址模式。


查看https://stackoverflow.com/questions/tagged/x86上的鏈接。 此外,使用調試器單步執行代碼通常是確保您了解其功能的好方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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