使用偏移访问数据段

时间:2014-04-29 15:41:38

标签: assembly x86 masm irvine32

我正在阅读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年?

我该如何解决?

2 个答案:

答案 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位无效。