Найти количество вхождений подстроки 8 бит - Assembler

Узнай цену своей работы

Формулировка задачи:

Найти количество вхождений подстроки в строке. Разрядность данных в массиве, 8 бит. Помогите пожалуйста написать программу. Не могу понять как посмотреть результат.

Решение задачи: «Найти количество вхождений подстроки 8 бит»

textual
Листинг программы
;
.8086
.MODEL TINY
;
CR    EQU   0Dh
LF    EQU   0Ah
;
PromptLen   EQU   9
BufLen      EQU   80 - PromptLen
;
.CODE
      ORG   100h
START:
      JMP   EXEC
;
lwString    DW    ?
lwSubstr    DW    ?
nbOccur     DB    ?
nbColumn    DB    ?
sdInfo      DB    "Searches number of occurrences of substring in string", CR, LF
            DB    "emu8086, Fast & Powerful (for example ;o)"
sdCrLf      DB    CR, LF, "$"
sdString    DB    " string: $"
sdSubStr    DB    " substr: $"
sdNotFound  DB    " not found$"
sdNoccur    DB    " Noccur: $"
;
EXEC:
      LEA   DX, sdInfo
      CALL  showSd
STR_LOOP:
; Input string
      LEA   DX, sdString
      LEA   SI, kbBufStr
      MOV   CX, BufLen  ; It's emu (MOV CL,BufLen compiled as MOV CL,[BufLen] ;o)
      CALL  inputSc
      CALL  crLf
      JCXZ  EXIT
      MOV   lwString, CX
; Input substring
      LEA   DX, sdSubStr
      LEA   SI, kbBufSub
      MOV   CX, BufLen
      CALL  inputSc
      CALL  crLf
      JCXZ  STR_LOOP
      MOV   lwSubstr, CX
;
      CALL  searchSubs
      CALL  showResult
      JMP   STR_LOOP
EXIT:
      RET
;
searchSubs:
; Used: AX, BX, CX, DX, DI, SI
      MOV   nbOccur, 0
      MOV   nbColumn, 0
      LEA   BX, chString
      MOV   DX, lwString
sssearchloop:
      MOV   CX, lwSubstr
      CMP   DX, CX
      JC    ssexit
; Compare strings
      MOV   DI, BX
      LEA   SI, chSubstr
      REPE CMPSB
      JNE   ssnextchar
;
      INC   nbOccur
      MOV   CX, BX
      SUB   CX, Offset chString - PromptLen
      CALL  showPointer
      SUB   DX, lwSubstr
      ADD   BX, lwSubstr
      JMP   sssearchloop
ssnextchar:
      DEC   DX
      INC   BX
      JMP   sssearchloop
ssexit:
      RET
;
showResult:
; Used: AX, CX, DX
      MOV   AL, nbOccur
      TEST  AL, AL
      JNZ   srshow
      LEA   DX, sdNotFound
      CALL  showSd
      JMP   srexit
srshow:
      CALL  crLf
      LEA   DX, sdNoccur
      CALL  showSd
      AAM
      MOV   CX, AX
      TEST  CH, CH
      JZ    srlowdig
      MOV   DL, CH
      CALL  showDigit
srlowdig:
      MOV   DL, CL
      CALL  showDigit
srexit:
;
crLf:
; Used: DX
      LEA   DX, sdCrLf
;
showSd:
; Input: DX = message address
      PUSH  AX
      MOV   AH, 9
      INT   21h
      POP   AX
      RET
;
showPointer:
; Input: CX = pointer offset from beg.pos.
; Used:  CX
      PUSH  DX
      SUB   CL, nbColumn
      JCXZ  spsetptr
      MOV   DL, " "
sploop:
      CALL  showChar
      INC   nbColumn
      LOOP  sploop
spsetptr:
      MOV   DL, "^"
      CALL  showChar
      INC   nbColumn
      POP   DX
      RET
;
showDigit:
; Input: DL = digit in range 0-9
; Used:  AH, DL
      ADD   DL, "0"
showChar:
      MOV   AH, 2
      INT   21h
      RET
;
inputSc:
; Input:  DX = address of message
;         SI = address of input buffer
;         CX = max chars
; Output: CX = number of entered chars
; Used:   AH, DX
      CALL  showSd
      MOV   DX, SI
      MOV   [SI], CL
      MOV   AH, 0Ah
      INT   21h
      MOV   CL, [SI+1]  ; String length
      RET
;
kbBufStr LABEL Byte
chString    EQU   kbBufStr + 2
kbBufSub    EQU   chString + BufLen
chSubstr    EQU   kbBufSub + 2
;
      END   START
;

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.846 из 5
Похожие ответы