Arrays 在x86程序集中的数组上使用偏移运算符?
我目前正在学习Kip R.Irvine编写的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
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中。移动内容需要括号或大括号。