首页 文章

使用偏移访问数据段

提问于
浏览
0

我正在读_904991的书

我正试图解决其中一章问题

Question is :

在程序中插入以下变量:

.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的 Value 是20001000!

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

我该如何解决?

2 回答

  • 1

    arr1 是一个WORD数组,即16位值 . mov eax,[esi] 在这种情况下接收32位值 two 16位值 . 所以你会在EAX中找到 arr1 的第一个和第二个元素 . 如果要仅使用第一个值填充整个EAX,请使用 movzx eax, word ptr [esi] . 该指令用该元素填充EAX的低16位,并使高16位无效 .

  • 1

    发生这种情况是因为您将 arr1 声明为 word ,这是一个16位值,但您使用 mov eax,... 从地址加载32位双字 .

相关问题