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
...
任何组合 lock
或 default 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
更大。)
如果我 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
...
任何组合 lock
或 default 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
更大。)