Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с кодом на WinAsm, код для подсчета количеств слов в строке 
:(
    Опции темы
Dimylia
Дата 27.4.2014, 04:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 27.4.2014

Репутация: нет
Всего: нет



 smile    Помогите написать код в программе WinAsm.  Написать программы для подсчета количества слов в строке.  
буду очень признателен. smile 
PM MAIL   Вверх
ФедосеевПавел
Дата 27.4.2014, 06:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: 4
Всего: 10



Начни с чего-нибудь. В пакете masm32 идет множество примеров - консольных и GUI. Как пользоваться WinAsm - на страничке программы.

Не вдаваясь в алгоритм реализуй:
- инициализацию программы
- ввод (или определение константы) строки
- вывод результата (пока - просто текста и произвольного числа из переменной)

Потом берись за разбор строки.

Пока у тебя нет даже каркаса программы - лично мне не интересно продолжать.
Асм не преподают гуманитариям и школьникам.
PM   Вверх
Dimylia
Дата 27.4.2014, 07:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 27.4.2014

Репутация: нет
Всего: нет



Цитата(ФедосеевПавел @ 27.4.2014,  06:53)
Начни с чего-нибудь. В пакете masm32 идет множество примеров - консольных и GUI. Как пользоваться WinAsm - на страничке программы.

Не вдаваясь в алгоритм реализуй:
- инициализацию программы
- ввод (или определение константы) строки
- вывод результата (пока - просто текста и произвольного числа из переменной)

Потом берись за разбор строки.

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

что-то такое ?   
не получается  доделать , а завтра сдавать нужно лабораторную. 
с перемещением  слов  я  справился, все получилось.
а вот подсчитать слова  в  строке  никак . 
вот пробовал что-то 
data SEGMENT 
str1 db 30 dup (?) 
cout db 13,"Vvedite stroku:> ",'$'

data ENDS

code SEGMENT
ASSUME cs:code,ds:data

begin:
mov ax,data
mov ds,ax
mov es,ax

mov ah,09h
mov dx,offset cout
int 21h

mov ah,3fh
lea dx,str1
mov cx,30
mov bx,0 
int 21h
sub ax,2 ;
mov cx,ax ;
xor si,si
xor ax,ax

cld
mov al,' ' ;

lea di,str1 ;

oi: repne scasb ;
jne oi1
inc si ;

jmp oi ;
oi1:
inc si ;
xor ax,ax ;
mov ax,si

xor cx, cx
mov bx, 10
oi2:
xor dx,dx
div bx
push dx
inc cx
test ax, ax
jnz oi2
mov ah, 02h
oi3:
pop dx
add dl, '0'
int 21h
loop oi3

mov ax,4c00h 
int 21h

code ENDS
end begin
PM MAIL   Вверх
ФедосеевПавел
Дата 27.4.2014, 08:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: 4
Всего: 10



А... Так это программа под DOS... Мне даже запустить её не на чем...

Да, похоже на то.

Пока отлаживаешь программу - замени ввод строки на константу
Код
str1 db "Строка из нескольких слов и пробелов"


Сейчас мне нужно отлучиться. Вернусь через несколько часов.

В общих чертах алгоритм такой:

m1:
пропускаем пробелы (в цикле или rep)
пропускаем символы (в цикле или rep)
увеличиваем счетчик слов
jmp m1

Ну там учитываем длину строки в обоих циклах
PM   Вверх
Dimylia
Дата 27.4.2014, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 27.4.2014

Репутация: нет
Всего: нет



Цитата(ФедосеевПавел @ 27.4.2014,  08:04)
А... Так это программа под DOS... Мне даже запустить её не на чем...

Да, похоже на то.

Пока отлаживаешь программу - замени ввод строки на константу
Код
str1 db "Строка из нескольких слов и пробелов"


Сейчас мне нужно отлучиться. Вернусь через несколько часов.

В общих чертах алгоритм такой:

m1:
пропускаем пробелы (в цикле или rep)
пропускаем символы (в цикле или rep)
увеличиваем счетчик слов
jmp m1

Ну там учитываем длину строки в обоих циклах

я через DOSbox  на  windowse 7 запускаю. 
исправил то что ты писал, 

Код

str1 db "slovo slovo"



PM MAIL   Вверх
ФедосеевПавел
Дата 27.4.2014, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: 4
Всего: 10



Я чуть подправил подсчёт слов и временно убрал ввод строки - мне было лень всякий раз её набирать, добавил сегмент стека. Получилось так
Код
data SEGMENT

;str1 db 30 dup (?)
;str1 db " Строка из нескольких символов и пробелов Yes"
str1 db " oo oo oo   oo t     y"
;        0123456789ABCDEF0123456
StrLen db $-str1
cout db 13,"Vvedite stroku:> ",'$'

data ENDS

sstack SEGMENT stack
      db 1024 dup (?)
sstack ENDS


code SEGMENT

ASSUME cs:code,ds:data, ss:sstack

begin:
        mov ax,data
        mov ds,ax
        mov es,ax

        mov ah,09h
        mov dx,offset cout
        int 21h

;        mov ah,3fh
;        lea dx,str1
;        mov cx,30
;        mov bx,0
;        int 21h
;        sub ax,2 ;
;        mov cx,ax ;
;        xor ax,ax
;

        xor si,si ;счётчик слов в строке

        cld
        mov al,' ' ;
        mov cx, 0
        mov cl, StrLen
        lea di, str1 ;

SkipSpaces:
        repe scasb  ;пропускаем пробелы

        or  cx, cx
        jnz  WordFound

;когда строка закончилась - проверим последний символ,
;т.к. cx=0, а di-указывает на следующий за последним символ
;независимо пробел это или нет
        cmp   al, [di-1]
        je    EndOfString

WordFound:
        inc   cx    ;индексы на 1 назад
        dec   di

        repne scasb ;пропускаем символы очередного слова

        inc si      ;увеличиваем счётчик слов

        jcxz  EndOfString

        inc   cx    ;индексы на 1 назад
        dec   di

        jmp SkipSpaces ;
EndOfString:

        xor ax,ax ;
        mov ax,si

        xor cx, cx
        mov bx, 10
oi2:
        xor dx,dx
        div bx
        push dx
        inc cx
        test ax, ax
        jnz oi2
        mov ah, 02h
oi3:
        pop dx
        add dl, '0'
        int 21h
        loop oi3

        mov ax,4c00h
        int 21h

code ENDS
end begin


Я уже и сам забыл как работают цепочечные команды. Все их чудеса хорошо видны под отладчиком - в твоём случае под td.

И это кроме того, что я первый раз под win7 x64 запускаю эмулятор DOS. Раньше у меня была winXP - всё работало без эмуляторов. Поэтому так долго.

Это сообщение отредактировал(а) ФедосеевПавел - 27.4.2014, 22:05
PM   Вверх
Dimylia
Дата 28.4.2014, 05:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 27.4.2014

Репутация: нет
Всего: нет



спасибо большое что помогли ) 

вот сделал так.

Код

#make_COM#
ORG 100H 

JMP START

msg DB 'dima seredyuk', 13, 10
counts DB 0 ,' > slova','$'

START: xor ax,ax
xor dx,dx
mov al,48
mov si,offset msg
sub si,1
start2: 
add si,1 
cmp byte[si],'A'
jae next
jmp nxt_wrd
next: cmp byte[si],'z'
jbe count
jmp nxt_wrd
count: 
add si,1
jmp start2

nxt_wrd: 
add al,1
mov counts,al
cmp byte[si],32
je start2
cmp byte[si],44
je start2
cmp byte[si],13
je screen

screen: add al,1
mov counts,al
xor dx,dx
lea DX,counts
MOV AH, 9
INT 21h

; Exit to operating system:
exit: MOV AH, 4Ch
INT 21h

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0765 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.