小编Tim*_*win的帖子

除了 ARMv7 之前的拇指互通之外,有什么理由在 MOV pc、R 上使用 BX R?

Linux 定义了一个BX在支持它的 CPU上使用的汇编宏,这让我怀疑有一些性能原因。

这个答案Cortex-A7 MPCore 技术参考手册也指出它有助于分支预测。

然而,我的基准测试工作未能发现与 ARM1176、Cortex-A17、Cortex-A72 和 Neoverse-N1 cpu 的性能差异。

有没有因此任何理由,更喜欢BXMOV 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

8
推荐指数
1
解决办法
336
查看次数

如何在装配中使用ADC?

.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)

x86 assembly

5
推荐指数
1
解决办法
6071
查看次数

为什么这个简单的c程序与gcc(clang)内联汇编表现出不确定的行为?

我正在尝试用gcc汇编程序扩展做一个非常简单的事情:

  • 将unsigned int变量加载到寄存器中
  • 加1吧
  • 输出结果

在编译我的解决方案时:

#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)

x86 gcc gnu-assembler inline-assembly

2
推荐指数
1
解决办法
3878
查看次数