相关疑难解决方法(0)

"rep ret"是什么意思?

我在Visual Studio 2008上测试了一些代码并注意到了security_cookie.我能理解它的重点,但我不明白这条指令的目的是什么.

    rep ret /* REP to avoid AMD branch prediction penalty */
Run Code Online (Sandbox Code Playgroud)

当然我可以理解评论:)但是这个前缀exaclty在上下文中做了ret什么,如果ecx是!= 0 会发生什么?显然,ecx当我调试它时,忽略循环计数,这是预期的.

我发现这里的代码在这里(由编译器注入安全性):

void __declspec(naked) __fastcall __security_check_cookie(UINT_PTR cookie)
{
    /* x86 version written in asm to preserve all regs */
    __asm {
        cmp ecx, __security_cookie
        jne failure
        rep ret /* REP to avoid AMD branch prediction penalty */
failure:
        jmp __report_gsfailure
    }
}
Run Code Online (Sandbox Code Playgroud)

x86 assembly

42
推荐指数
3
解决办法
3万
查看次数

为什么破坏LZCNT的"输出依赖性"很重要?

在测量某些东西的同时,我测量的吞吐量比我计算的要低得多,我将其缩小到LZCNT指令(它也发生在TZCNT中),如以下基准所示:

  xor ecx, ecx
_benchloop:
  lzcnt eax, edx
  add ecx, 1
  jnz _benchloop
Run Code Online (Sandbox Code Playgroud)

和:

  xor ecx, ecx
_benchloop:
  xor eax, eax  ; this shouldn't help, but it does
  lzcnt eax, edx
  add ecx, 1
  jnz _benchloop
Run Code Online (Sandbox Code Playgroud)

第二个版本要快得多.它不应该.LZCNT没有理由对其输出有输入依赖性.与BSR/BSF不同,xZCNT指令总是覆盖其输出.

我在4770K上运行它,所以LZCNT和TZCNT没有被执行为BSR/BSF.

这里发生了什么?

x86 assembly

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

C++如何获取变量的位长?

假设有一个变量int x.它的大小是4个字节,即32位.

然后我为这个var赋值,x = 4567(二进制10001 11010111); 所以现在,在内存中它应该是这样的:

00000000 00000000 000 10001 11010111

有没有办法得到重要的位长度.在我的例子中,比特长度将是13(我用粗体标记它们).如果我使用sizeof(x)它返回4个字节,其大小为int.如何只获得代表数字的位大小(之后没有不必要的零)?

c++ bits

4
推荐指数
2
解决办法
5601
查看次数

X64指令在不同的CPU上表现不同

在一次采访中,有人问我是否知道x64指令的行为有所不同,具体取决于使用的CPU,我在任何地方找不到任何文档,有谁知道这些指令是什么以及为什么会这样?

x86 assembly x86-64

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

使用内存覆盖前缀但所有操作数都是寄存器时会发生什么?

使用内存覆盖前缀但所有操作数都是寄存器时会发生什么?

所以,让我们说你的代码mov eax, ebxadd eax, ebx默认是32位,但你使用67h覆盖.

处理器如何处理这种情况?

memory x86 assembly overriding cpu-architecture

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

标签 统计

assembly ×4

x86 ×4

bits ×1

c++ ×1

cpu-architecture ×1

memory ×1

overriding ×1

x86-64 ×1