首页 > 解决方案 > 内存地址和数组,汇编 x86

问题描述

我在 Emu8086 上有这个代码:

Mov Bx,0000h
Mov Cx,0ah 
Mov Si,0200h
Fillup:
Mov Ax,Array[bx]
Mov Ds:[Si],Ax
Inc Bx
inc si                           
loop FillUp

Array dw 28h,43h,0a4h,4ch,81h,21h,0ceh,0fh,2dh,87h

当模拟发生这种情况时:

图片

内存表如下所示:

地址 价值
0200 28
02001 00
02002 43
02003 00
02004 a4

每两步输入一个数字,我不知道为什么会这样。

我尝试了很多循环的方法,但我找不到解决方案。

最后一个问题

如何在特定内存地址初始化 n 个元素的数组?

例如,我怎样才能使我的整个 10 个元素的数组都来自地址 0200h?无需从数组移动到内存地址。

标签: assemblyx86emu8086

解决方案


像大多数现代处理器一样,它是字节可寻址的。这意味着每个字节都有自己的地址,当我们将字节分组以形成更大的字长时,内存中的那个字会占用多个字节地址。

我们需要一致地告诉处理器相同数据类型的相同数据大小。处理器不知道数据声明并像高级语言那样记住它们的类型:它只看到指令,并且每条操作数据的指令——在某种意义上——都必须告诉处理器数据占用了多少字节。

以下是需要保持一致的事项列表:

  • 指针大小递增——指针加 2 以访问下一个字大小的数据
  • 索引缩放——对于字大小的数据将索引缩放 2
  • 数据声明——dw用于字大小的数据
  • 加载和存储大小——使用字大小的加载和存储
    • 通过使用字大小的源或目标寄存器(例如ax, bx, vs. al, bl
    • 根据您的汇编语言使用“ word ptr”或“ ”word

推荐阅读