数组的定义
在32位汇编语言中,定义数组时,通常使用定义数据指令(如 DB
, DW
, DD
,DQ
)和标签来指定数组的名称和内容。DB
定义字节数组(每个元素占1字节)、DW
定义字数组(每个元素占2字节)、DD
定义双字数组(每个元素占4字节)、DQ
定义四字数组(每个元素占8字节),以下是常见的数组定义格式:
.data
byte_array db 13,23,14,25,30 ;定义一个包含5个字节(8位)的数组
word_array dw 1, 2, 3, 4, 5 ; 定义一个包含5个字(16位)的数组
qword_array dq 1234567890123456789, 9876543210987654321 ; 定义四字数组
如果此时我们要定义一个未进行初始化的数据,则格式为:
数组名 命令 元素个数 dup(?)
此时要定义一个有20个字节元素的数组barray,则可以这样定义:
barray db 20 dup(?)
这个时候如果要手动对数组进行修改或者初始化则需要使用stos系列的指令;STOS
指令在 x86 汇编语言中用于将数据从累加器寄存器(AL
、AX
或 EAX
)存储到由目的地址寄存器(EDI
)指示的内存位置。具体来说,STOS
指令有三个变体:STOSB
、STOSW
和 STOSD
,分别用于存储字节、字和双字数据。
数组数据填充
STOS系列操作步骤
-
存储数据:将
AL
、AX
或EAX
的内容存储到由EDI
指示的内存位置。 -
调整
EDI
:根据方向标志(DF)调整EDI
:
-
DF = 0(向前):
EDI
递增(STOSB
递增1字节,STOSW
递增2字节,STOSD
递增4字节)默认 -
DF = 1(向后):
EDI
递减(STOSB
递减1字节,STOSW
递减2字节,STOSD
递减4字节)
CLD:清除方向标志,使指针递增。 STD:设置方向标志,使指针递减。
此时我要对刚刚定义的barray数组/或者上面的byte_array等数组进行修改或者初始化,那么可以这样做(此处以barray为例子),该程序功能为将 barray
数组中的 20 个字节全部填充为 0xCC
:
.586
.model flat,stdcall
option casemap:none
.data
byte_arr db 13,23,14,25 ;定义一个字节数组 byte_arr,包含 4 个字节
barray db 20 dup(?) ;定义一个未初始化的字节数组 barray,包含 20 个字节
.code
main proc
mov ecx,20
mov al,0cch
mov edi,offset barray
rep stosb ;REP指令前缀用于重复执行紧随其后的字符串操作指令,直到寄存器 ECX 的值减为零。
main endp
end
.code
代码段的代码解释:
-
mov ecx,20
:将寄存器ECX
设置为 20,表示需要重复执行接下来的指令 20 次。 -
mov al,0cch
:将寄存器AL
设置为0xCC
(一个特殊值,通常用于填充内存以进行调试)。 -
mov edi,offset barray
:将EDI
寄存器设置为barray
数组的地址。 -
rep stosb
:将AL
的值(0xCC
)存储到EDI
指示的内存位置,并将EDI
增加1,然后将ECX
减少1;重复此过程,直到ECX
减为零,这将在barray
数组的 20 个字节中全部填充0xCC
。
未填充前:
填充后:数组对应的内存被填充未cc