Удаление пробелов в начале строки. Из .com в .exe - Assembler

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

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

Пробую переписать программу в exe, не получается Рабочий вариант в .com формате
.model tiny
.286
.code
org 100h
start:  mov ax,3
    int 10h; очищаю экран
    mov ah,9
    mov dx,offset string1
    int 21h; вывожу строку приглашение
    mov ah,0Ah
    mov dx,offset buffer
    int 21h; получаю строку с клавиатуры
    mov ch,0
    mov al,20h; код пробела
    mov cl,buffer[1]; в СХ количество символов введенных в буфер
    mov bx,cx
    mov di,offset buffer+2
    repe scasb; ищу где заканчиваются пробелы
    dec di  
    mov ah,9
    mov dx,offset string2; вывожу первую половину строки
    int 21h
    mov buffer[bx+2],'$'; там, где заканчивается строка в буфере ставлю '$'
    mov dx,di
    int 21h; вывожу вторую половину строки
    mov ah,0
    int 16h; жду пока не нажмут на клавиатуру
    ret; выхожу из программы
string1 db 'Vvedite frazu(ne bolee 80 simvolov): ',0Dh,0Ah,'$'
buffer db 81,?,81 dup (?)
string2 db 0Dh,0Ah,'Ispravlennaya fraza: $'
end start
Нерабочий вариант в exe формате
.model small; один сегмент кода, данных и стека 
.stack 100h; отвести под стек 256 байт 
.data; начало сегмента данных 
 
string1 db 'Vvedite frazu(ne bolee 80 simvolov): ',0Dh,0Ah,'$'
buffer db 81,?,81 dup (?)
string2 db 0Dh,0Ah,'Ispravlennaya fraza: $'
 
.code 

mov ax,@data ; установка в ds адpеса 
mov ds,ax ; сегмента данных 
    mov ax,3
    int 10h
    mov ah,9
    mov dx,offset string1
    int 21h; вывожу строку приглашение
    mov ah,0Ah
    mov dx,offset buffer
    int 21h; получаю строку с клавиатуры
    mov ch,0
    mov al,20h; код пробела
    mov cl,buffer[1]; в СХ количество символов введенных в буфер
    mov bx,cx
    mov di,offset buffer+2
    repe scasb; ищу где заканчиваются пробелы
    dec di  
    mov ah,9
    mov dx, offset string2; вывожу первую половину строки
    ;add dl, '0'
    int 21h
    mov buffer[bx+2],'$'; там, где заканчивается строка в буфере ставлю '$'
    mov dx,di
    int 21h; вывожу вторую половину строки
    mov ah,0
    int 16h; жду пока не нажмут на клавиатуру
    
    .exit(0)
    end
Не пойму, что не так. Помогите пожалуйста!

Решение задачи: «Удаление пробелов в начале строки. Из .com в .exe»

textual
Листинг программы
mov di,offset buffer+2
mov buffer[bx+2],'$';

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

  1. mov di,offset buffer+2 - Переменная di получает смещение в памяти, где будет записываться результат работы программы. В данном случае, смещение равно 2 (или 0x2), после чего прибавляется offset buffer (смещение буфера).
  2. mov buffer[bx+2],'$' - Записывает символ доллара ($) в буфер по смещению bx+2. Здесь buffer - это область памяти, где хранится исходная строка, а bx - это регистр, содержащий индекс текущей позиции в строке.

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

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