【发布时间】:2018-10-10 15:45:52
【问题描述】:
有人能解释一下 xchg 在这段代码中是如何工作的吗?假设 arrayD 是 1,2,3 的 DWORD 数组。
mov eax, arrayD ; eax=1
xchg eax, [arrayD+4]; eax=2 arrayD=2,1,3
为什么数组 1,1,3 不在 xchg 之后?
【问题讨论】:
-
为什么你认为数组末尾的值是 2,1,3?
-
mov eax, arrayD不会将eax设置为1。它加载arrayD的地址。你想要的是mov eax, [arrayD]。编辑:误读初始状态。 -
@Jester 这取决于汇编程序。一些汇编程序将
arrayD和[arrayD]视为相同。 -
@interjay 是的。 OP 应该有指定的汇编器。
-
我总是建议即使在 MASM 中也使用方括号,以便在读取源代码时轻松查看内存访问,并与非符号内存引用保持一致,例如
mov eax,[ebx]。 MASM 将忽略符号名称周围的[],因此您可以在这种情况下编写mov eax,[arrayD]。 ...(大约 +4 .. 你知道内存可以通过单字节寻址,所以 32 位值占用内存中的 4 个字节 = 该数组的第一个元素占用地址arrayD+0、arrayD+1、arrayD+2和arrayD+3。第二个元素从地址arrayD+4开始(最多占用内存+7)