BTS 给出 "invalid combination",但仅在寻址内存时

BTS gives "invalid combination", but only when addressing memory

如果我 assemble 使用 nasm -felf64 test.asm,我得到错误:

; syntax: nasm
default rel
global main
 
section .text
main:
        call init
        ; do stuff
        ret
 
init:
        lock bts [initted], 0 ; <-- error: invalid combination of opcode and operands
        jc .continue
        ret
 
    .continue:
        ; do stuff
        ret
 
section .data
        initted db 0

使用lea得到相同的结果:

...
        lea rax, [initted]
        lock bts [rax], 0 ; <-- same error
        jc .continue
...

任何组合 lockdefault rel 也会发生这种情况。

唯一 assembles 正在将其更改为 bts rax, 0。显然这个程序没有任何线程,但完整的线程会,如果多个线程尝试同时 运行 init 它肯定会中断。​​

我仔细看了好几遍,可能漏掉了什么愚蠢的东西,但我不知道那是什么。

bts 没有 8 位形式,请参阅 https://www.felixcloutier.com/x86/bts,因此不能在字节变量上使用它。

如果你把initted改成dw / dd / dq,你可以使用bts,但是你必须指定操作数的大小,例如lock bts dword [initted], 0.

(我假设位偏移量为 0 的 bts 除了其操作数的低字节外不应修改任何内容。因此 lock bts word [initted], 0 原则上可以用于 initted db 0如果你能确定它不在页面的最后一个字节上,你可以通过在它前面放 align 2 来保证这一点。除非你急于节省内存,否则最好只做 initted更大。)