StoneHaos

max_8_comment

Jun 7th, 2021
761
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. include io.asm
  2.  
  3. sstack segment stack
  4.     db 128 dup(?)
  5. sstack ends
  6.  
  7. sdata segment
  8.     ; Строка 1
  9.     str1 db 16 dup(0)
  10.     len1 dw 0
  11.     ; Строка 2
  12.     str2 db 128 dup(0)
  13.     len2 dw 0
  14.     ; Строка 3 = Строка 1 + Строка 2
  15.     str3 db 256 dup(0)
  16.  
  17.     ; esc-последовательность яркого мигающего текста голубого цвета
  18.     ; 1bh - esc, далее параметры: 1-яркий, 5-мигание, 36 - голубой цвет переднего плана
  19.     ; Общий вид: \x1b[параметр[;параметр, ...]m
  20.     strspec db 1bh, "[1;5;36;40m$"
  21.     ; Восстановление по умолчанию
  22.     strret db 1bh, "[0m$"
  23. sdata ends
  24.  
  25. scode segment
  26.     assume cs:scode, ds:sdata, ss:sstack
  27.  
  28. start:
  29.     mov ax,sdata
  30.     mov ds,ax
  31.     mov es,ax
  32.  
  33.     mov cx,0 ; Счётчик символов
  34.     mov bx,0 ; Смещение в строке
  35.     ; Ввод первой строки
  36.     while1:
  37.         inch al ; Ввод символа
  38.         mov dl,24h ; 24h - код символа $
  39.         cmp al,dl ; Сравнение введённого символа с $
  40.         je while1end ; Если равно, выходим из цикла
  41.         mov [str1+bx],al ; Запись символа в буфер
  42.         inc cx ; Увеличение счётчика
  43.         inc bx ; Переход на следующую ячейку буфера
  44.         jmp while1
  45.  
  46.     ; Запись длины в переменную
  47.     while1end:
  48.     mov len1,cx
  49.  
  50.     mov cx,0 ; Счётчик символов
  51.     mov bx,0 ; Смещение в строке
  52.     ; Ввод второй строки (то же, что и в while1)
  53.     while2:
  54.         inch al
  55.         mov dl,24h
  56.         cmp al,dl
  57.         je while2end
  58.         mov [str2+bx],al
  59.         inc cx
  60.         inc bx
  61.         jmp while2
  62.  
  63.     ; Запись длины в переменную
  64.     while2end:
  65.     mov len2,cx
  66.  
  67.     ; Копирование первой строчки (буфер str1) в начало буфера str3
  68.     mov si,offset str1 ; ds:si - источник
  69.     mov di,offset str3 ; es:di - приёмник
  70.     mov cx,len1 ; количество символов
  71.     rep movsb ; Копирование cx символов из источника в приёмник
  72.  
  73.     ; Копирование второй строчки (буфер str2) в буфер str3 сразу после первой строчки
  74.     mov si,offset str2 ; ds:si - источник
  75.     mov di,offset str3 ; es:di - приёмник
  76.     add di,[len1] ; Запись будет происходить не с начала буфера str3, а стразу после записанной ранее первой строки
  77.     mov cx,len2 ; Количество копируемых символов
  78.     rep movsb ; Добавление str2 в str3 сразу после записанной ранее str1
  79.  
  80.     ; Запись знака $ в конец для корректного вывода строки на экран
  81.     mov ax,len1 ; Длина первой строки
  82.     mov bx,len2 ; Длина второй строки
  83.     add bx,ax ; Нужна позиция сразу после двух строк
  84.     mov al,24h ; Код символа $ в al
  85.     mov [str3+bx],al ; Запись в конце буфера str3 (после str1 и str2) символа $
  86.  
  87.     mov dx,offset strspec ; Вывод esc-последовательности для форматированного ввода
  88.     outstr
  89.     mov dx,offset str3 ; Вывод ответа
  90.     outstr
  91.     mov dx,offset strret ; Восстановление исходного состояния терминала
  92.     outstr
  93.  
  94.     finish
  95. scode ends
  96. end start
RAW Paste Data