【问题标题】:Memory address and array, assembly x86内存地址和数组,汇编 x86
【发布时间】:2021-01-17 00:18:00
【问题描述】:

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

当模拟发生这种情况时:

Image

内存表如下所示:

Address Value
0200 28
02001 00
02002 43
02003 00
02004 a4

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

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

最后一个问题

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

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

【问题讨论】:

  • 它应该做什么?请注意,您的Array 是一个单词数组(因为dw),因此Array 本身包含字节28h, 00h, 43h, 00h, a4h, 00h 等。这是您想要的吗?请记住,x86 是 little-endian,因此 dw 28h 是两个字节 28h,00h 的顺序。
  • 这是真的,显然,更简单的不可能很多很多很多谢谢:D
  • 最后一个问题如何在特定的内存地址初始化一个包含 n 个元素的数组 例如,我怎样才能使我的整个 10 个元素的数组从地址 0200h 开始。无需从数组移动到内存地址。我希望我能解释一下自己,谢谢

标签: assembly x86 emu8086


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    来源是一个单词的数组。将“dw”更改为“db”。

    【讨论】:

    • 看代码屏幕的时间让我眼花缭乱,我需要休息一下。
    • @Ckris:只需将dw 更改为db 就意味着您仍在进行字加载,并且仍然仅将指针增加1,因此字会重叠。如果您正确处理数组的末尾以避免过度读取/覆盖超出您要复制到的位置的末尾,那可能会也可能不会。
    • 最后一个问题如何在特定的内存地址初始化一个包含 n 个元素的数组 例如,我怎样才能使我的整个 10 个元素的数组从地址 0200h 开始。无需从数组移动到内存地址。我希望我能解释一下自己,谢谢
    • 根据您要实现的目标、使用方式或使用的汇编程序,指令 ORG 200h 或 ABSOULTE 200h 可能对您有用,也可能无效。
    • 正如其他人建议的那样,如果您一次移动一个字节,您应该将mov ax, array[bx] 更改为mov al,byte ptr array[bx]mov ds:[si],ax 更改为mov byte ptr ds:[si],al。您也可以熟悉rep movsb 指令。
    猜你喜欢
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多