想象一下,您希望将一系列x86汇编指令与某些边界对齐.例如,您可能希望将循环对齐到16或32字节的边界,或者将指令打包以使它们有效地放置在uop缓存中或其他任何位置.
实现这一目标的最简单方法是单字节NOP指令,紧接着是多字节NOP.虽然后者通常效率更高,但这两种方法都不是免费的:NOP使用前端执行资源,并且还计入现代x86上的4宽1重命名限制.
另一个选择是以某种方式延长一些指令以获得所需的对齐.如果这样做没有引入新的停顿,它似乎比NOP方法更好.如何在最近的x86 CPU上有效地延长指令?
在理想的世界中,延长技术同时是:
有一种方法不可能同时满足所有上述要点,因此很好的答案可能会解决各种权衡问题.
1 AMD Ryzen的限制为5或6.
如果我有一个受Intel jcc erratum约束的芯片,我如何在 gcc 中启用缓解(它调整分支位置以避免有问题的对齐),以及哪些 gcc 版本支持它?
如何在 Delphi 汇编器中协调短条件跳转与分支目标对齐?
\n\nI\xe2\x80\x99m 使用 Delphi 版本 10.2 Tokyo,针对 32 位和 64 位汇编,完全使用汇编编写一些函数。
\n\n如果我不\xe2\x80\x99t 使用 .align,编译器会正确short编码条件跳转指令(2 字节指令,由 1 字节操作码074h和 1 字节相对偏移量 -+ 最多 07Fh 组成)。但是,如果我曾经放置过一个.align,即使是小到.align 4- 所有条件跳转指令都位于 .align 之前并且目标位于.align- 在这种情况下,所有这些指令都变成 6 字节指令,而不是 2 字节指令他们应该是。只有位于 .align 之后的指令仍被正确编码为 2 字节short。
Delphi 汇编器不接受 \xe2\x80\x99t 接受 \xe2\x80\x98short\xe2\x80\x99 前缀。
\n\n如何协调短条件跳转与分支目标对齐.align在 Delphi 汇编器中协调短条件跳转与分支目标对齐?
这是一个示例程序 \xe2\x80\x93 请注意,有一个.align这是一个示例程序 \xe2\x80\x93 请注意中间
procedure Test; assembler;\n label\n label1, …Run Code Online (Sandbox Code Playgroud) 我正在查看一些用于汇编的练习代码,并且赋值基本上是用另一个跳转点替换.
原始jmp是SHORT jmp,使用此指令无法到达我需要接近的终点.
我现在有三个选项,我要么删除'SHORT',要么插入'LONG'或者我插入'FAR'.
如果有任何文件指出它们之间的差异,我还没有找到它.任何人都可以在这里帮助吗?