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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.01.2010, 15:35   #1
Maemi_IT
 
Регистрация: 05.01.2010
Сообщений: 4
Лампочка Помогите, пожалуйста,с переводом курсора! Времени в обрез

Здраствуйте, уважаемые форумчане !

Вот сделала небольшой курсовой проэкт на 90 %.

Задание:

Найти индексы заданого символа в строке. Строку и символ пользователь вводит сам. В случае успешного поиска установить курсор на позицию посдледнего вхождения искомого символа.


Есть код программы, осуществляющей поиск.Компилятор -TASM. Вверху макрос,что я нашла в интернете, для установки курсора в определенное место экрана. Он закоментирован,т.к. не работает(каретка начинает бегать по экрану). Это не единственный способ, который я пыталась сделать для выполнения этой задачи. Ни один не хочет работать.Возможно, я запуталась с регистрами, но времени почти и нету ,чтобы разобратся.((

может у кого была похожая задача или человек просто понимает Асемблер. очень прошу -помогите! Преподаватель дул курсач перед детальным изучением ассемблера и поэтому очень тяжело разбиратся.

Код:

;kursor macro
;mov ah, 02h
;mov cur,bx
;mov bh, 0
;mov dh, 1 {строка}
;mov dl, cur {столбец}
;int 10h
;endm




.model small
.stack 100h
.data
stroka db 80 dup(?),'$'
symb db ?,' ','$' ; можно и не выделять память для символа
msg_inp db 0ah,0dh,"Vvedite stroku:",0ah,0dh,"$"
msg_in db 0ah,0dh,"Vvedite simvol:",0ah,0dh,"$"
msg db 0ah,0dh,"Simvol ","$"
msg1 db "nayden! Ego index - ","$"
msg_err db "ne nayden.","$"
c10 dw 10
curlen dw ?
.code
start:

mov ax,@data
mov ds,ax
lea dx,msg_inp ; вывод msg_inp
mov ah,09h
int 21h
xor bx,bx ; в bx - индекс вводимого символа

input_loop:
mov ah,01h ; считываем символ
int 21h
cmp al,13 ; если это enter
je for_find ; то конец ввода
mov stroka[bx],al ; иначе записываем символ в строку
cmp bx,80 ; если ввели 80 символов
je for_find ; то конец ввода
inc bx ; увеличиваем bx
jmp input_loop
for_find:
lea dx,msg_in ; вывод msg_in
mov ah,09h
int 21h
mov ah,01h ; ввод нужного символа
int 21h
mov byte ptr symb,al ; сохраняем его в symb
mov cx,bx ; в cx - длина строки
mov curlen,bx
xor bx,bx ; bx - индекс элемента
mov ah,byte ptr symb ; в ah - нужный символ

er: cmp ah,stroka[bx] ; сравниваем текущий элемент с нужным символом
je find ; если совпадают, то jmp на found
jne iter


find:
cmp ah,stroka[bx] ; сравниваем текущий элемент с нужным символом
je vuvod ; если совпадают, то jmp на found
jne next
vuvod :

found: ; если найден символ
lea dx,msg ; вывод msg
mov ah,09h
int 21h
lea dx,symb ; вывод самого символа
int 21h
lea dx,msg1 ; вывод msg1
int 21h
mov ax,bx ; сохраняем индекс в ax
xor cx,cx ; cx - счетчик цифр
number_to_string:
xor dx,dx ; подготовка к делению
div c10 ; деление
add dx,30h ; в dx - ASCII-код остатка от деления
push dx ; сохраняем его в стеке
inc cx ; инкремент счетчика цифр
cmp ax,0 ; цикл, пока частное ненулевое
jne number_to_string
out_index_loop: ; цикл вывода индекса
pop dx ; извелекаем очередную цифру
mov ah,02h ; выводим ее на экран
int 21h
loop out_index_loop
xor cx,cx
mov cx,curlen
mov ah,byte ptr symb ; в ah - нужный символ
next:

inc bx
cmp bx,cx
jne find ;цикл повторяется cx раз
call end_program ; завершить программу

iter:
inc bx
cmp bx,cx
jne er ;цикл повторяется cx раз

lea dx,msg ; если символ не найден, то
mov ah,09h ; вывод msg
int 21h
lea dx,symb ; вывод самого символа
int 21h
lea dx,msg_err ; вывод msg_err
int 21h
call end_program ; завершить программу

end_program proc near
mov ah,4ch
int 21h
end_program endp

end start

Код сильно нелогичен, но работает.

Повторю просьбу: Помогите установить курсор на последнее вхождение символа в строку! буду очень благодарна не за пример,а за функцию конкретно в этой программе! Которая будет работать ))

Заранее спасибо!
Maemi_IT вне форума Ответить с цитированием
Старый 05.01.2010, 16:04   #2
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

не меняя логику программы :
Код:
.model small
	.stack 100h
.data
	stroka db 80 dup(?),'$'
	symb db ?,' ','$' ; можно и не выделять память для символа
	msg_inp db 0ah,0dh,"Vvedite stroku:",0ah,0dh,"$"
	msg_in db 0ah,0dh,"Vvedite simvol:",0ah,0dh,"$"
	msg db 0ah,0dh,"Simvol ","$"
	msg1 db "nayden! Ego index - ","$"
	msg_err db "ne nayden.","$"
	c10 dw 10
	curlen dw ?
	col db 0
	strok db ?
.code
start:
	mov ax,@data
	mov ds,ax
	lea dx,msg_inp ; вывод msg_inp
	mov ah,09h
	int 21h
	mov ah,03
	mov bh,0
	int 10h
	mov col,dh
	xor bx,bx ; в bx - индекс вводимого символа
	
input_loop:
	mov ah,01h ; считываем символ
	int 21h
	cmp al,13 ; если это enter
	je for_find ; то конец ввода
	mov stroka[bx],al ; иначе записываем символ в строку
	cmp bx,80 ; если ввели 80 символов
	je for_find ; то конец ввода
	inc bx ; увеличиваем bx
	jmp input_loop
for_find:
	lea dx,msg_in ; вывод msg_in
	mov ah,09h
	int 21h
	mov ah,01h ; ввод нужного символа
	int 21h
	mov byte ptr symb,al ; сохраняем его в symb
	mov cx,bx ; в cx - длина строки
	mov curlen,bx
	xor bx,bx ; bx - индекс элемента
	mov ah,byte ptr symb ; в ah - нужный символ
	
er:
	cmp ah,stroka[bx] ; сравниваем текущий элемент с нужным символом
	je find ; если совпадают, то jmp на found
	jne iter
	
	
find:
	cmp ah,stroka[bx] ; сравниваем текущий элемент с нужным символом
	je vuvod ; если совпадают, то jmp на found
	jne next
	vuvod :
	
found:
; если найден символ
	lea dx,msg ; вывод msg
	mov ah,09h
	int 21h
	lea dx,symb ; вывод самого символа
	int 21h
	lea dx,msg1 ; вывод msg1
	int 21h
	mov ax,bx ; сохраняем индекс в ax
	mov strok,bl
	xor cx,cx ; cx - счетчик цифр
number_to_string:
	xor dx,dx ; подготовка к делению
	div c10 ; деление
	add dx,30h ; в dx - ASCII-код остатка от деления
	push dx ; сохраняем его в стеке
	inc cx ; инкремент счетчика цифр
	cmp ax,0 ; цикл, пока частное ненулевое
	jne number_to_string
out_index_loop:
; цикл вывода индекса
	pop dx ; извелекаем очередную цифру
	mov ah,02h ; выводим ее на экран
	int 21h
	loop out_index_loop
	xor cx,cx
	mov cx,curlen
	mov ah,byte ptr symb ; в ah - нужный символ
next:
	inc bx
	cmp bx,cx
	jne find ;цикл повторяется cx раз
	mov ah, 02h
	mov bh, 0
	mov dh,col
	mov dl, strok
	int 10h
	mov ah,1
	int 21h
	call end_program ; завершить программу
	
iter:
	inc bx
	cmp bx,cx
	jne er ;цикл повторяется cx раз
	
	lea dx,msg ; если символ не найден, то
	mov ah,09h ; вывод msg
	int 21h
	lea dx,symb ; вывод самого символа
	int 21h
	lea dx,msg_err ; вывод msg_err
	int 21h
	call end_program ; завершить программу
	
end_program proc near
	mov ah,4ch
	int 21h
end_program endp
	
end start
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 05.01.2010, 16:31   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну, позволю себе опубликовать свой вариант...
Код:
.model small
.stack 100h
.data
stroka db 80 dup(' '),'$'
symb db ?,' ','$' ; можно и не выделять память для символа
LastIndex db 0
msg_inp db "Vvedite stroku:",0ah,0dh,"$"
msg_in db 0ah,0dh.0ah,0dh,"Vvedite simvol:",0ah,0dh,"$"
msg db 0ah,0dh,"Simvol ","$"
msg1 db "nayden! Ego index - ","$"
msg_err db "ne nayden.","$"
c10 dw 10
curlen dw ?
.code
start:

  ; очистим экран
  mov ax, 03
  int 10h

  ; курсор установим в начало экрана
  mov ah, 02h
  mov bh, 0
  mov dh, 0
  mov dl, 0
  int 10h


  mov ax,@data
  mov ds,ax
  lea dx,msg_inp ; вывод msg_inp
  mov ah,09h
  int 21h
  xor bx,bx ; в bx - индекс вводимого символа

input_loop:
  mov ah,01h ; считываем символ
  int 21h
  cmp al,13 ; если это enter
  je for_find ; то конец ввода
  mov stroka[bx],al ; иначе записываем символ в строку
  cmp bx,80 ; если ввели 80 символов
  je for_find ; то конец ввода
  inc bx ; увеличиваем bx
  jmp input_loop
for_find:
  lea dx,msg_in ; вывод msg_in
  mov ah,09h
  int 21h
  mov ah,01h ; ввод нужного символа
  int 21h
  mov byte ptr symb,al ; сохраняем его в symb
  mov cx,bx ; в cx - длина строки
  mov curlen,bx
  xor bx,bx ; bx - индекс элемента
  mov ah,byte ptr symb ; в ah - нужный символ

er: cmp ah,stroka[bx] ; сравниваем текущий элемент с нужным символом
  je find ; если совпадают, то jmp на found
  jne iter


find:
  cmp ah,stroka[bx] ; сравниваем текущий элемент с нужным символом
  je found ; если совпадают, то jmp на found
  jne next

found: ; если найден символ
  lea dx,msg ; вывод msg
  mov ah,09h
  int 21h
  lea dx,symb ; вывод самого символа
  int 21h
  lea dx,msg1 ; вывод msg1
  int 21h
  mov ax,bx ; сохраняем индекс в ax
  mov byte ptr LastIndex, al ; запомним последний индекс
  xor cx,cx ; cx - счетчик цифр
number_to_string:
  xor dx,dx ; подготовка к делению
  div c10 ; деление
  add dx,30h ; в dx - ASCII-код остатка от деления
  push dx ; сохраняем его в стеке
  inc cx ; инкремент счетчика цифр
  cmp ax,0 ; цикл, пока частное ненулевое
  jne number_to_string
out_index_loop: ; цикл вывода индекса
  pop dx ; извелекаем очередную цифру
  mov ah,02h ; выводим ее на экран
  int 21h
  loop out_index_loop
  xor cx,cx
  mov cx,curlen
  mov ah,byte ptr symb ; в ah - нужный символ
next:

  inc bx
  cmp bx,cx
  jne find ;цикл повторяется cx раз

  mov ah, 02h
  mov bh, 0
  mov dh, 1 ; текст у нас во 2-й строке (строки от нуля)
  mov dl, byte ptr LastIndex ; загрузим последний индекс
  int 10h

  mov ah,01h ; ввод символа (просто чтобы остановить программу
  int 21h

call end_program ; завершить программу

iter:
  inc bx
  cmp bx,cx
  jne er ;цикл повторяется cx раз

  lea dx,msg ; если символ не найден, то
  mov ah,09h ; вывод msg
  int 21h
  lea dx,symb ; вывод самого символа
  int 21h
  lea dx,msg_err ; вывод msg_err
  int 21h
  call end_program ; завершить программу

end_program proc near
  mov ah,4ch
  int 21h
end_program endp

end start
p.s. так же как и вариант от Goodwin98 - не меняя логику работы... добавил очистку экрана и ожидание нажатия любой клавиши после вывода найденных результатов...

p.p.s. кстати, Maemi_IT, Вы знаете, что в Вашем коде найденные индексы считаются (и выводятся) от нуля?...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.01.2010, 21:05   #4
Maemi_IT
 
Регистрация: 05.01.2010
Сообщений: 4
Радость

Знаю, индексация с нуля. Это не так важно! Спасибо за помощь! надеюсь,получится )
Maemi_IT вне форума Ответить с цитированием
Старый 05.01.2010, 21:13   #5
Maemi_IT
 
Регистрация: 05.01.2010
Сообщений: 4
Смущение

Огромное спасибо вам, великие программисты! )))

Все работает как надо! Сажусь писать записку )))
Maemi_IT вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с переводом HexToBin fedrom Общие вопросы C/C++ 7 24.01.2015 17:21
Помогите с переводом! Nattallia Свободное общение 1 20.09.2009 18:24
Помогите пожалуйста с переводом Delphi на C++ Jupiter Помощь студентам 0 07.07.2009 23:33
как рисовать график в режиме реального времени? помогите пожалуйста Master_S7 Общие вопросы Delphi 2 05.06.2009 22:04
Помогите с переводом формулы SYL@R Помощь студентам 1 25.11.2008 08:37