我正在设计一个带前缀的可变长度整数。
Rust 有计算前导和尾随 1 和 0 的方法:https : //doc.rust-lang.org/std/primitive.u64.html#method.leading_zeros
这些方法在 x86_64、arm32 和 arm64 上的效率有什么不同吗?
例如,如果计算尾随的 1 比尾随的零更快,我将使用 xxxx0111 而不是 xxxx1000 作为长度编码字节(在本例中,对于后面的三个字节)。
为了更好地理解ELF格式和ARMaarch64,我尝试在没有编译器的情况下创建我的 elf 二进制文件,只是用 bash 回显字节。
可以在这里看到我的努力: http: //www.github.com/glaudiston/elf
我已经成功地实现了一个完全工作的精灵sys_write和sys_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) 对于 x86-64,有许多指令集可以加速代码执行。以下是 gcc wiki https://gcc.gnu.org/wiki/FunctionMultiVersioning的列表:
-O2?为了简单起见,我们只说问题是关于 gcc 版本 12(最新的主要版本)。但我想知道我需要做什么 gcc 命令开关/选项,以便我可以看到我的 gcc 版本的功能。
我认为 gcc 选择了“可移植”的东西,所以这可能意味着速度很慢。但这只是我的假设......我想知道这是否意味着像SSE4.2或没有?
假设我有数字 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) 我试图在实模式下绘制到屏幕,所以我试图使用分段访问 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?
假设寄存器 X12 包含值 5,并且我想将寄存器 X12 中的值移至 X13,我应该如何完成此操作?我已经学习了 LDR/STR/MOV,但我很困惑哪一个是实现这一目标的正确方法。以下是我能想到的方法,但我认为它们是错误的:
LDR X13,[X12,#0]
STR X12,[X13]
MOV X13,X12
Run Code Online (Sandbox Code Playgroud) 我的问题是这个问题的反面。
我想编写一个宏,它将接受一个整数和一个字符串文字作为参数,如下所示:
#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) #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操作吗?