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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.07.2009, 21:43   #1
Майки
 
Регистрация: 10.01.2009
Сообщений: 6
По умолчанию Ассемблер(массив)

Помогите реализовать программу на Ассемблере. Суть такова : Дан текст. Определить количество повторяющихся символов и те которые повторяются 2 или 3 раза заменить пробелом.

Вот что я нашел
процудура которая считает кол-во каждого символа (вроде)
Код:
Count1 proc near
        push ax bx si
        push cx dx
        xor bx, bx    
        mov  cx,256
f1:    mov  Arr[bx],00  
        inc  bx             
      loop f1
        pop  dx cx
        mov si, dx 
        xor bx, bx  
a10: mov bl, [si] 
        mov al, Arr[bx] 
        inc al                 
        mov Arr[bx], al	
       inc si	
             
       loop a10
       pop si bx ax
       ret
Ну и замена символов на Паскале:
Код:
var s,s1:string;
    a:set of char;
    i:integer;
begin
writeln('Введите текст');
readln(s);
a:=[];s1:='';
for i:=1 to length(s) do
if not (s[i] in a) then begin
                       a:=a+[s[i]];
                       s1:=s1+s[i];
                      end
   else s1:=s1+' ';
writeln(s1);
end.
Заранее спасибо =)
Майки вне форума Ответить с цитированием
Старый 15.07.2009, 22:06   #2
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

Что то типа этого:
Код:
strlen equ 13         ;длина поля string
string db 'qwrghncmkopdq'
...
cld
mov al,'q'            ; искомый символ
mov cx strlen         ; длина поля
lea di, string        ; адрес поля
repne scab            ; сканируем
jnz n1                ; Символ найден?
dec di                ; Да-уменьшаем адрес
mov byte ptr[di],20h  ; Ставим ваш пробел
n1: ret
xor eax, eax
xchg [eax], eax
MalCer вне форума Ответить с цитированием
Старый 16.07.2009, 17:26   #3
Майки
 
Регистрация: 10.01.2009
Сообщений: 6
По умолчанию

спасибо.
Но пожалуйста можете мне собрать всю программу или выложить похожие на нее. Но плиз те которые можно скомпилировать и посмотреть как работают (тоесть готовые).
Майки вне форума Ответить с цитированием
Старый 16.07.2009, 19:19   #4
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

Цитата:
пожалуйста можете мне собрать всю программу
Конечно могу . Только программа ищет только 1 символ который ввели и заменяет его введенным символом. Я думаю проблем как это исправить не составит.
Вот, кстити, похожее задание http://www.cyberforum.ru/assembler/thread37963.html
Код:
CSEG segment
assume cs:CSEG, es:CSEG, ds:CSEG, ss:CSEG
org 100h
Begin:  
 mov ax, 3
   int 10h

   lea dx, msg_input
   mov ah, 9
   int 21h
   
   lea dx, s
   mov ah, 0Ah ; номер фунции = буфферизованный ввод строки
   int 21h

   lea bx, s
   inc bx
   mov cl, [bx]
   xor ch, ch   ; теперь CX = длина строки
   inc bx
   add bx, cx
   mov al, 0
   mov [bx], al
   
   lea dx, msg_what
   mov ah, 9
   int 21h
   mov ah, 01 ; ввод символа
   int 21h
   mov chr_what, al
   mov bl, al ; сохраним в BL
   
   lea dx, msg_to
   mov ah, 9
   int 21h
   mov ah, 01 ; ввод символа
   int 21h
   mov chr_to, al
   mov bh, al
   
; ищем символ
   lea si, s
   add si, 2
next_char:   
   mov al, [si]
   or  al, al ; это ноль (конец строки)?
   jnz analize ; переход, если не 0
      jmp no_that ; дошли до конца, так и встретили 
analize:      
   cmp al, bl
   je  founded
     inc si
     jmp next_char
founded:    
     mov [si], bh ; заменили - больше ничего делать не надо - просто покажем
     
   lea dx, nextLine
   mov ah, 9
   int 21h
     
; показ преобразованной строки
   lea dx, s
   add dx, 2 ; пропускаем байты длины
   mov ah, 40h
   mov bx, 1 ; стандартый вывод
push cx ; сохраним CX на всяк случай
   int 21h
pop  cx  ; восстановим CX, хотя он так и не пригодился 
   jmp exit
   
 no_that:   
   lea dx, msg_no_that
   mov ah, 9
   int 21h

 exit:
  lea dx, PressKey
  mov ah,9
  int 21h

  xor ax, ax
  int 16h

  int 20h
  
msg_input  db 'Введите строку символов длиной не более 20 символов:',13,10,'$'  
s          db 20, 20 dup (?)

msg_what   db 13,10,'Введите символ, который нужно заменить: $'
chr_what   db ?
msg_no_that db 13,10,'Заданный символ в строке не содержится!$'
msg_to     db 13,10,'Введите символ, на который нужно заменить этот символ: $' 
chr_to     db ?

NextLine   db 13,10,'$'
PressKey   db 13,10,'Нажмите любую клавишу ...$'
CSEG ends
end Begin
xor eax, eax
xchg [eax], eax
MalCer вне форума Ответить с цитированием
Старый 16.07.2009, 20:10   #5
Майки
 
Регистрация: 10.01.2009
Сообщений: 6
По умолчанию

Спасибо! Это то чно нужно, только проблема что не компилируется не одна из них. В первой на экране множество символов, а во второй вообще экзешник не создается(
Майки вне форума Ответить с цитированием
Старый 16.07.2009, 20:15   #6
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

Майки, все там работает. Я проверял. Компилировал на TASM'е как com прогу(tasm proga.asm и затем tlink proga.obj/t)
Цитата:
В первой на экране множество символов
Я так понял это в моей проге. Это потому что нужно делать в кодировке DOS, а не Виндоус
замените тогда так:
Код:
msg_input  db '‚ўҐ¤ЁвҐ бва®Єг ¤«Ё*®© *Ґ Ў®«ҐҐ 20 бЁ¬ў®«®:',13,10,'$'  
s          db 20, 20 dup (?)
msg_what   db 13,10,'‚ўҐ¤ЁвҐ бЁ¬ў®«, Є®в®ал© *г¦*® §*¬Ґ*Ёвм: $'
chr_what   db ?
msg_no_that db 13,10,'‡*¤***л© бЁ¬ў®« ў бва®ЄҐ *Ґ ᮤҐа¦Ёвбп!$'
msg_to     db 13,10,'‚ўҐ¤ЁвҐ бЁ¬ў®«, ** Є®в®ал© *г¦*® §*¬Ґ*Ёвм нв®в бЁ¬ў®«: $' 
chr_to     db ?
NextLine   db 13,10,'$'
PressKey   db 13,10,'Ќ*¦¬ЁвҐ «оЎго Є«*ўЁиг ...$'
и закорючек не будет
xor eax, eax
xchg [eax], eax

Последний раз редактировалось MalCer; 16.07.2009 в 20:23.
MalCer вне форума Ответить с цитированием
Старый 16.07.2009, 20:33   #7
Майки
 
Регистрация: 10.01.2009
Сообщений: 6
По умолчанию

не у меня всеравно такое(( Может из-за того что компилирую masm.exe?
Майки вне форума Ответить с цитированием
Старый 16.07.2009, 20:49   #8
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

тогда весь код расположи между этими строками:
Код:
.model tiny
.code
org 100h
Begin:  
; тут будет код
end Begin
Я пожалуй выложу весь пример с com файлом
Вложения
Тип файла: rar прога.rar (1.3 Кб, 16 просмотров)
xor eax, eax
xchg [eax], eax
MalCer вне форума Ответить с цитированием
Старый 16.07.2009, 21:03   #9
Майки
 
Регистрация: 10.01.2009
Сообщений: 6
По умолчанию

Спасибо =)
Можешь напоследок скинуть tasm и tlink )
Майки вне форума Ответить с цитированием
Старый 16.07.2009, 21:07   #10
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

Ды я ж тебе на Масме пример дал! Ну если ты так хочешь, то вот TASM 5.0
xor eax, eax
xchg [eax], eax
MalCer вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ассемблер SWEET_15 Помощь студентам 3 06.09.2016 08:45
Ассемблер maziLa Помощь студентам 2 14.07.2009 09:25
Ассемблер и массив NSvirus Фриланс 1 29.06.2009 22:51
Ассемблер InTest Фриланс 1 12.12.2007 02:05