Если я собираю это с помощью 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.

Единственное, что собирает, это поменять его на bts rax, 0. Очевидно, что у этой программы нет потоков, но полный поток будет, и если несколько потоков попытаются запустить init одновременно, он обязательно сломается.

Я просматривал это несколько раз, наверное, я что-то глупое упустил, но понятия не имею, что это.

0
Rubixninja314 11 Фев 2021 в 04:06

1 ответ

Лучший ответ

bts не имеет 8-битной формы, см. https://www.felixcloutier.com/x86 / bts, поэтому вы не можете использовать его для байтовой переменной.

Если вы измените initted на dw / dd / dq, вы можете использовать bts, но вы должны указать размер операнда, например lock bts dword [initted], 0.

(Я полагаю, что bts с битовым смещением 0 не должен изменять ничего, кроме младшего байта своего операнда. Так что lock bts word [initted], 0 в принципе можно использовать на initted db 0, если вы можете быть уверены он не находится в последнем байте страницы, что можно гарантировать, поставив перед ним align 2. Если вам не нужна экономия памяти, лучше просто увеличить initted.)

2
Nate Eldredge 11 Фев 2021 в 01:22