在x86汇编中使用OFFSET运算符在一个数组上?

时间:2015-04-03 18:18:40

标签: arrays assembly x86 offset

我目前正在通过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和简单地调用数组变量之间的区别是什么?我以前认为简单地调用数组变量也会给我它的地址。

1 个答案:

答案 0 :(得分:1)

.data
Number dd 3
.code
mov eax,Number
mov ebx,offset Number

EAX将读取某个地址的内存并存储数字3

EBX会存储该特定地址。

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

等同于

lea ebx,Number