Assembly 内存地址和阵列,程序集x86
我在Emu8086上有以下代码: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
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可能对你有帮助,或者没有帮助。