汇编 串处理

汇编 串处理

一、串的概念

  1. 串:n个存储单元称为串。根据存储单元的内容,有不同的叫法,如字符串数组等。
  2. 串处理:对串的操作称为串处理。

二、串处理指令

  1. 定义:串操作指令是 8086 8086 8086指令系统中比较独特的一类指令,采用比较特殊的数据串寻址方式,是可以直接实现存储区之间操作的指令。
  2. 操作对象:内存中连续存放的数据串,即在连续的内存区域中以字为单位的字串,或是以字节为单位的字节串。

2.1 串传送 M O V S MOVS MOVS

  1. 格式:
   MOVS  DST,SRC
   MOVSB  (字节)
   MOVSW   (字)
  1. 功能:将以 S I SI SI为指针的源串中的一个字节(或字)存储单元中的数据传送至以 D I DI DI为指针的目的地址中去,并自动修改指针,使之指向下一个字节(或字)存储单元。
  2. 执行操作:
    1. D S : [ S I ] → E S : [ D I ] DS:[SI]→ES:[DI] DS[SI]ES[DI]
    2. 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自动减量。
  3. 举例:传送 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

  1. 格式:
       CMPS  SRC,DST
       CMPSB  (字节)
       CMPSW   (字)
    
  2. 功能:将 S I SI SI所指的源串中的一个字节(或字)存储单元中的数据与 D I DI DI所指的目的串中的一个字节(或字)存储单元中的数据相减,并根据相减的结果设置标志,但结果并不保存。
  3. 执行操作:
    1. ( [ S I ] ) - ( [ D I ] ) ([SI])-([DI]) [SI][DI]
    2. 修改串指针,使之指向串中的下一个元素。
      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)减量。
  4. 举例:对 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

  1. 格式:
   SCAS     DST
   SCASB  (字节)
   SCASW   (字)
  1. 功能: A L AL AL(字节)或 A X AX AX(字)中的内容与 D I DI DI所指的目的串中的一个字节(或字)存储单元中的数据相减,根据相减结果设置标志位,结果不保存。

  2. 执行操作:

    1. 字节操作: A L - [ D I ] AL-[DI] AL[DI],字操作: A X - [ D I ] AX-[DI] AX[DI]
    2. 修改指针使之指向串中的下一个元素。
       当 D F = 0 DF=0 DF=0时,( D I DI DI)增量。
       当 D F = 1 DF=1 DF=1时,( D I DI DI)减量。
  3. 举例:查找字符串

    	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

  1. 格式:
       LODS     SRC
       LODSB  (字节)
       LODSW   (字)
    
  2. 功能:将 S I SI SI所指的源串中的一个字节(或字)存储单元中的数据取出来送入 A L AL AL(或 A X AX AX)中。
  3. 执行操作:
    • 字节操作: [ 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

  1. 格式:
   STOS     DST
   STOSB  (字节)
   STOSW   (字)
  1. 功能:将 A L AL AL A X AX AX中的数据送入 D I DI DI所指的目的串中的字节(或字)存储单元中。
  2. 操作执行:
    1. 字节操作: A L → [ D I ] AL→[DI] AL[DI],字操作: A X → [ D I ] AX→[DI] AX[DI]
    2. 修改指针 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减量。
  3. 举例:数据区初始化
    	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重复前缀指令

  1. 格式:
 REP 串指令
  1. 功能:当 C X ≠ 0 CX≠0 CX=0时,重复执行后面的串指令。可以理解为每执行一次后面的串指令, C X CX CX 1 1 1,并回送 C X CX CX,直到 C X = 0 CX=0 CX0,重复执行结束。
  2. 说明: R E P REP REP指令一般用在 M O V S MOVS MOVS S T O S STOS STOS指令前。
  3. 举例:重复串传送
    	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重复前缀指令

  1. 格式:
     REPZ 串指令
    
  2. 功能:重复执行串指令的条件是: C X ≠ 0 CX≠0 CX=0,且字符相等 Z F = 1 ZF=1 ZF1。可以理解为:每执行一次串指令, C X CX CX 1 1 1回送 C X CX CX,并判断 Z F ZF ZF是否为 0 0 0,只要 C X = 0 CX=0 CX0 Z F = 0 ZF=0 ZF0,重复执行结束。
  3. 说明: R E P Z REPZ REPZ后面常跟 C M P S CMPS CMPS串指令,用于字符串的比较。
  4. 举例:比较字符串
    	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重复前缀指令

  1. 格式:

    REPNZ 串指令
    
  2. 功能:重复执行后面串指令的条件是: C X ≠ 0 CX≠0 CX=0并且串不相等 Z F = 0 ZF=0 ZF0。可以理解为:每执行一次后面的串指令, C X CX CX 1 1 1,并判断 Z F ZF ZF是否为 1 1 1,只要 C X = 0 CX=0 CX0 Z F = 1 ZF=1 ZF1,重复执行结束。

  3. 说明: R E P N Z REPNZ REPNZ后面常跟 S C A S SCAS SCAS串指令,用于搜索一个字符。

  4. 举例:查找字符串

    	mov di,offset string
    	mov al,20h
    	mov cx,count
    	cld
    	repnz scasb	;搜索
    	jz found	;(ZF=1),发现空格
    	...	;不含空格,则继续执行
    found:	...
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值