Удаление пробелов в начале строки. Из .com в .exe - Assembler
Формулировка задачи:
Пробую переписать программу в exe, не получается
Рабочий вариант в .com формате
Нерабочий вариант в exe формате
Не пойму, что не так. Помогите пожалуйста!
.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.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],'$';
Объяснение кода листинга программы
mov di,offset buffer+2- Переменнаяdiполучает смещение в памяти, где будет записываться результат работы программы. В данном случае, смещение равно2(или 0x2), после чего прибавляетсяoffset buffer(смещение буфера).mov buffer[bx+2],'$'- Записывает символ доллара ($) в буфер по смещениюbx+2. Здесьbuffer- это область памяти, где хранится исходная строка, аbx- это регистр, содержащий индекс текущей позиции в строке.