【问题标题】:access data segment using offset使用偏移量访问数据段
【发布时间】:2014-04-29 15:41:38
【问题描述】:

我在看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?

我该如何解决?

【问题讨论】:

  • 贴出的代码中eax的值变成了20001000(经过测试!)。为什么你期望 00002000?
  • 是的你是对的我编辑我的问题:(
  • 因为[esi]返回值在esi的地址..我觉得应该是00001000而不是20001000

标签: assembly x86 masm irvine32


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-18
      • 2020-06-13
      • 2021-07-23
      相关资源
      最近更新 更多