数组的定义
在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 procmov ecx,20mov al,0cchmov 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
