Поменять регистр в буквах вводимой строки - Assembler

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

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

Помогите, пожалуйста, с программой. Нужно использовать упрощенный директивы сегментации, написать и забить в com-файл прогу, меняющую регистр в буквах вводимой строки. В принципе, все написано, но есть ошибки: 1) количество символов (2-й элемент в введенной через 0Ah DOS функцию строке) не записывается в регистр CX. 2)какая-то ошибка в конце программы со start. 3)проблемы c изменением сегмента данных: @data не определяется. Не судите строго, до этого только с Debug'ом дело имел. Компилировал в MASM'е.
.model small
.data
    string db 20,?,20 dup ('$')
 
.code
org 100h
 
start:
    mov ax, @data
    mov ds, ax
    lea dx, string % ввод строки
    mov ah, 0Ah
    int 21h
    mov cx, [string + 1] % запись реальной длины строки в счетчик CX
    lea bx, string + 2 % запись адреса первого элемента введенной строки в счетчик BX
    call symbol_process % проход по строке
 
mov ah, 4Ch %
int 21h
 
symbol_process:
    mov dl,byte ptr [BX] % посимвольное считывание строки в регистр
    cmp dl,7bh % сравнение кода символа с диапазонами прописных букв, строчных букв и остальных символов в ASCII-таблице
    jge output
    call stroch1
    cmp dl, 5bh
    jge output
    call zaglav1
    cmp dl,41h
    jl output
    ret
    
stroch1:
    cmp dl,61h
    jge stroch2
    ret
 
stroch2:
    sub dx,20h % делает букву прописной
    call output
    ret
 
zaglav1:
    cmp dl,41h
    jge zaglav2
    ret
 
zaglav2:
    add dx,20h % делает букву строчной
    call output
    ret
 
output: % вывод символа и переход к следующему символу
    mov ah, 2h
    int 21h
    inc bx
    loop symbol_process
    ret

end start

Решение задачи: «Поменять регистр в буквах вводимой строки»

textual
Листинг программы
;fasm code
;-----------------
org  100h
jmp  start
 
mess0   db  13,10,'String: $'
mess1   db  13,10,'Result: '
buff    db  80 dup('$')        ; буфер для строки
 
start:  mov   ah,9             ; запрос на ввод
        mov   dx,mess0
        int   21h
 
        mov   di,buff          ; приёмник для строки
        mov   ah,1             ; ввод с эхом
input:  int   21h
        cmp   al,13            ; Enter - закончить ввод
        je    stop
 
        mov   bl,al            ; символ в BL
        sub   bl,41h           ;
        cmp   bl,7Fh           ; фильтр только символов
        ja    next             ; если цифры или знаки
        xor   al,20h           ; инверсия регистра символа!
next:   stosb                  ; записать символ в буфер
        jmp   input            ; на повтор..
 
stop:   mov   ah,9             ; выводим результат на экран
        mov   dx,mess1
        int   21h
 
        xor   ax,ax            ; выход в DOS
        int   16h
        int   20h

Объяснение кода листинга программы

На языке Assembler был написан код, который выполняет следующие действия:

  1. Запрос на ввод строки - пользователь вводит строку в буфер buff.
  2. Проверка на завершение ввода - если пользователь нажимает Enter, код переходит к этапу stop.
  3. Фильтрация символов - из буфера buff удаляются все символы, кроме цифр и знаков.
  4. Инверсия регистра символа - каждый символ в буфере buff инвертируется.
  5. Вывод результата на экран - на экран выводится результат в формате Result: с инвертированными символами.
  6. Выход в DOS - программа завершается.

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

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