Assembly 内存地址和阵列,程序集x86

Assembly 内存地址和阵列,程序集x86,assembly,x86,emu8086,Assembly,X86,Emu8086,我在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 4

我在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
源是一个单词数组。将“dw”更改为“db”。

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

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

下面列出了需要保持一致的事项:

  • 指针大小增量-向指针添加2以访问下一个字大小的数据
  • 索引缩放-将单词大小的数据的索引缩放2
  • 数据声明-使用
    dw
    进行字号大小的数据
  • 加载和存储大小-使用单词大小的加载和存储
    • 通过使用字大小的源寄存器或目标寄存器(例如,
      ax
      bx
      ,与
      al
      bl
    • 根据您的汇编语言使用“
      word ptr
      ”或“
      word

它应该做什么?请注意,您的
Array
是一个单词数组(因为
dw
),因此
Array
本身包含字节
28h、00h、43h、00h、a4h、00h
,等等。这是您想要的吗?请记住x86是小尾端,因此
dw 28h
是按此顺序排列的两个字节
28h,00h
。这是事实,显然更简单,不可能很多很多很多很多感谢:完成了最后一个问题,例如,如何在特定内存地址初始化n个元素的数组,我如何制作来自0200h地址的10个元素的整个数组。无需从阵列移动到内存地址。我希望我能解释我自己,感谢那些看着代码屏幕的人让我失明,我需要休息。很多很多thanks@Ckris:仅将
dw
更改为
db
将意味着您仍在进行单词加载,并且仍然只将指针增加1,因此单词将重叠。如果您正确地处理数组的结尾,以避免在要复制到的结尾处发生过度读取/过度写入,则这可能是正常的,也可能是不正常的。最后一个问题是如何在特定内存地址初始化由n个元素组成的数组,例如,如何使地址0200h中的10个元素组成的整个数组。无需从阵列移动到内存地址。我希望我能解释一下我自己,谢谢。取决于你想要实现什么,你是如何使用的或你正在使用的汇编程序,指令ORG 200h或Absolute 200h可能对你有帮助,或者没有帮助。