文章目录
汇编 串处理
一、串的概念
- 串:n个存储单元称为串。根据存储单元的内容,有不同的叫法,如字符串数组等。
- 串处理:对串的操作称为串处理。
二、串处理指令
- 定义:串操作指令是 8086 8086 8086指令系统中比较独特的一类指令,采用比较特殊的数据串寻址方式,是可以直接实现存储区之间操作的指令。
- 操作对象:内存中连续存放的数据串,即在连续的内存区域中以字为单位的字串,或是以字节为单位的字节串。
2.1 串传送 M O V S MOVS MOVS
- 格式:
MOVS DST,SRC
MOVSB (字节)
MOVSW (字)
- 功能:将以 S I SI SI为指针的源串中的一个字节(或字)存储单元中的数据传送至以 D I DI DI为指针的目的地址中去,并自动修改指针,使之指向下一个字节(或字)存储单元。
- 执行操作:
- D S : [ S I ] → E S : [ D I ] DS:[SI]→ES:[DI] DS:[SI]→ES:[DI]。
- 当 D F = 0 DF=0 DF=0时, S I SI SI和 D I DI DI自动增量;当 D F = 1 DF=1 DF=1时, S I SI SI和 D I DI DI自动减量。
- 举例:传送
100
100
100个字节操作数的例子。
传送一个字节
传送一个字mov si,offset source mov di,offset destination mov cx,100 ;cx←传送次数 cld ;置DF=0,地址增加 again: movsb ;传送一个字节 dec cx ;传送次数减1 jnz again ;判断传送次数cx是否为0 ;不为0,则到again位置执行指令 ;否则,结束
mov si,offset source mov di,offset destination mov cx,50 ;cx←传送次数 cld ;置DF=0,地址增加 again: movsw ;传送一个字 dec cx ;传送次数减1 jnz again ;判断传送次数cx是否为0 ;不为0,则到again位置执行指令 ;否则,结束
2.2 串比较 C M P S CMPS CMPS
- 格式:
CMPS SRC,DST CMPSB (字节) CMPSW (字)
- 功能:将 S I SI SI所指的源串中的一个字节(或字)存储单元中的数据与 D I DI DI所指的目的串中的一个字节(或字)存储单元中的数据相减,并根据相减的结果设置标志,但结果并不保存。
- 执行操作:
- ( [ S I ] ) - ( [ D I ] ) ([SI])-([DI]) ([SI])-([DI])。
- 修改串指针,使之指向串中的下一个元素。
当 D F = 0 DF=0 DF=0时,( S I SI SI)和( D I DI DI)增量。
当 D F = 1 DF=1 DF=1时,( S I SI SI)和( D I DI DI)减量。
- 举例:对
s
t
r
i
n
g
1
string1
string1和
s
t
r
i
n
g
2
string2
string2两个字符串进行比较,若串相同,在
r
e
s
u
l
t
result
result单元中置
0
0
0,否则置
-
1
-1
-1。
mov si,offset string1 mov di,offset string2 mov cx,count cld again: cmpsb ;比较两个字符 jnz unmat ;有不同字符,转移 dec cx jnz again ;进行下一个字符比较 mov al,0 ;字符串相等,设置00h jmp output ;转向output unmat: mov al,0ffh ;设置ffh output: mov result,al ;输出结果标记
2.3 串扫描 S C A S SCAS SCAS
- 格式:
SCAS DST
SCASB (字节)
SCASW (字)
-
功能: A L AL AL(字节)或 A X AX AX(字)中的内容与 D I DI DI所指的目的串中的一个字节(或字)存储单元中的数据相减,根据相减结果设置标志位,结果不保存。
-
执行操作:
- 字节操作: A L - [ D I ] AL-[DI] AL-[DI],字操作: A X - [ D I ] AX-[DI] AX-[DI]。
- 修改指针使之指向串中的下一个元素。
当 D F = 0 DF=0 DF=0时,( D I DI DI)增量。
当 D F = 1 DF=1 DF=1时,( D I DI DI)减量。
-
举例:查找字符串
mov di,offset string mov al,20h ;空格的ASCII码值 mov cx,count cld again: scasb ;搜索 jz found ;为0(ZF=1),发现空格 dec cx ;不是空格 jnz again ;搜索下一个字符 ... ;不含空格,则继续执行 found: ...
2.4 串获取 L O D S LODS LODS
- 格式:
LODS SRC LODSB (字节) LODSW (字)
- 功能:将 S I SI SI所指的源串中的一个字节(或字)存储单元中的数据取出来送入 A L AL AL(或 A X AX AX)中。
- 执行操作:
- 字节操作: [ S I ] → A L [SI]→AL [SI]→AL,字操作: [ S I ] → A X [SI]→AX [SI]→AX。
- 修改指针
S
I
SI
SI,使它指向串中的下一个元素。
当 D F = 0 DF=0 DF=0时, S I SI SI增量。
当 D F = 1 DF=1 DF=1时, S I SI SI减量。
2.5 串存入 S T O S STOS STOS
- 格式:
STOS DST
STOSB (字节)
STOSW (字)
- 功能:将 A L AL AL或 A X AX AX中的数据送入 D I DI DI所指的目的串中的字节(或字)存储单元中。
- 操作执行:
- 字节操作: A L → [ D I ] AL→[DI] AL→[DI],字操作: A X → [ D I ] AX→[DI] AX→[DI]。
- 修改指针
D
I
DI
DI,使之指向串中的下一个元素。
当 D F = 0 DF=0 DF=0时, D I DI DI增量;
当 D F = 1 DF=1 DF=1时, D I DI DI减量。
- 举例:数据区初始化
mov ax,0 mov di,0 mov cx,1000h cld ;DF=0,地址增加 again: stosw ;传送一个字 loop again ;传送次数cx是否为0
3. 串与循环
- 串操作指令执行一次,仅对数据串中的一个字节或字进行操作。但是在串操作指令前,都可以加一个重复前缀,实现串操作的重复执行。
3.1 R E P REP REP重复前缀指令
- 格式:
REP 串指令
- 功能:当 C X ≠ 0 CX≠0 CX=0时,重复执行后面的串指令。可以理解为每执行一次后面的串指令, C X CX CX减 1 1 1,并回送 C X CX CX,直到 C X = 0 CX=0 CX=0,重复执行结束。
- 说明: R E P REP REP指令一般用在 M O V S MOVS MOVS、 S T O S STOS STOS指令前。
- 举例:重复串传送
mov si,offset source mov di,offset destination mov cx,100 ;cx←传送次数 cld rep movsb
rep movsb
等于一下程序。again: movsb ;传送一个字节 dec cx ;传送次数减1 jnz again ;判断传送次数cx是否为0 ;不为0(ZF=0),则转移again位置执行 ;否则,结束
3.2 R E P Z REPZ REPZ重复前缀指令
- 格式:
REPZ 串指令
- 功能:重复执行串指令的条件是: C X ≠ 0 CX≠0 CX=0,且字符相等 Z F = 1 ZF=1 ZF=1。可以理解为:每执行一次串指令, C X CX CX减 1 1 1回送 C X CX CX,并判断 Z F ZF ZF是否为 0 0 0,只要 C X = 0 CX=0 CX=0或 Z F = 0 ZF=0 ZF=0,重复执行结束。
- 说明: R E P Z REPZ REPZ后面常跟 C M P S CMPS CMPS串指令,用于字符串的比较。
- 举例:比较字符串
mov si,offset string1 mov di,offset string2 mov cx,count cld repz cmpsb ;重复比较两个字符 jnz unmat ;字符串不等,转移 mov al,0 ;字符串相等,设置00h jmp output ;转向output unmat: mov al,0ffh ;设置ffh output: mov result,al ;输出结果标记
3.3 R E P N Z REPNZ REPNZ重复前缀指令
-
格式:
REPNZ 串指令
-
功能:重复执行后面串指令的条件是: C X ≠ 0 CX≠0 CX=0并且串不相等 Z F = 0 ZF=0 ZF=0。可以理解为:每执行一次后面的串指令, C X CX CX减 1 1 1,并判断 Z F ZF ZF是否为 1 1 1,只要 C X = 0 CX=0 CX=0或 Z F = 1 ZF=1 ZF=1,重复执行结束。
-
说明: R E P N Z REPNZ REPNZ后面常跟 S C A S SCAS SCAS串指令,用于搜索一个字符。
-
举例:查找字符串
mov di,offset string mov al,20h mov cx,count cld repnz scasb ;搜索 jz found ;(ZF=1),发现空格 ... ;不含空格,则继续执行 found: ...