第九章 字符串与数组
9.2 基本字符串操作指令(B:字节,W:字,D:双字) ? MOVSB, MOVSW, MOVSD ? CMPSB, CMPSW, CMPSD ? SCASB, SCASW, SCASD ? STOSB, STOSW, STOSD ? LODSB, LODSW, LODSD 方向标志 方向标志值 对ESI和EDI的影响 寻址顺序 CLD(清零) 增加 低-高 STD(置位) 减少 高-低 重复前缀:指令使用ECX作为计数器进行重复 REP 当ECX>0重复 REPZ,REPE 零标志置位并且ECX>0重复 REPNZ,REPNE 零标志清零并且ECX>0重复
9.2.1 MOVSB, MOVSW, MOVSD
MOVSB, MOVSW, and MOVSD 指令从ESI指向的内存位置复制数据到EDI指向的内存位置。
同时ESI和EDI寄存器自动增加或减少(依据方向标志的值而定)。 指令 ESI和EDI自动增加或减少的值 MOVSB 1 MOVSW 2 MOVSD 4
9.2.2 CMPSB, CMPSW, CMPSD CMPSB, CMPSW, CMPSD 指令可以将ESI指向的内存操作数同EDI指向的内存操作数相比较
注:只有在两个字符串长度相等的条件下,使用CMPS指令比较两个字符串才是可行的,此限制将由Str_compare解决。
9.2.3 SCASB, SCASW, SCASD
SCASB, SCASW, SCASD指令把AL/AX/EAX中的值同由EDI寻址的目标内存中的字节,字或双字相比较。
若使用REPE,当ECX>0并且AL/AX/EAX匹配内存中的值,继续扫描;若使用REPNE,当AL/AX/EAX匹配内存中的值或ECX=0停止。
41
9.2.4 STOSB, STOSW, STOSD
STOSB, STOSW, STOSD指令把AL/AX/EAX的内容存储在EDI指向的内存单元中,同时EDI的值根据方向标志的值增加或减少。
9.2.5 LODSB, LODSW, LODSD
LODSB, LODSW, LODSD 从ESI指向的内存位置向AL/AX/EAX中装入一个值,同时ESI的值根据方向标志值增加或减少、
9.3 精选的字符串过程 9.3.1 Str_compare 过程
;比较string1和string2,设置零标志和进位标志方式同CMP指令 Str_compare PROTO, string1: PTR BYTE, string2: PTR BYTE
关系 进位标志 零标志 若为真则转移的指令 string1
9.3.2 Str_length 过程 ;在EAX中返回字符串的长度 Str_length PROTO, pString: PTR BYTE
9.3.3 Str_copy 过程
;复制源字符串到目的串中 Str_copy PROTO,
source: PTR BYTE, target: PTR BYTE
9.3.4 Str_trim 过程
;从字符串中删除指定的字符,第二个参数是要删除的字符 Str_trim PROTO,
pString: PTR BYTE, char: BYTE
9.3.5 Str_ucase 过程 ;把字符串转换成大写
42
Str_ucase PROTO, pString: PTR BYTE
9.4 二维数组
基址编址操作数:基址变址操作数把两个寄存器的值相加,得到一个偏移地址。两个寄存器分别称为基址(base)和变址(index)。 格式如下:[base + index]
32位模式下,基址和变址的部分均可使用任意32位通用寄存器。
二维数组:以行主序访问二维数组时,通常使用基址寄存器存放行偏移,变址寄存器存放行偏移。 例:
row_index = 1 ;1行 column_index = 2 ;2列
mov ebx,OFFSET tableB ;表的偏移地址 add ebx,Rowsize * row_index ;行的偏移地址 mov esi,column_index ;列的偏移地址 mov al,[ebx + esi]
相对基址变址操作数:相对基址变址操作数吧把偏移、基址寄存器、变址寄存器以及可选的比例因子组合起来产生一个有效地址,下面是该操作数最常见的两种格式:
[base + index + displacement] Displacement[base + index]
偏移可以是常量的名字或是常量表达式。 例:
mov ebx,Rowsize ;行索引
mov esi,2 ; 列索引 mov eax,tableD[ebx + esi *TYPE tableD]
第十章 结构和宏
结构:
name STRUCT
field-declarations name ENDS 例:
COORD STRUCT
X WORD ? ; offset 00 Y WORD ? ; offset 02 COORD ENDS
43
联合:
unionname UNION union-fields unionname ENDS 例:
Integer UNION D DWORD 0 W WORD 0 B BYTE 0 Integer ENDS 宏:
macroname MACRO [parameter-1, parameter-2,...] statement-list ENDM 例:
mNewLine MACRO ; define the macro call Crlf ENDM .data
.code
mNewLine ; invoke the macro
44
相关推荐: