我正在阅读assembly language for x86 processor的书
我试图解决其中一章问题
问题是:
在程序中插入以下变量:
.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年?
我该如何解决?
答案 0 :(得分:1)
这是因为您将arr1
声明为word
,这是一个16位值,但是您使用mov eax,...
从地址加载了32位双字。
答案 1 :(得分:1)
arr1
是一个WORD数组,即16位值。 mov eax,[esi]
在这种情况下接收32位值两个 16位值。因此,您将在EAX中找到arr1
的第一个和第二个元素。如果您想仅使用第一个值填充整个EAX,请使用movzx eax, word ptr [esi]
。该指令用该元素填充EAX的低16位,并使高16位无效。