汇编语言小题一个,感激不尽

已知一任意长度字符串str,以00h结束,长度小于2000h,编写汇编程序实现在该字符串中搜索匹配子串substr(以00h结束,长度小于200),若找到,则将found单元置为ffh,并将匹配位置(匹配位置以字符串str首地址为0参考点)存放在pos单元中;否则,将found单元置为00H。要求编写完整程序,并上机通过debug调试。提示:可利用串操作指令实现。

;如果在dos下编译,将中文注释删除后进行。

data segment
   str1 db 'abcdefghijklmn........',0h,'other string, useless'
   str2 db 'def',0h,'other string'
   len1 dw 0
   len2 dw 0
   lastpos  dw 0
   msg0 db 'found it, position at :','$'
   msg1 db 'not found.$'
   pos   dw  0
   found db 0
data ends

assume cs:code, ds:data, es:data
code segment
start:
   mov ax, data
   mov ds, ax
   mov es, ax

   ;计算str1长度
   lea si, str1,
   lea di, len1
   call strlen

   ;计算str2长度
   lea si, str2,
   lea di, len2
   call strlen

   ;计算str1最大可查找position
   mov ax, offset str1
   mov bx, ax    ;bx保存查找起始位置
   add ax, len1
   sub ax, len2
   inc ax
   mov lastpos, ax ;当查找从这里开始时,就表示不可能匹配上了,因为剩余字符串长度不够

   ;开始查找
   cld  ;设置查找方向为增向
search0:
   mov cx, len2
   mov si, bx
   lea di, str2
   repe cmpsb
   jz  found0 ;zf为0,表示找到
   inc bx
   cmp bx, lastpos
   jnz search0

   ;执行到这里,表示未找到
   lea dx, msg1
   mov ah, 9
   int 21h
   jmp exit

found0:
      mov found, 0ffh ;把这2个要求忘掉了。
      mov pos bx     ;

      ;输出(bx),即在str1中的首地址
   lea dx, msg0
   mov ah, 9
   int 21h

   mov ax, bx
   call print

exit:
   mov ax, 4c00h
   int 21h
;计算[si]指向的字符串的长度
;0为字符串结束符号
;[di]保存计算结果,dw类型
strlen proc near
   mov [di], 0
strlen0:
   cmp [si], 0
   jz strlen1
   inc [di]
   inc si
   jmp strlen0
strlen1:
   ret
strlen endp

;10进制输出(ax)中的数值
print proc near
  push cx
  push bx
  xor cx, cx
  mov bx, 10
p0:
  xor dx, dx
  div bx
  xor dx, 0e30h
  push dx
  inc cx
  cmp ax, 0
  jnz p0
p1:
  pop ax
  int 10h
  loop p1  

  pop bx
  pop cx
  ret
print endp

code ends
end start

温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-04-10
        CODE  SEGMENT
              ASSUME    CS:CODE
        STRR  DB        'hjffhbnsdhfkjhsdQWERTYUIOPqwertyuiopkjgkldfjgljdflg',0
    LEN_STRR  DW        ?
     SUBSTRR  DB        'QWERTYUIOP',0
 LEN_SUBSTRR  DW        ?
       FOUND  DB        0
         POS  DW        ?

      START:  PUSH      CS
              POP       DS
              PUSH      CS
              POP       ES
              MOV       BYTE PTR FOUND,0
              MOV       WORD PTR POS,0
              LEA       SI,STRR
              MOV       CX,0
     @MAIN0:
              MOV       AL,[SI]
              CMP       AL,0
              JE        @MAIN1
              INC       CX
              INC       SI
              JMP       @MAIN0
     @MAIN1:
              MOV       LEN_STRR,CX ;   求主串长
              
              LEA       DI,SUBSTRR
              MOV       CX,0
     @MAIN2:
              MOV       AL,[DI]
              CMP       AL,0
              JE        @MAIN3
              INC       CX
              INC       DI
              JMP       @MAIN2
     @MAIN3:
              MOV       LEN_SUBSTRR,CX          ; 求子串长

              LEA       SI,STRR
              MOV       CX,LEN_STRR
              MOV       DX,LEN_SUBSTRR
              SUB       CX,DX
              MOV       BX,0
     @MAIN4:
              PUSH      CX
              PUSH      SI
              MOV       CX,DX
              LEA       DI,SUBSTRR
     @MAIN5:
              MOV       AL,[SI]
              CMP       AL,[DI]
              JE        @MAIN6
              JMP       @MAIN7
     @MAIN6:
              INC       SI
              INC       DI
              LOOP      @MAIN5
              MOV       BYTE PTR FOUND,-1
              MOV       WORD PTR POS, BX
              JMP       @MAIN8
     @MAIN7:
              POP       SI
              POP       CX
              INC       SI
              INC       BX
              LOOP      @MAIN4
     @MAIN8:
              MOV       AX,POS
              CALL      DSPAXS
              MOV       AL,FOUND
              CBW
              CALL      DSPAXS
     
              MOV       AH,4CH
              INT       21H
;==================================================
 ; 将要显示的有符号数置于 ax 中
      DSPAXS  PROC      NEAR
              PUSH      AX
              TEST      AX,8000H
              JNS       @DSPAXS1
              PUSH      AX
              PUSH      DX
              MOV       AH,2
              MOV       DL,'-'
              INT       21H
              POP       DX
              POP       AX
              NEG       AX
   @DSPAXS1:
              CALL      DSPAX
              POP       AX
              RET
      DSPAXS  ENDP

       DSPAX  PROC      NEAR
              PUSH      AX
              PUSH      BX
              PUSH      CX
              PUSH      DX
              PUSHF
              XOR       CX,CX
              MOV       BX,10
    @DSPAX1:
              XOR       DX,DX
              DIV       BX
              INC       CX
              OR        DX,30H
              PUSH      DX
              CMP       AX,0
              JNE       @DSPAX1
              MOV       AH,2
   @DISPAX2:
              POP       DX
              INT       21H
              LOOP      @DISPAX2
              MOV       DL,32
              INT       21H
              POPF
              POP       DX
              POP       CX
              POP       BX
              POP       AX
              RET
       DSPAX  ENDP
;==============================================              
        CODE  ENDS
              END       START

第2个回答  2016-11-07
        CODE  SEGMENT
              ASSUME    CS:CODE
              ORG       100H
      START:  JMP       BBB
        STRR  DB        'hjffhbnsdhfkjhsdQWERTYUIOPqwertyuiopkjgkldfjgljdflg',0
    LEN_STRR  DW        ?
     SUBSTRR  DB        'QWERTYUIOP',0
 LEN_SUBSTRR  DW        ?
       FOUND  DB        0
         POS  DW        ?

        BBB:  PUSH      CS
              POP       DS
              PUSH      CS
              POP       ES
              MOV       BYTE PTR FOUND,0
              MOV       WORD PTR POS,0
              LEA       SI,STRR
              MOV       CX,0
     @MAIN0:
              MOV       AL,[SI]
              CMP       AL,0
              JE        @MAIN1
              INC       CX
              INC       SI
              JMP       @MAIN0
     @MAIN1:
              MOV       LEN_STRR,CX ;   求串长
              
              LEA       DI,SUBSTRR
              MOV       CX,0
     @MAIN2:
              MOV       AL,[DI]
              CMP       AL,0
              JE        @MAIN3
              INC       CX
              INC       DI
              JMP       @MAIN2
     @MAIN3:
              MOV       LEN_SUBSTRR,CX          ; 求串长

              LEA       SI,STRR
              MOV       CX,LEN_STRR
              MOV       DX,LEN_SUBSTRR
              SUB       CX,DX
              MOV       BX,0
     @MAIN4:
              PUSH      CX
              PUSH      SI
              MOV       CX,DX
              LEA       DI,SUBSTRR
     @MAIN5:
              MOV       AL,[SI]
              CMP       AL,[DI]
              JE        @MAIN6
              JMP       @MAIN7
     @MAIN6:
              INC       SI
              INC       DI
              LOOP      @MAIN5
              MOV       BYTE PTR FOUND,-1
              MOV       WORD PTR POS, BX
              JMP       @MAIN8
     @MAIN7:
              POP       SI
              POP       CX
              INC       SI
              INC       BX
              LOOP      @MAIN4
     @MAIN8:
              MOV       AX,POS
              CALL      DISPAXS
              MOV       AL,FOUND
              CBW
              CALL      DISPAXS
     
              MOV       AH,4CH
              INT       21H
;==================================================
 ; 将要显示的有符号数置于 ax 中
     DISPAXS  PROC      NEAR
              PUSH      AX
              PUSH      BX
              PUSH      CX
              PUSH      DX
              PUSH      SI
              PUSH      DI
              PUSH      BP
              PUSH      DS
              PUSH      ES
              PUSHF
              PUSH      CS
              POP       DS
              PUSH      CS
              POP       ES
              MOV       CX,6
              LEA       DI,DISPAXSS
   @DISPAXS:
              MOV       BYTE PTR [DI],32
              INC       DI
              LOOP      @DISPAXS
              PUSH      AX
              MOV       DL,32
              MOV       AH,2
              INT       21H
              POP       AX
              MOV       BYTE PTR NZS,0
              MOV       BYTE PTR SIGNS,0
              CMP       AX,0
              JGE       @DISPAXS0
              MOV       BYTE PTR SIGNS,1
              NEG       AX
  @DISPAXS0:
              PUSH      AX
              LEA       SI,DIVARRS
              LEA       DI,DISPAXSS
              INC       DI
              MOV       CX,5
  @DISPAXS1:
              POP       AX
              MOV       DX,0
              MOV       BX,[SI]
              DIV       BX
              PUSH      DX
              CMP       AL,0
              JNE       @DISPAXS2
              CMP       BYTE PTR NZS,1
              JE        @DISPAXS2
              CMP       CX,1
              JE        @DISPAXS2
              MOV       DL,20H
              JMP       @DISPAXS3
  @DISPAXS2:
              ADD       AL,30H
              MOV       DL,AL
              MOV       BYTE PTR NZS,1
  @DISPAXS3:
              MOV       BYTE PTR[DI],DL
              INC       SI
              INC       SI
              INC       DI
              LOOP      @DISPAXS1
              POP       DX

              CMP       BYTE PTR SIGNS,1
              JNE       @DISPAXS6
              LEA       SI,DISPAXSS
              ADD       SI,5
  @DISPAXS4:
              CMP       BYTE PTR [SI],32
              JE        @DISPAXS5
              DEC       SI
              JMP       @DISPAXS4
  @DISPAXS5:
              MOV       BYTE PTR [SI],'-'
  @DISPAXS6:
              LEA       DX,DISPAXSS
              MOV       AH,9
              INT       21H
              POPF
              POP       ES
              POP       DS
              POP       BP
              POP       DI
              POP       SI
              POP       DX
              POP       CX
              POP       BX
              POP       AX
              RET
     DIVARRS  DW        10000,1000,100,10,1
         NZS  DB        0
       SIGNS  DB        0
    DISPAXSS  DB        32,32,32,32,32,32,'$'
     DISPAXS  ENDP
;==============================================              
        CODE  ENDS
              END       START

本回答被提问者和网友采纳
相似回答