我目前正在通过Kip R. Irvine编写 x86处理器汇编语言第6版。这很有趣,但有些事让我感到困惑。
本书的前面部分显示了以下代码:
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
寄存器中。然后使用Immediates访问存储在esi
中表示的地址的值。递增会将地址移至下一个byte
。
那么在数组上使用OFFSET
和简单地调用数组变量之间的区别是什么?我以前认为简单地调用数组变量也会给我它的地址。
答案 0 :(得分:1)
.data
Number dd 3
.code
mov eax,Number
mov ebx,offset Number
EAX
将读取某个地址的内存并存储数字3
EBX
会存储该特定地址。
mov ebx,offset Number
在这种情况下,等同于
lea ebx,Number