Assembly 使用偏移量访问数据段

Assembly 使用偏移量访问数据段,assembly,x86,masm,irvine32,Assembly,X86,Masm,Irvine32,我在读他的书 我正在尝试解决章节中的一个问题 问题是: 在程序中插入以下变量: .data Uarray WORD 1000h,2000h,3000h,4000h Sarray SWORD -1,-2,-3,-4 编写使用直接偏移寻址将Uarray中的四个值移动到 EAX、EBX、ECX和EDX寄存器 我写这段代码: TITLE MASM Template (main.asm) INCLUDE Irvine32.inc .data arr1 W

我在读他的书

我正在尝试解决章节中的一个问题

问题是:

在程序中插入以下变量:

.data
Uarray WORD 1000h,2000h,3000h,4000h
Sarray SWORD -1,-2,-3,-4
编写使用直接偏移寻址将Uarray中的四个值移动到 EAX、EBX、ECX和EDX寄存器

我写这段代码:

TITLE MASM Template                     (main.asm)

INCLUDE Irvine32.inc
.data
    arr1 WORD 1000h,2000h,3000h,4000h
    arr2 SWORD -1,-2,-3,-4

.code   
main PROC
    mov esi,OFFSET arr1
    mov eax,[esi]
    call DumpRegs
exit
main ENDP
END main
但是eax的值是20001000

我不明白为什么它不是00001000?为什么第一部分变成2000年


这是因为您将
arr1
声明为
word
,这是一个16位的值,但您使用
mov-eax,…
arr1
从地址加载一个32位的dword是一个单词数组,即16位的值
mov eax,[esi]
在本例中接收32位值两个16位值。因此,您将在EAX中找到
arr1
的第一个和第二个元素。如果只想用第一个值填充整个EAX,请使用单词ptr[esi]代替movzx EAX。此指令用元素填充EAX的下16位,并使上16位为空。

发布代码中的EAX值变为20001000(已测试!)。你为什么期望00002000?是的,你是对的,我编辑我的问题:(因为[esi]返回esi地址中的值..我认为应该是00001000而不是20001000