小编Nat*_*dge的帖子

计算前导/尾随 1/0 的效率有什么不同吗?

我正在设计一个带前缀的可变长度整数。

Rust 有计算前导和尾随 1 和 0 的方法:https : //doc.rust-lang.org/std/primitive.u64.html#method.leading_zeros

这些方法在 x86_64、arm32 和 arm64 上的效率有什么不同吗?

例如,如果计算尾随的 1 比尾随的零更快,我将使用 xxxx0111 而不是 xxxx1000 作为长度编码字节(在本例中,对于后面的三个字节)。

arm bit-manipulation x86-64 rust varint

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

elf aarch64 用 sys_write 打高尔夫球

为了更好地理解ELF格式和ARMaarch64,我尝试在没有编译器的情况下创建我的 elf 二进制文件,只是用 bash 回显字节。

可以在这里看到我的努力: http: //www.github.com/glaudiston/elf

我已经成功地实现了一个完全工作的精灵sys_writesys_exit系统调用x64

但对于aarch64,它没有像我预期的那样工作:

# cat make-elf.sh 
#!/bin/bash
#
# depends on:
# - elf_fn.sh (github.com/glaudiston/elf)
# - base64 (gnu-coreutils)
#

. elf_fn.sh

instructions="";
instructions="${instructions}\nwrite $(echo -en "hello world\n" | base64 -w0)";
instructions="${instructions}\nexit 3";
write_elf elf "${instructions}";
Run Code Online (Sandbox Code Playgroud)

它生成:

$ xxd elf
00000000: 7f45 4c46 0201 0100 0000 0000 0000 0000  .ELF............
00000010: 0200 b700 0100 0000 7800 0100 0000 0000  ........x.......
00000020: …
Run Code Online (Sandbox Code Playgroud)

linux bash assembly elf arm64

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

对于 gcc 编译器,当您在没有任何标志的情况下与 -O2 进行编译时,gcc 的目标是什么 x86-64 指令集?

对于 x86-64,有许多指令集可以加速代码执行。以下是 gcc wiki https://gcc.gnu.org/wiki/FunctionMultiVersioning的列表:

  • 多媒体MX
  • 上证所
  • 上证2
  • SSE3
  • SSSE3
  • SSE4.1
  • SSE4.2
  • POPCNT
  • AVX
  • AVX2

对于 gcc 编译器,当您在没有任何标志的情况下编译时,gcc 的目标是什么 x86-64 指令集-O2

为了简单起见,我们只说问题是关于 gcc 版本 12(最新的主要版本)。但我想知道我需要做什么 gcc 命令开关/选项,以便我可以看到我的 gcc 版本的功能。

我认为 gcc 选择了“可移植”的东西,所以这可能意味着速度很慢。但这只是我的假设......我想知道这是否意味着像SSE4.2或没有?

gcc x86-64 simd compiler-optimization

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

优化的可被整除

假设我有数字 X,我想看看它是否可以被 Y 整除。最优化的方法是什么?

到目前为止,我有:

int X = 12;
int Y = 4;
(X ^ Y) & 0b111 ==0    # Check if X XOR Y (mask size Y) == 0
Run Code Online (Sandbox Code Playgroud)

虽然我是硬编码0b111(Y 的掩码大小)。顺便说一句,我不关心语言,我只是用 C 标记它。


顺便说一句,使用编译器资源管理器我得到:

int is_divisible_by(int x, int y) {
    return x % y == 0;
};
Run Code Online (Sandbox Code Playgroud)
# -O3
is_divisible_by:
        movl    %edi, %eax
        cltd
        idivl   %esi         # seems to just be doing straight division?
        xorl    %eax, %eax
        testl   %edx, %edx
        sete    %al
        ret
Run Code Online (Sandbox Code Playgroud)

c optimization x86 assembly bit-manipulation

0
推荐指数
1
解决办法
118
查看次数

NASM:实模式下无效的有效地址

我试图在实模式下绘制到屏幕,所以我试图使用分段访问 0xB8000

我的汇编代码是这样的

[BITS 16]
org 0x7c00

begin:
  mov ah, 0x01 ; disable cursor
  mov ch, 0x3f
  int 0x10

  mov ch, 0x0000
  mov cs, 0xb800
  mov ah, 0x0000
  mov [cs:ah], ch ; invalid effective address

end:
  jmp end

times 510 - ($-$$) db 0
dw 0xaa55
Run Code Online (Sandbox Code Playgroud)

我将如何正确使用分段来解决 0xB8000?

assembly real-mode nasm osdev x86-16

0
推荐指数
1
解决办法
116
查看次数

ARM汇编如何将一个寄存器中的值存储到另一个寄存器中

假设寄存器 X12 包含值 5,并且我想将寄存器 X12 中的值移至 X13,我应该如何完成此操作?我已经学习了 LDR/STR/MOV,但我很困惑哪一个是实现这一目标的正确方法。以下是我能想到的方法,但我认为它们是错误的:

   LDR X13,[X12,#0]
   STR X12,[X13]
   MOV X13,X12
Run Code Online (Sandbox Code Playgroud)

assembly arm arm64

0
推荐指数
1
解决办法
8653
查看次数

如何使用字符串文字作为宏参数?

我的问题是这个问题的反面

我想编写一个宏,它将接受一个整数和一个字符串文字作为参数,如下所示:

#define STRING_MAP_ENTRY(value, name) \
  {value, std::to_string(val) + " - " + name}

STRING_MAP_ENTRY(0, "ENTRY_1")
Run Code Online (Sandbox Code Playgroud)

宏应该把上面的调用变成 {0, "0 - ENTRY_1"}

有没有办法做到这一点?我目前的尝试是这样的:

#define STRING_MAP_ENTRY(val, name) \
  { val, std::to_string(val) + "(" + name + ")" }
Run Code Online (Sandbox Code Playgroud)

c++ string macros

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

关于c中浮点值的mod运算符.这显示错误"非法使用浮点"

#include<stdio.h>
#include<conio.h>
void main()
{
  float n, r;
  printf("\n enter a number");
  scanf("%d",&n);
  r=n%10;
  n/=10;
  printf("%d %d",n, r );
  getch();
}
Run Code Online (Sandbox Code Playgroud)

此代码在编译时显示错误.我想知道:我们可以对浮点值执行mod操作吗?

c

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