Копирование строк - Assembler (223282)

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

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

Задать с клавиатуры строку символов ASCII. В сегменте данных зарезервировать соответствующее число байтовых ячеек. Перенести строку символов,заданных с клавиатуры в сегмент данных,используя префиксы. Буду рада любым идеям как решить данную задачу.

Решение задачи: «Копирование строк»

textual
Листинг программы
  1. LOCALS
  2.  
  3. .model small
  4.  
  5. .stack 100h
  6.  
  7. .data
  8.         kbdBuffer       db      80, ?, 80 dup(0)        ;буфер клавиатуры для ввода строки
  9.         CrLf            db      0Dh, 0Ah, '$'           ;символы перевода строки
  10.         String          db      ?, 80 dup(0)            ;строка в формате длина, символы
  11.         PromptStr       db      'Enter string:', 0Dh, 0Ah, '$'
  12. .code
  13.  
  14. main    proc
  15.         mov     ax,     @data
  16.         mov     ds,     ax
  17.  
  18.         ;ввод строки
  19.         mov     ah,     09h
  20.         lea     dx,     PromptStr
  21.         int     21h
  22.         lea     dx,     String
  23.         call    GetStr
  24.  
  25.         call    ShowString
  26.  
  27.         mov     ah,     09h
  28.         lea     dx,     CrLf
  29.         int     21h
  30.  
  31. @@Exit:
  32.         mov     ax,     4C00h   ;завершение программы
  33.         int     21h
  34. main    endp
  35.  
  36. ;Чтение строки с клавиатуры
  37. ;на входе:
  38. ;  ds:dx - адрес строки
  39. ;на выходе:
  40. ;  ds:dx - строка в Pascal формате (длина, символы)
  41. GetStr  proc
  42.         push    ax
  43.         push    bx
  44.         push    cx
  45.         push    dx
  46.         push    si
  47.         push    di
  48.         pushf
  49.         push    es
  50.  
  51.         mov     bx,     dx      ;сохранение адреса строки
  52.         ;чтение в буфер из клавиатуры
  53.         mov     ah,     0Ah
  54.         lea     dx,     kbdBuffer
  55.         int     21h
  56.         ;перевод строки
  57.         mov     ah,     09h
  58.         lea     dx,     CrLf
  59.         int     21h
  60.         ;копирование из буфера в переменную строки
  61.         mov     cx,     0
  62.         mov     cl,     [kbdBuffer+1]
  63.         inc     cx      ;за счёт байта длины строки, количество символов увеличивается
  64.         push    ds
  65.         pop     es
  66.         lea     si,     kbdBuffer+1
  67.         mov     di,     bx
  68.         cld
  69.         rep     movsb
  70. @@SkipCopy:
  71.         pop     es
  72.         popf
  73.         pop     di
  74.         pop     si
  75.         pop     dx
  76.         pop     cx
  77.         pop     bx
  78.         pop     ax
  79.         ret
  80. GetStr  endp
  81.  
  82. ShowString      proc
  83. .386
  84.         pusha
  85.         mov     cx,     0
  86.         mov     cl,     String
  87.         lea     si,     String
  88.         add     si,     cx
  89.         mov     byte ptr [si+1],'$'
  90.  
  91.         mov     ah,     09h
  92.         lea     dx,     String+1
  93.         int     21h
  94.  
  95.         popa
  96.         ret
  97. ShowString      endp
  98.  
  99. end     main

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


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

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

13   голосов , оценка 4.077 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут