Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.10.2010, 21:56   #1
МартинИ
Пользователь
 
Аватар для МартинИ
 
Регистрация: 23.12.2008
Сообщений: 47
По умолчанию Задача с постусловием

задача такова: 1) ввод до 256 символов в организованный в памяти буфер, ограниченный длиной буфера или нажатием клавиши Enter.
2) вывод первой половины буфера с помощью постусловия.

с 1 частью задачи я справилась, а вот со 2 ниче не понимаю

Код:
; Standard header:
	#make_COM#
        ORG  100H  

; Jump to start:
	JMP START

; Data:
BUFFER  DB 256 DUP(0)



START:  
        MOV CX, 0; обнуление счетчика
        MOV DI, OFFSET BUFFER; запись в DI адреса начала буфера
                
LABEL1: MOV AH, 01h; начало цикла
       INT 21h; ввод символов
       MOV BYTE PTR[DI], AL; запись прочитаного символа в текущее поожение в буфере
       INC DI; предвижение буфера
       INC CX; увеличение счетчика
       CMP CX, 256; проверка выхода за границы буфера
       CMP AL, 0Dh; проверка нажатия Enter
       JNE LABEL1; переход в начало цикла
LABEL2: 
        
        JLE LABEL2; постусловный цикл =(

; Print using DOS interrupt:
        MOV AH, 9
        INT 21h
; Exit to operating system:
        MOV AH, 4Ch
        INT 21h
Люди - отвратительные. Эгоистичные. Шумные. Говорят ерунду. А подумав еще немножко, понимаешь, что ты абсолютно такой же, если не хуже...
МартинИ вне форума Ответить с цитированием
Старый 26.10.2010, 00:05   #2
Vergo
Пользователь
 
Регистрация: 20.09.2010
Сообщений: 38
По умолчанию

А зачем такие сложности с вводом? Функция 0ah делает все то же самое, только автоматически.

Постусловие - условие, истинность которого проверяется после выполнения тела цикла или процедуры.

Видимо цикл DO ... WHILE имеется ввиду.
Vergo вне форума Ответить с цитированием
Старый 26.10.2010, 00:11   #3
МартинИ
Пользователь
 
Аватар для МартинИ
 
Регистрация: 23.12.2008
Сообщений: 47
По умолчанию

Цитата:
Сообщение от Vergo Посмотреть сообщение
А зачем такие сложности с вводом? Функция 0ah делает все то же самое, только автоматически.

Постусловие - условие, истинность которого проверяется после выполнения тела цикла или процедуры.

Видимо цикл DO ... WHILE имеется ввиду.
ну как научи - так и делаю ввод
да, именно этот вид цикла, только вроде бы в ассеблере нет DO ... WHILE
Люди - отвратительные. Эгоистичные. Шумные. Говорят ерунду. А подумав еще немножко, понимаешь, что ты абсолютно такой же, если не хуже...
МартинИ вне форума Ответить с цитированием
Старый 26.10.2010, 00:15   #4
Vergo
Пользователь
 
Регистрация: 20.09.2010
Сообщений: 38
По умолчанию

В ассемблере есть все, только своими руками

Применительно к вашей задаче:
сначала делаете вывод очередного символа, а потом проверяете, половина уже выведена или еще нет.
Vergo вне форума Ответить с цитированием
Старый 26.10.2010, 00:30   #5
МартинИ
Пользователь
 
Аватар для МартинИ
 
Регистрация: 23.12.2008
Сообщений: 47
По умолчанию

Цитата:
Сообщение от Vergo Посмотреть сообщение
В ассемблере есть все, только своими руками

Применительно к вашей задаче:
сначала делаете вывод очередного символа, а потом проверяете, половина уже выведена или еще нет.
логику поняла, а как организовать вывод по символу из буфера?
Люди - отвратительные. Эгоистичные. Шумные. Говорят ерунду. А подумав еще немножко, понимаешь, что ты абсолютно такой же, если не хуже...
МартинИ вне форума Ответить с цитированием
Старый 26.10.2010, 00:39   #6
Vergo
Пользователь
 
Регистрация: 20.09.2010
Сообщений: 38
По умолчанию

Это вторая функция DOS 21h (ah=02h). В регистр dl нужно поместить код символа.

Код:
mov dl, byte ptr [di]
mov ah, 02h
int 21h
Далее делаете проверку и при положительном результате (т.е. половина еще не выведена) увеличиваете DI и повторяете цикл.

Кстати, отсчитать половину в вашем случае можно достаточно просто - сдвинуть вправо регистр-счетчик CX. Итого получим:

Код:
; Standard header:
	#make_COM#
        ORG  100H  

; Jump to start:
	JMP START

; Data:
BUFFER  DB 256 DUP(0)

START:  
        MOV CX, 0; обнуление счетчика
        MOV DI, OFFSET BUFFER; запись в DI адреса начала буфера
                
LABEL1: 
	MOV AH, 01h; начало цикла
	INT 21h; ввод символов
	MOV BYTE PTR[DI], AL; запись прочитаного символа в текущее поожение в буфере
	INC DI; предвижение буфера
	INC CX; увеличение счетчика
	CMP CX, 256; проверка выхода за границы буфера
	CMP AL, 0Dh; проверка нажатия Enter
	JNE LABEL1; переход в начало цикла
LABEL2:	
	shr cx, 1
	mov di, offset BUFFER
	mov dl, 0Dh
	mov ah, 02h
	int 21h
	mov dl, 0Ah
	mov ah, 02h
	int 21h
LABEL3:
	mov dl, byte ptr [di]
	mov ah, 02h
	int 21h

	inc di
	loop LABEL3

; Exit to operating system:
        MOV AH, 4Ch
        INT 21h
А если вы хотите использовать для вывода функцию 09h, как написано у вас в коде
Цитата:
; Print using DOS interrupt:
MOV AH, 9
INT 21h
то нужно поставить символ $ посредине буфера. Смещение высчитывается тоже через половинку CX. Но такой вариант уже вряд ли можно назвать "с постусловием".

Последний раз редактировалось Stilet; 26.10.2010 в 09:17.
Vergo вне форума Ответить с цитированием
Старый 26.10.2010, 01:13   #7
МартинИ
Пользователь
 
Аватар для МартинИ
 
Регистрация: 23.12.2008
Сообщений: 47
По умолчанию

ой, большое спасибо))) единственное, что я не догадлась, что можно просто сдвинуть регистр, чтоб была половина.... высчитывала

а вот про LABEL2.
Код:
shr cx, 1; сдвиг регистра СХ вправо
mov di, offset BUFFER;  запись в DI адреса начала буфера
mov dl, 0Dh; проверка положения курсора???
mov ah, 02h; изменение положения курсора???
	int 21h
	mov dl, 0Ah;  запись символа в текущей позиции экрана??
	mov ah, 02h; ??
	int 21h
Люди - отвратительные. Эгоистичные. Шумные. Говорят ерунду. А подумав еще немножко, понимаешь, что ты абсолютно такой же, если не хуже...

Последний раз редактировалось Stilet; 26.10.2010 в 09:18.
МартинИ вне форума Ответить с цитированием
Старый 26.10.2010, 07:59   #8
Vergo
Пользователь
 
Регистрация: 20.09.2010
Сообщений: 38
По умолчанию

Там просто перед циклом сделан переход на другую строку (вывод символов 0D и 0A). Иначе информация выводилась бы поверх первой.
Vergo вне форума Ответить с цитированием
Старый 10.11.2010, 09:57   #9
МартинИ
Пользователь
 
Аватар для МартинИ
 
Регистрация: 23.12.2008
Сообщений: 47
По умолчанию

а не подскажите, как вывести вторую половину буфера?
чтоб например, 1234, а выводило - 34
Люди - отвратительные. Эгоистичные. Шумные. Говорят ерунду. А подумав еще немножко, понимаешь, что ты абсолютно такой же, если не хуже...
МартинИ вне форума Ответить с цитированием
Старый 10.11.2010, 17:13   #10
Vergo
Пользователь
 
Регистрация: 20.09.2010
Сообщений: 38
По умолчанию

Внесите небольшое изменение:

Код:
LABEL2:	
	shr cx, 1
	mov di, offset BUFFER

	add di, cx   ;  <--   ДОБАВЛЕНА СТРОКА

	mov dl, 0Dh
Выводится вторая половина буфера.
Vergo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Цикл с постусловием vika030592 Паскаль, Turbo Pascal, PascalABC.NET 2 10.06.2010 21:08
Не могу разобратся с постусловием ArteMAN Паскаль, Turbo Pascal, PascalABC.NET 8 23.04.2010 23:28
Оператор цикла с постусловием (WHILE) RUSSTUDENT Помощь студентам 4 27.01.2010 16:51
Цикл с постусловием chistayastranichka Помощь студентам 1 28.05.2009 23:52
Цикл с постусловием. Алгоритм Евклида. BioVis Паскаль, Turbo Pascal, PascalABC.NET 5 31.10.2008 16:29