这段代码中的 1<<0 做了什么?

What does `1<<0` do in this code snippet?

这些代码行的作用是什么?

MBALIGN     equ  1<<0                   
MEMINFO     equ  1<<1

我知道 equ 我们在 nasm 中声明常量,但是 1<<0 有什么作用?

它看起来类似于 C 位运算符,但据我所知在汇编中我们使用 shl

<<a bit shift operator,它就像 C 语言中的无符号整数。 1<<01 移动 0 位,因此结果为 1。

<< gives a bit-shift to the left, just as it does in C. So 5<<3 evaluates to 5 times 8, or 40.

需要使用CPU指令在汇编中做shift in runtime,但是可以使用表达式转换为立即数in compile (assemble) time 如果你的 assembler 支持它们。

这些行定义常量。在这种情况下,这些是可以按位或组合在一起并单独测试的标志。通过将标志定义为移位 1 可以更容易地看到标志的结构。通过写出该表达式的值可以获得相同的效果,但是很难看出哪些位表示什么。

(在这种情况下,设置第 0 位表示 MBALIGN 已设置,第 1 位表示 MEMINFO。)

虽然转变没有任何作用,但它使事情更容易阅读,想想

MBALIGN     equ  1<<0
MEMINFO     equ  1<<1

俗话说

MBALIGN     equ  BIT0
MEMINFO     equ  BIT1
etc.