内存地址和数组,汇编 x86
Memory address and array, 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
模拟时发生这种情况:
Image
内存table是这样的:
Address
Value
0200
28
02001
00
02002
43
02003
00
02004
a4
每两步输入一次数字,我不知道为什么会这样。
循环的方法我试了很多,还是找不到解决方法
最后一个问题
如何在特定内存地址初始化一个包含 n 个元素的数组?
例如,如何从地址 0200h 生成包含 10 个元素的整个数组?无需从数组移动到内存地址。
源是 个词 的数组。将 'dw' 更改为 'db'。
与大多数现代处理器一样,它是字节可寻址的。这意味着每个字节都有自己的地址,当我们将字节分组以形成更大的字大小时,内存中的那个字会占用多个字节地址。
我们需要始终如一地告诉处理器相同数据类型的相同数据大小。处理器不知道数据声明并像高级语言那样记住它们的类型:它只看到指令,并且每条操作数据的指令——在某种意义上——必须告诉处理器数据占用了多少字节。
以下是需要保持一致的事项列表:
- 指针大小递增 — 指针加 2 以访问下一个字大小的数据
- 索引缩放 — 对于单词大小的数据,将索引缩放 2
- 数据声明 — 使用
dw
字大小的数据
- 加载和存储大小——使用字大小的加载和存储
- 通过使用字大小的源或目标寄存器(例如
ax
、bx
与 al
、bl
)
- 根据您的汇编语言使用“
word ptr
”或“word
”
我在 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
内存table是这样的:
Address | Value |
---|---|
0200 | 28 |
02001 | 00 |
02002 | 43 |
02003 | 00 |
02004 | a4 |
每两步输入一次数字,我不知道为什么会这样。
循环的方法我试了很多,还是找不到解决方法
最后一个问题
如何在特定内存地址初始化一个包含 n 个元素的数组?
例如,如何从地址 0200h 生成包含 10 个元素的整个数组?无需从数组移动到内存地址。
源是 个词 的数组。将 'dw' 更改为 'db'。
与大多数现代处理器一样,它是字节可寻址的。这意味着每个字节都有自己的地址,当我们将字节分组以形成更大的字大小时,内存中的那个字会占用多个字节地址。
我们需要始终如一地告诉处理器相同数据类型的相同数据大小。处理器不知道数据声明并像高级语言那样记住它们的类型:它只看到指令,并且每条操作数据的指令——在某种意义上——必须告诉处理器数据占用了多少字节。
以下是需要保持一致的事项列表:
- 指针大小递增 — 指针加 2 以访问下一个字大小的数据
- 索引缩放 — 对于单词大小的数据,将索引缩放 2
- 数据声明 — 使用
dw
字大小的数据 - 加载和存储大小——使用字大小的加载和存储
- 通过使用字大小的源或目标寄存器(例如
ax
、bx
与al
、bl
) - 根据您的汇编语言使用“
word ptr
”或“word
”
- 通过使用字大小的源或目标寄存器(例如