Arrays 在x86程序集中的数组上使用偏移运算符?

Arrays 在x86程序集中的数组上使用偏移运算符?,arrays,assembly,x86,offset,Arrays,Assembly,X86,Offset,我目前正在学习Kip R.Irvine编写的x86处理器汇编语言第六版。这很有趣,但有些东西让我困惑 在本书的早期,显示了以下代码: list BYTE 10,20,30,40 ListSize = ($ - list) 这对我来说是有道理的。声明数组后,立即用数组的起始位置减去内存中的当前位置,以获得数组使用的字节数 然而,这本书后来做了: .data arrayB BYTE 10h,20h,30h .code mov esi, OFFSET arrayB mov al,[esi] inc

我目前正在学习Kip R.Irvine编写的x86处理器汇编语言第六版。这很有趣,但有些东西让我困惑

在本书的早期,显示了以下代码:

list BYTE 10,20,30,40
ListSize = ($ - list)
这对我来说是有道理的。声明数组后,立即用数组的起始位置减去内存中的当前位置,以获得数组使用的字节数

然而,这本书后来做了:

.data
arrayB BYTE 10h,20h,30h 
.code
mov esi, OFFSET arrayB
mov al,[esi]
inc esi
mov al,[esi]
inc esi
mov al,[esi]
据我所知,
OFFSET
返回变量相对于程序段的位置。该地址存储在
esi
寄存器中。然后使用立即数访问存储在
esi
中表示的地址处的值。递增将地址移动到下一个
字节

那么,在数组中使用
OFFSET
和简单地调用数组变量有什么区别呢?我以前认为,简单地调用数组变量也会给出它的地址

.data
Number dd 3
.code
mov eax,Number
mov ebx,offset Number
EAX
将读取特定地址的内存并存储数字3

EBX
将存储该特定地址

mov ebx,offset Number
在这种情况下等于

lea ebx,Number

根据汇编器的语法,使用数组名将从内存加载第一个元素,而不是地址。同样,这是特定于汇编器的。OP应该真正参考他的汇编程序文档。例如,在第一个示例中,我使用的大多数方法都会将地址移动到EAX中。移动内容需要括号或大括号。