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