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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.05.2009, 15:46   #1
depocomp
Пользователь
 
Аватар для depocomp
 
Регистрация: 12.05.2009
Сообщений: 14
По умолчанию Помогите вывести строку на экран в обратном порядке(TASM .small)

Здравствуйте!
Помогите пожалуйста с кодом.
TASM тип модели - SMALL
Моя предыдущая программа(работает):
ожидает ввод строки конец ввода <Enter>. По окончании ввода программа должна вывести полученную строку на экран, предварительно осуществив перевод строки (т.е. в результате получить две одинаковые строки друг под другом). Она работает:
Цитата:
include macros.inc ; подключение библиотеки макросов
.model small
.stack 100h
.data
string db 256 dup ('$')
.code
start:
mov ax,@data
mov ds,ax ; загрузка сегментного регистра DS

GetStr string,254 ;ввод произвольной строки
OutStr string ;вывод строки
NextLine ;переход на следующую строку
OutStr string ;вывод строки


mov ah,4ch ; выход из
int 21h ; программы
end start
Надо написать программу, которая также ожидает ввод строки с клавиатуры, а по окончании ввода заменяет последовательность введенных символов на противоположную и выводит на экран.
Например, вводится строка:
QWERTY12345 <Enter>
Программа должна вывести на экран:
54321YTREWQ.
depocomp вне форума Ответить с цитированием
Старый 16.05.2009, 15:47   #2
depocomp
Пользователь
 
Аватар для depocomp
 
Регистрация: 12.05.2009
Сообщений: 14
По умолчанию

Есть еще такое пояснение:
Пояснение. Для приведенного в задании 2 примера после выполнения макровызова
GetStr string,20 символы строки расположатся следующим образом: string[0] = Q
string[1] =W
string[2] =E
string[3] =R
string[4] =T
string[5] =Y
string[6] =1
string[7] =2
string[8] =3
string[9] =4
string[10] =5,
а в регистре АХ будет число введенных символов АХ=11.
Введите еще одну переменную (например. string1 db 256 dup (‘$’) ), в которую перепишите строку string, начиная с последнего символа к первому. После чего выведите string1 на экран дисплея.


А как это сделать не пойму
depocomp вне форума Ответить с цитированием
Старый 16.05.2009, 19:20   #3
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,432
По умолчанию

Вариант без макросов, но это как раз не главное, главное кусок, выделенный как ;это сама замена

Код:
.model small
.stack 100h
.data
string1 db 256 dup ('$')
string2 db 256 dup ('$')
EndStr db 0Dh, 0Ah, '$'
.code
start:
mov	ax, @data
mov	ds, ax

mov ah,0ah
lea dx,string1
mov [string1 + 0], 253
int 21h

; это сама замена
xor ax, ax
mov al, byte ptr [string1+1]
lea di, [string1+2]
lea si, [string2]
add si, ax
dec si
mov cx, ax
next:
mov al, byte ptr [di]
mov byte ptr [si], al
inc di
dec si
loop next
; это сама замена

mov ah,09h
lea dx, EndStr
int 21h
mov ah,09h
lea dx, string2
int 21h

mov	ah,4ch
int	21h
end	start
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 16.05.2009, 19:35   #4
depocomp
Пользователь
 
Аватар для depocomp
 
Регистрация: 12.05.2009
Сообщений: 14
По умолчанию

О, спасибо, работает!
Теперь буду думать как переделать, чтобы были макросы.
depocomp вне форума Ответить с цитированием
Старый 17.05.2009, 11:58   #5
Goblin
Форумчанин
 
Регистрация: 24.11.2007
Сообщений: 196
По умолчанию

Ulex, а какую роль в твоем коде играет эта строка?
Код:
mov [string1 + 0], 253
Goblin вне форума Ответить с цитированием
Старый 17.05.2009, 12:07   #6
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,432
По умолчанию

Цитата:
Ulex, а какую роль в твоем коде играет эта строка?
Цитата:
---------------------------------------------
INT 21 - DOS - BUFFERED KEYBOARD INPUT
AH = 0Ah
DS:DX -> buffer
Note: first byte of buffer must contain maximum length
on entry, second byte contains actual length of previous line which may
be recalled with the DOS line-editing commands
on return the second byte contains actual length, third and
subsequent bytes contain the input line
---------------------------------------------
Максимальная длинна вводимой строки. Я сам сомневался чего тут написать 253 или 254, но там же ещё символ конца строки должен быть, поэтому решил, что 253 будет правильнее.
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 17.05.2009, 12:17   #7
Goblin
Форумчанин
 
Регистрация: 24.11.2007
Сообщений: 196
По умолчанию

Цитата:
---------------------------------------------
INT 21 - DOS - BUFFERED KEYBOARD INPUT
AH = 0Ah
DS:DX -> buffer
Note: first byte of buffer must contain maximum length
on entry, second byte contains actual length of previous line which may
be recalled with the DOS line-editing commands
on return the second byte contains actual length, third and
subsequent bytes contain the input line
---------------------------------------------
А это у тебя откуда цитата? ссылку кинуть можешь? Там наверное много интересного.
Goblin вне форума Ответить с цитированием
Старый 17.05.2009, 12:25   #8
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,432
По умолчанию

http://www.programmersforum.ru/showthread.php?t=17513
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 17.05.2009, 16:34   #9
depocomp
Пользователь
 
Аватар для depocomp
 
Регистрация: 12.05.2009
Сообщений: 14
По умолчанию

Ulex А не могли бы вы расписать коменнтариями в своем коде что и как делается?

А вот макросы, которые использованы в программе и подключаются с помощью файла maсros.inc

Цитата:
; GetStr Buf,MaxLen ################################### #########################
; Ввод строки произвольной длины (функция 0ah int 21h).
; На входе:
; Buf+1 - адрес строки куда будет помещен ввод
; MaxLen - максимальная длина вводимой строки
; На выходе - введенная строка по адресу Buf
; ax - длина введенной строки

GetStr macro Buf,MaxLen
local m,TmpBuf
jmp m
TmpBuf label byte ;временный буфер форматом для функции 0ah (int 21h)
rept MaxLen+3 ;доп. три байта - служебная информация
db ' '
endm
m:
SaveReg <ds,es,dx,cx>
xor cx,cx
mov cs:TmpBuf,MaxLen+1
mov ah,0ah
push ds
pop es
push cs
pop ds
lea dx,cs:TmpBuf
int 21h
mov al,cs:TmpBuf+1 ;пересылка TmpBuf в Buf со сдвигом влево (для удаления служебного символа)
mov cl,al
xor ah,ah
inc cl ;длина введенной строки
inc al ;длина введенной строки
lea si,cs:TmpBuf+2 ;откуда - ds:si
lea di,buf ;куда - esi
rep movsb
LoadReg <cx,dx,es,ds>
endm
Цитата:
OutStr macro str
;Вывод строки на экран.
;На входе - идентификатор начала выводимой строки.
;Строка должна заканчиваться символом '$'.
;На выходе- сообщение на экране.
SaveReg <ax,dx>
mov ah,09h
lea dx,str
int 21h
LoadReg <dx,ax>
endm
Цитата:
; NextLine ################################### ##################################
; Осуществляет переход к следующей строке на дисплее
NextLine macro
SaveReg <ax,dx>
mov ah,2
mov dl,13 ; CR
int 21h
mov dl,10 ; LF
int 21h
LoadReg <dx,ax>
endm
depocomp вне форума Ответить с цитированием
Старый 18.05.2009, 11:24   #10
airyashov
Форумчанин
 
Регистрация: 02.04.2008
Сообщений: 358
По умолчанию

нафига такой макрос
SaveReg <ds,es,dx,cx>
когда можно просто писать
push ds es dx cx
аналогочно для pop
неплохо пишу на ассемблере для 80х86
icq: 3(один)7748666
mail: airyashov(а)inbox.ru
airyashov вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
заданную строку записать в обратном порядке Defa4ka Помощь студентам 1 13.05.2009 11:50
печать страниц в обратном порядке Олекса Microsoft Office Word 4 30.03.2009 09:45
Ввести строку, вывести на экран символы, повторяющиеся в строке более 2 раз. bibl2008 Помощь студентам 4 01.03.2009 13:30
В обратном порядке mari.ha Общие вопросы C/C++ 7 25.12.2008 21:36