【问题标题】:Using OFFSET operator on an array in x86 Assembly?在 x86 程序集中的数组上使用 OFFSET 运算符?
【发布时间】:2015-04-03 18:18:39
【问题描述】:

我目前正在阅读 Kip R. Irvine 的 Assembly Language for x86 Processors 6th Edition。这很有趣,但有些事情让我感到困惑。

在本书的开头,显示了以下代码:

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 中表示的地址处的值。递增将地址移动到下一个byte

那么在数组上使用OFFSET 和简单地调用数组变量有什么区别呢?我以前被引导相信简单地调用数组变量也会给我它的地址。

【问题讨论】:

  • 根据您的汇编器语法,使用数组名将从内存中加载第一个元素,而不是地址。

标签: arrays assembly x86 offset


【解决方案1】:
.data
Number dd 3
.code
mov eax,Number
mov ebx,offset Number

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

EBX 将存储该特定地址。

mov ebx,offset Number

在这种情况下等同于

lea ebx,Number

【讨论】:

  • 再一次,这是特定于汇编程序的。 OP 应该真正参考他的汇编器文档。例如,我使用的大多数会在您的第一个示例中将地址移动到 EAX 中。移动内容需要括号或大括号。
猜你喜欢
  • 1970-01-01
  • 2015-06-15
  • 1970-01-01
  • 1970-01-01
  • 2017-04-17
  • 2020-06-06
  • 2016-12-02
  • 2021-01-12
  • 1970-01-01
相关资源
最近更新 更多