Linux 定义了一个BX在支持它的 CPU上使用的汇编宏,这让我怀疑有一些性能原因。
这个答案和Cortex-A7 MPCore 技术参考手册也指出它有助于分支预测。
然而,我的基准测试工作未能发现与 ARM1176、Cortex-A17、Cortex-A72 和 Neoverse-N1 cpu 的性能差异。
有没有因此任何理由,更喜欢BX过MOV pc,上了MMU的CPU,并实现了32位ARM指令集,比Thumb代码交互等?
编辑添加基准代码,全部对齐到 64 字节:
执行无用的计算lr并使用返回BX:
div_bx
mov r9, #2
mul lr, r9, lr
udiv lr, lr, r9
mul lr, r9, lr
udiv lr, lr, r9
bx lr
Run Code Online (Sandbox Code Playgroud)
在另一个寄存器上执行无用的计算并使用BX以下方法返回:
div_bx2
mov r9, #2
mul r3, r9, lr
udiv r3, r3, r9
mul r3, r9, r3
udiv r3, r3, r9
bx lr …Run Code Online (Sandbox Code Playgroud) assembly arm cpu-architecture branch-prediction micro-architecture
.MODEL SMALL
.STACK 1000
.DATA
MSGA DB 13,10,"Input first number: ","$"
MSGB DB 13,10,"Input second number:","$"
MSGC DB 13,10,"The sum is: ","$"
NUM1 db ?
NUM2 db ?
NUM3 db ?
.CODE
MAIN PROC NEAR
MOV AX, @DATA
MOV DS, AX
; get first number
LEA DX, MSGA
MOV AH, 09h
INT 21h
MOV AH, 01
INT 21H
SUB AL, '0'
MOV BL, AL
MOV AH, 01
INT 21H
SUB AL, '0'
MOV CL, AL
; get second number
LEA …Run Code Online (Sandbox Code Playgroud) 我正在尝试用gcc汇编程序扩展做一个非常简单的事情:
在编译我的解决方案时:
#include <stdio.h>
#define inf_int volatile unsigned long long
int main(int argc, char *argv[]){
inf_int zero = 0;
inf_int one = 1;
inf_int infinity = ~0;
printf("value of zero, one, infinity = %llu, %llu, %llu\n", zero, one, infinity);
__asm__ volatile (
"addq $1, %0"
: "=r" (infinity)
);
__asm__ volatile (
"addq $1, %0"
: "=r" (zero)
);
__asm__ volatile (
"addq $1, %0"
: "=r" (one)
);
printf("value of zero, one, infinity = %llu, …Run Code Online (Sandbox Code Playgroud)