小编Pet*_*des的帖子

为什么C / RUST中的一个加法计算在结果ASM中有3个双精度浮点加法工具?

简单的C代码,只需添加一个双精度。

void test(double *a, double *b, long n) {
    for (long j = 0; j < n; j++)
    for (long i = 0; i < n; i++) {
        b[i] = b[i] + a[j];
    }
}
Run Code Online (Sandbox Code Playgroud)

在编译器资源管理器中获取ASM结果:https : //godbolt.org/z/tJ-d39

有一addpd和二addsd。两者都是与双精度有关的。

另一个类似的锈代码,获得了更多的双精度添加工具:https//godbolt.org/z/c49Wuh

pub unsafe fn test(a: &mut [f64], b: &mut [f64], n: usize) {
    for j in 0..n {
        for i in 0..n {
            *b.get_unchecked_mut(i) = *b.get_unchecked_mut(i) + *a.get_unchecked_mut(j);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

c assembly simd rust auto-vectorization

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

CMOVcc是否被视为分支指令?

我有memchr我要使非分支的这段代码:

.globl memchr
memchr:
        mov %rdx, %rcx
        mov %sil, %al
        cld
        repne scasb
        lea -1(%rdi), %rax
        test %rcx, %rcx
        cmove %rcx, %rax
        ret
Run Code Online (Sandbox Code Playgroud)

我不确定是否cmove是分支指令。是吗?如果是这样,如何重新排列我的代码,使其不分支?

assembly x86-64 cpu-architecture micro-optimization branch-prediction

-1
推荐指数
1
解决办法
128
查看次数

如何用 AND 重写(P 或 Q)

我正在尝试用汇编语言编写 XOR 运算,但我们允许使用的唯一运算是 AND 和 NOT,不是 OR,也绝对不是 XOR。我在网上到处查了一下,似乎找不到答案。我知道: XOR = (P 或 Q)和 ~(P 和 Q) 但我需要用 AND 运算重写(P 或 Q) 。这可能吗?

assembly boolean-logic boolean-expression demorgans-law boolean-algebra

-1
推荐指数
1
解决办法
1217
查看次数

字符串操作是否因为一次访问一个字符而效率低下?

我听说

  • strlen()C 标准库中的字符串操作(例如)访问和操作字符串的字符,一次一个字符。
  • 计算机一次访问内存中的一个单词。
  • 一次访问一个字符效率低下,字符串操作的时间成本很高。

以上是真的吗?

有哪些解决方案可以提高字符串操作的时间性能?

c string performance c-strings

-1
推荐指数
1
解决办法
90
查看次数

为什么16位指令不能访问通用寄存器的高位寄存器

所以现在我读了《ARM Cortex-M3/M4 权威指南》一书,无法理解为什么 16 位指令无法访问高级通用寄存器 R8-R12。

它说实际上很少有人可以访问这些寄存器,但大多数不能。

assembly arm instruction-set cpu-registers thumb

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

C/汇编中的双冒号“::”运算符

首先,不,我不是在谈论 C++ 范围解析运算符。

我有以下语法:

asm(
"mov R0,%0\n"
"mov R1,%1\n"
"mov R3,%2\n"
"mov R4,%3\n"
"mov R5,%4\n"
::"r"(<A_VALUE>),
"r"(<A_VALUE>),
"r"(<A_VALUE>),
"r"(<A_VALUE>),
"r"(<A_VALUE>),
:"r0","r1","r2"
)
Run Code Online (Sandbox Code Playgroud)

冒号和双冒号是什么意思?我确实记得在动态创建变量名时与字符串连接有关。

万提前致谢!

c assembly inline-assembly colon

-1
推荐指数
1
解决办法
75
查看次数

为什么在 8086 中不能同时使用 SI 和 DI 或 BX 和 BP 寄存器进行间接寻址?

我知道它们是唯一可以用于间接寻址的寄存器,但我找不到解释为什么我不能同时使用这些寄存器对。

为什么机器不支持这样的寻址方式[si+di]

assembly cpu-architecture addressing-mode x86-16

-1
推荐指数
1
解决办法
487
查看次数

如何使用汇编语言中的跳转来实现if条件?

我正在编写一些 x86 汇编语言,但遇到了问题。最终,程序会询问用户一个问题,他们必须回答“a”或“b”。如果他们选择“a”,程序应该跳转到循环二,但如果他们选择“b”,则应该跳转到循环三。我的问题是,无论他们选择什么,程序都会打印循环二和循环三。

one:
mov eax, choice1
call print_string
call read_char
cmp al, 'a'
jl three
jmp two
two:
mov eax, choice2
call print_string
call read_char
cmp al, 'a'
jl four
jmp five
Run Code Online (Sandbox Code Playgroud)

x86 assembly if-statement

-1
推荐指数
1
解决办法
1411
查看次数

程序集“Hello world”执行文件小于 20 字节

下面的代码占用 20 个字节。然而,有一种方法可以通过中断使其变得更小。如何?

\n
A\nMOV AH,9\nMOV DX,108\nINT 21\nRET\nDB 'HELLO WORLD$'\n\nR CX\n14\nN MYHELLO.COM\nW \n
Run Code Online (Sandbox Code Playgroud)\n

assembly dos code-size x86-16

-1
推荐指数
1
解决办法
484
查看次数

如果两台计算机具有相同的 CPU(相同的机器指令),那么是什么阻止程序在两台计算机上兼容?

我正在研究计算机体系结构,但我不明白是什么真正使一台机器的软件与另一台机器“兼容”。让我们以两台使用相同 intel cpu 的机器(例如 Mac OS 和 Windows)为例。现在,如果操作码相同,它们的软件怎么可能彼此不兼容?

1)有人可以概述一下兼容性词所涉及的内容吗?

2)除了CPU的操作码之外,还有哪些因素可以使两台机器相互兼容?

peripherals cpu assembly cross-platform cpu-architecture

-1
推荐指数
1
解决办法
83
查看次数