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

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

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

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

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

textual
Листинг программы
LOCALS
 
.model small
 
.stack 100h
 
.data
        kbdBuffer       db      80, ?, 80 dup(0)        ;буфер клавиатуры для ввода строки
        CrLf            db      0Dh, 0Ah, '$'           ;символы перевода строки
        String          db      ?, 80 dup(0)            ;строка в формате длина, символы
        PromptStr       db      'Enter string:', 0Dh, 0Ah, '$'
.code
 
main    proc
        mov     ax,     @data
        mov     ds,     ax
 
        ;ввод строки
        mov     ah,     09h
        lea     dx,     PromptStr
        int     21h
        lea     dx,     String
        call    GetStr
 
        call    ShowString
 
        mov     ah,     09h
        lea     dx,     CrLf
        int     21h
 
@@Exit:
        mov     ax,     4C00h   ;завершение программы
        int     21h
main    endp
 
;Чтение строки с клавиатуры
;на входе:
;  ds:dx - адрес строки
;на выходе:
;  ds:dx - строка в Pascal формате (длина, символы)
GetStr  proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    si
        push    di
        pushf
        push    es
 
        mov     bx,     dx      ;сохранение адреса строки
        ;чтение в буфер из клавиатуры
        mov     ah,     0Ah
        lea     dx,     kbdBuffer
        int     21h
        ;перевод строки
        mov     ah,     09h
        lea     dx,     CrLf
        int     21h
        ;копирование из буфера в переменную строки
        mov     cx,     0
        mov     cl,     [kbdBuffer+1]
        inc     cx      ;за счёт байта длины строки, количество символов увеличивается
        push    ds
        pop     es
        lea     si,     kbdBuffer+1
        mov     di,     bx
        cld
        rep     movsb
@@SkipCopy:
        pop     es
        popf
        pop     di
        pop     si
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
GetStr  endp
 
ShowString      proc
.386
        pusha
        mov     cx,     0
        mov     cl,     String
        lea     si,     String
        add     si,     cx
        mov     byte ptr [si+1],'$'
 
        mov     ah,     09h
        lea     dx,     String+1
        int     21h
 
        popa
        ret
ShowString      endp
 
end     main

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

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