Advertisement
Guest User

Untitled

a guest
May 19th, 2017
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; комментарий с указанием:
  2. ; - фамилии и группы студента
  3. ; - варианта
  4. ; - краткой формулировки задания
  5. .model small    ; один сегмент кода, данных и стека
  6. .stack 100h     ; отвести под стек 256 байт
  7. .data           ; начало сегмента данных
  8. S   db  'Hello, world!$'
  9. S1  db  'a2ql7Hell',0h  ;Исходная строка
  10. S2  db  'g',0h      ;Строка, которую мы ищем в исходной строкее
  11. n1    dw     ?          ; Длина строки S1
  12. n2    dw     ?          ; Длина строки S2
  13. temp  dw     ?          ; Переменная для хранения начального адреса SI
  14.  
  15. .code           ; начало сегмента кода
  16.     ; Начальная инициализация
  17.     mov ax,@data
  18.     mov ds,ax       ; настройка DS на начало сегмента данных
  19.  
  20.     ;-------------------------------------------------
  21.         ; Определение длины строки S1
  22.         mov     si,0
  23.         lea     bx, s1 
  24.         cmp     byte ptr [bx+si], 0
  25.         jz      DoesNot
  26. LENCYCLE:
  27.         inc     si
  28.         cmp     byte ptr [bx+si], 0 ;Ищем длину строки S1 сравнивая с нулем
  29.         jnz     LENCYCLE        ;Если не равна нулю выполняем еще раз цикл
  30.        
  31.         mov     n1,si           ;Записываем длину строки S1
  32.         ; Определение длины строки S2
  33.         mov     si,0
  34.         lea     bx, s2
  35.        
  36.    
  37. LENCYCLE1:
  38.         inc si
  39.         cmp byte ptr [bx+si], 0 ;Аналогичные действия со строкой S2
  40.         jnz     LENCYCLE1       ;Если не равна нулю выполняем еще раз цикл
  41.        
  42.         mov n2,si               ; Записываем длину строки S2
  43.     ;-------------------------------------------------
  44.    
  45.         MOV     AX, DS
  46.         MOV     ES, AX          ;SCAS uses ES:DI, so copy DS to ES
  47.         CLD                     ;Scan in the forward direction
  48.         LEA     SI, S1
  49.         LEA     DI, S2          ;Starting address to DI
  50.         mov     temp,SI
  51.         DEC     SI              ;Перед входом в цикл поиска убавляем SI на 1
  52.         mov     DX,0
  53.  
  54. Search:
  55.         MOV     CX,n2           ;Макисмальное количество сравнений равно длине слова S2
  56.         INC     SI              ;возвращаем стартовый адрес
  57.         Push    CX              ;записываем в стек данные
  58.         Push    SI
  59.         Push    Di
  60.         REPZ    CMPSB           ;выполняем поиск\сравнение
  61.         ;JS     Search
  62.         mov     BX, CX          ;записываем количество сравнение в BX
  63.         POP     DI              ;восстанавливаем значения из стека
  64.         POP     SI
  65.         POP     CX
  66.         PUSHF
  67.         SUB     CX, BX          ;вычитаем количество сравнений из начального адреса
  68.         POPF
  69.         JS      Search
  70.         CMP     CX, n2          ;сравниваем с длиной второго слова
  71.         JNE     Search          ;если количество сравнений до первого нуля не равно длине слова, значит не совпали
  72.         JE      FOUND           ;если совпали то переходим на вывод
  73. FOUND:  
  74.         SUB     SI,temp         ;вычитаем адрес первого совпавшего символа из начального адреса
  75.         inc     SI              ;прибавляем 1, потому что отчет идет от 0    
  76.         cmp     SI,n1
  77.         jng     Output
  78.  
  79. DoesNot:
  80.         mov     SI,0            ;Признак того, что вторая строка не входит в первую
  81.        
  82.     ;---------------------------------------------------      
  83. Output:
  84.         mov         ax,SI;выводится содержимое AX
  85.         xor         cx,cx
  86.         mov         bx,10
  87. ;в получаем последнюю цифру числа и запоминаем в стеке
  88. isDiv:     
  89.         xor         dx,dx
  90.         div         bx
  91.         push        dx
  92.         inc         cx;считаем количество цифр
  93.         or          ax,ax;повторяем пока не 0
  94.         jnz         isDiv
  95. ;выводим число в нужном порядке в цикле
  96. isOut:     
  97.         pop         ax
  98.         or          al,30h
  99.         int         29h
  100.         loop        isOut
  101.     ;--------------------------------------------------
  102. m2:
  103.     ; Стандартное завершение программы
  104.     mov ax,4C00h    ; ah = N функции, al = код возврата
  105.     int 21h     ; снять программу с выполнения
  106.  
  107.     end     ; конец текста программы
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement