assembly - 内存地址和数组,汇编 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?无需从数组移动到内存地址。
解决方案
像大多数现代处理器一样,它是字节可寻址的。这意味着每个字节都有自己的地址,当我们将字节分组以形成更大的字长时,内存中的那个字会占用多个字节地址。
我们需要一致地告诉处理器相同数据类型的相同数据大小。处理器不知道数据声明并像高级语言那样记住它们的类型:它只看到指令,并且每条操作数据的指令——在某种意义上——都必须告诉处理器数据占用了多少字节。
以下是需要保持一致的事项列表:
- 指针大小递增——指针加 2 以访问下一个字大小的数据
- 索引缩放——对于字大小的数据将索引缩放 2
- 数据声明——
dw
用于字大小的数据 - 加载和存储大小——使用字大小的加载和存储
- 通过使用字大小的源或目标寄存器(例如
ax
,bx
, vs.al
,bl
) - 根据您的汇编语言使用“
word ptr
”或“ ”word
- 通过使用字大小的源或目标寄存器(例如
推荐阅读
- docker - 如何在容器启动时运行命令,并在命令完成后保持容器运行?
- angular - Angular 12:架构验证失败,出现以下错误:数据路径“”不应具有其他属性(inlineStyleLanguage)
- node.js - NodeJS 谷歌云服务账户不记名令牌
- javascript - 在 JS 编译时 React DOM 更新。但是刷新浏览器会给出错误'无法读取未定义的属性(读取'1')'
- pdf - 下载 pdf - 屏幕阅读器的辅助功能
- android - Android KeyStore CTS ImportWrappedKeyTest 错误 - INVALID_ARGUMENT(代码 -38)
- serial-port - 不同调制解调器的 RS232 例程有何不同?
- python - 在 OpenCV 中拼接来自两台相机的图像
- python - 使用 pymongo 将数据从 Mysql 迁移到 MongoDB
- java - 带有空值的 Jdbc bigint 数组