0x004012d0 <main+0>: push %ebp
0x004012d1 <main+1>: mov %esp,%ebp
0x004012d3 <main+3>: sub $0x28,%esp
Run Code Online (Sandbox Code Playgroud)
如果地址不可用,我们可以自己计算吗?
我的意思是我们只有这个:
push %ebp
mov %esp,%ebp
sub $0x28,%esp
Run Code Online (Sandbox Code Playgroud) Haswell架构提出了几条新指令.其中一个是PEXT(并行位提取),其功能由此图像解释(源于此处):

它需要一个值r2和一个掩码r3,并将提取的位r2放入r1.
我的问题如下:纯标准 C++ 11中优化模板化函数的等效代码是什么,将来可能会被编译器优化为该指令.
c++ bit-manipulation instruction-set compiler-optimization c++11
例如,其中一个MOV有两个版本,一个带有REX,一个没有(来自英特尔的doc):
88 /r MOV r/m8, r8
REX + 88 /r MOV r/m8***, r8***
***In 64-bit mode, r/m8 can not be encoded to access the following byte registers if a REX prefix is used: AH, BH, CH, DH.
Run Code Online (Sandbox Code Playgroud)
根据我的理解,2条指令是相同的,除了第二条指令使用额外的字节并提供更少的选项......所以基本上它是无用的.
我错过了什么?
我想知道我的java代码消耗了多少指令来执行.我正在寻找一个开始指令计数的api,最后应该返回最终的指令总数
例如:
public static void main()
{
int a=0;
int b=0;
int c=0;
startCountinst();
if(a==b)
{
c++;
}
int n = stopCountinst();
}
Run Code Online (Sandbox Code Playgroud)
最后,n应表示调用后执行的指令总数startCountinst().在java中可以计算指令吗?
我最近遇到了链接寄存器和叶函数的概念.
我从之前的SO读取中了解到,LR告诉代码在执行过程中的位置.我还知道叶子函数是一个函数,它位于函数调用层次结构的末尾.
链接寄存器支持快速叶函数调用.
为什么这个说法属实? 我查看了ARMARM(架构参考手册),链接寄存器的信息很少.
这里是一个完整的(我认为)NASM 指令列表的链接,我认为它也涵盖了 Intel 处理器的 x64 位指令集。
然而,我希望在某个地方有一个完整的说明列表,仅此而已,而不需要对每个说明进行冗长的解释。
这样的事情存在吗?这对于学习命令(你可以猜出它们的大部分含义,然后用谷歌搜索你猜不到的那些),当你记不住命令时提高你的记忆力,并扫描合适的命令来满足你的要求,这将很有用。
所以我正在研究Redox OS(一个用 Rust 制作的操作系统)的源代码,看看我是否能学到一些东西。
我读的汇编文件的start.s中bootloader的文件夹。在interrupt_vector_table标签中,我们有:
interrupt_vector_table:
b . @ Reset
b .
b . @ SWI instruction
b .
b .
b .
b .
b .
Run Code Online (Sandbox Code Playgroud)
究竟是b .什么?
我不是一个完整的组装初学者,我以前从未遇到过这种情况。
众所周知,两个浮点数的精确乘积并不总是浮点数,但误差exact(a*b) - float(a*b)却是。一些精确乘法的代码通过返回两个数字来利用这一点
res = a * b
err = fma(a, b, -res)
Run Code Online (Sandbox Code Playgroud)
这利用了融合乘加指令,该指令(a*b)+c 通过一次舍入返回表达式。
现在,我想对sums做同样的事情,即
res = a + b
err = add3(a, b, -res)
Run Code Online (Sandbox Code Playgroud)
add3应该返回(a+b)+c 具有一次舍入的表达式。
除了这篇文章之外,我找不到add3现实世界中实际存在的提示。
是否有包含以下内容的CPU指令集add3?有语言实现它吗?
floating-point instruction-set floating-accuracy instructions
我们知道jal指定了一个 21 位的偏移量。但是,它不编码 21 位偏移量而是编码 20 位偏移量。原因是地址的最低有效位始终为零,因为最小可能的 RISC-V 指令是 2 个字节,因此该位未在指令中编码。
通过以这种方式对偏移进行编码,它可以提供 ±1MiB 的跳跃范围。如果jal确实对 LSB 进行编码,它将仅提供 ±512KiB 的跳跃范围。
但是,jalr指定 12 位偏移量的指令确实对 LSB 进行了编码。这将跳跃范围减少到 ±2kiB(而不是 ±4kiB)。我知道它jalr使用 I 型格式,它与addi此类指令的立即数的 LSB 必须编码相同。但是,我认为没有理由必须对jalr.
instruction-set ×10
assembly ×6
arm ×2
x86-64 ×2
c ×1
c++ ×1
c++11 ×1
cpu ×1
gcc ×1
instructions ×1
intrinsics ×1
java ×1
riscv ×1
simd ×1
x86 ×1