Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Assembler]Проверка массива на упорядоченность, а также работа со строками 
:(
    Опции темы
Chien
Дата 9.4.2010, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Помогите с двумя задачами, которые нужно переделать.
1.Проверить массив целых чисел на упорядоченность. Ввод, вывод и обработка данных должны быть в виде процедур с параметрами.
     У меня есть эта задача, но там процедуры без параметров, только переделать нужно.

2.Посчитать количество слов в строке, в которых встречается заданный символ. Обязательно использовать стандартные функции работы со строками.
     Эта задача тоже есть, но без процедур работы со строками.

Помогите, пожалуйста. Если, кто-нибудь согласится, скину имеющиеся исходники.


PM MAIL ICQ   Вверх
ИванМ
Дата 9.4.2010, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

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



Chien, сюда выкладывай исходники. И лучше создай две отдельных темы, отдельно под каждую задачу, как и положено на этом форуме. 
PM MAIL   Вверх
Chien
Дата 9.4.2010, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Это 1я задача
Код

.model small    

.stack 100h        ;опредеяем стек

.data            ;сегмент данных
    n=5            ;количество элементов в массиве
    info    db "Проверка массива на упорядоченность.",0dh,0ah,'$'
    mesEnter db "Введите массив:",0dh,0ah,'$'                    
    mesError    db 0ah,0dh,'Ошибка преобразования числа!',0ah,0dh,'$'    

    outbuf  db 4 dup(?),'$'        ;буфер для перевода числа в строку и вывода на экран
    inbuf    db 3,0,3 dup(?),'$'    ;буфер для ввода числа

    mas    db n dup(0)            ;определить массив размера n байт

    ent        db 0ah,0dh,'$'                        ;переход на новую строку
    mesYes    db 0ah,0dh,'Массив упорядочен.',0ah,0dh,'$'    
    mesNo    db 0ah,0dh,'Массив не упорядочен!',0ah,0dh,'$'
.code            

;процедура ввода данных в массив
inputMas proc
    ;вывод массива
        mov ax,0900h            
        mov dx, offset mesEnter    ;адрес выводимой строки, заголовок вывода массива
        int 21h                    
    
        mov cx,n    ;количество элементов
        mov bx,0    ;индекс элемента в массиве
    next_el:
            call readNum        ;счиать число с консоли в al
            mov mas[bx],al    ;сохранить в элемент массива
            mov ax,0900h            ;вывести строку на экран
            mov dx, offset ent        ;адрес выводимой строки
            int 21h                    
            add bx,1                ;перейти к следующему элементу
    loop next_el                    ;продолжить цикл
    ret                ;возврат из процедуры
inputMas endp

;проверка массива на упорядоченность
;результат если упорядочен флаг CF=0, иначе 1
checkMas proc
    mov cx,n-1    ;количество элементов-1
    mov bx,0    ;индекс элемента в массиве
    ;проверка на неубывание
    next_v:*
        mov al,mas[bx]    ;считать элемент массива
        cmp al,mas[bx+1]    ;сравнить со следующим
        ja test_c            ;завершить проверку условие нарушено
        add bx,1            ;перейти к следующему элементу
    loop next_v                ;продолжить цикл
    jmp good                ;массив упорядочен по возрастанию, выход

test_c:
    ;проверка на невозрастание
    mov cx,n-1    ;количество элементов-1
    mov bx,0    ;индекс элемента в массиве
    ;проверка на убывание
    next_n:
        mov al,mas[bx]    ;считать элемент массива
        cmp al,mas[bx+1]    ;сравнить со следующим
        jb bad                ;mas[bx]<mas[bx+1] завершить проверку условие нарушено
        add bx,1            ;перейти к следующему элементу 
    loop next_n                
good:
    clc                ;установить cf=0
    ret                
bad:
    stc                ;установить cf=1
    ret                ;возврат из процедуры
checkMas endp

start:
    mov ax,@data    ;инициализация сегмента данных
    mov ds,ax        

    mov ax,0900h        
    mov dx,offset info    ;адрес выводимой строки
    int 21h                

    call inputMas            ;вызвать процедуры ввода массива

    call checkMas        ;проверка массива на упорядоченность
    jc resNo            ;массив не упорядочен
    mov dx, offset    mesYes    ;загрузить в dx адрес выводисой строки
    jmp printRes            ;переход, на вывод строки результата
resNo:
    mov dx, offset  mesNo ;загрузить в dx адрес выводисой строки

printRes:
;вывод результата
    mov ax,0900h            
    int 21h                        

; вывод на экран массива
    mov cx,n    ;количество элементов
    mov bx,0    ;индекс элемента в массиве
    next_prn:
        mov al,mas[bx]    ;сохранить элемент массива в al
        call printNum        ;вывести al на экран
        mov al," "            ;al=" "
        int 29h                ;вывести на экран al
        add bx,1            ;перейти к следующему элементу
    loop next_prn            ;продолжить цикл    


    mov ax,0700h            ;нефильтрующий консольный ввод без эха 
    int 21h                    
    
    mov ax,4c00h            ;завершить программу, код ошибки 0
    int 21h                    
  
readNum proc ;Ввод числа, размер числа байт, результат в al
    push bx ;поместить используемые регистры в стек
    push cx
    push dx
    push si
    push di
    push bp    
    
    mov si, offset inbuf;адрес буфера ввода
    mov ax,0a00h        ;ввести строку
    mov dx,si            ;буфер ввода
    int 21h

    xor cx,cx            
    inc si                ;перейти к следующему символу в буфере
    mov cl,byte ptr [si];получить количество введенных символов
    jcxz convert_word_err;если ничего не введено то ошибка
    add si,cx            ;встаем на символ младшего разряда числа
    mov ax,1            ;множитеь разряда
    mov bp,10            ;вес 1 разряда
    xor bx,bx            
    mov di,ax            

make_word:    
    mov dl,byte ptr [si];проверить символ на диапазон [0..9] 
    cmp dl,'0'
    jb convert_word_err 
    cmp dl,'9'
    ja convert_word_err 
    and dx,000fh        ;преобразовать символ в цифру    
    mul dx                ;цифру на вес разряда

    test dx,dx            ;проверить что число не превысило слово
    jnz convert_word_err;если введенное число превысило слово, то ошибка

    add bx, ax            ;суммировать к результату
    jc convert_word_err    ;если введенное число превысило слово, то ошибка

    mov ax, di;вычислить вес следующего разряда
    mul bp    ;dx:ax=ax*10
    mov di,ax ;сохранить вес разряда
    dec si      ;перейти к следующему символу
    loop make_word
    mov ax,bx    ;сохраним результат в ax
    pop bp ;извлечь используемые регистры из стека
    pop di
    pop si
    pop dx
    pop cx
    pop bx
    ret        
convert_word_err:
    mov ax,0900h                ;вывести строку на экран
    mov dx,offset mesError    ;адрес выводимой строки
    int 21h                        
    mov ax,0700h            
    int 21h                    
    mov ax,4c00h            ;завершить программу, код ошибки 0
    int 21h                    ;вызов DOS
readNum endp


printNum proc                ;Вывод числа, размер числа байт
    push ax        ;поместить используемые регистры в стек
    push bx
    push si
    push cx

;заполнить буфер пробелами        
    mov cx,4            ;количество элементов в буфере
    mov si,offset outbuf;адрес буфера
space:    
    mov byte ptr [si],' '    ;записать пробел
    inc si            ;перейти к следующему элементу 
    loop space
    
    mov si, offset outbuf[3];адрес буфера для вывода
    mov bx, 10                ;коэффициент для деления
make_str:
    xor ah,ah        ;ah=0
    div bl            ;al=ax/bl
    or ah,30h        ;преобразовать цифру в символ
    dec si            ;перейти к следующему символу
    mov [si],ah        ;сохранить в строке    
    test al, al        ;проверить ax=0
    jnz make_str    ;если не равен, то далее    
    mov ax, 0900h            ;вывести число
    mov dx, offset outbuf    
    int 21h                        
    pop cx            ;извлечь используемые регистры из стека
    pop si
    pop bx
    pop ax    
    ret                    
printNum endp    
    
end start                


Для второй отдельную тему сделаю
PM MAIL ICQ   Вверх
ИванМ
Дата 9.4.2010, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

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



в Macro ASM или Turbo ASM?
PM MAIL   Вверх
Chien
Дата 9.4.2010, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



TASM
PM MAIL ICQ   Вверх
ИванМ
Дата 9.4.2010, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

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



Chien, под процедурой с параметрами имеется ввиду стек? В ассемблере есть 3 вида параметров: через регистры, через стек и через общую память. У вас реализован третий вид. Так что можно сказать задача уже выполнена.
И еще вопрос: это точно нужно под ДОС или все-таки Windows. Потому что во второй задаче сказано делать через стандартные функции. Не совсем понимаю, что под этим понимается в ДОС. А в винде они есть.
PM MAIL   Вверх
airyashov
Дата 9.4.2010, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(ИванМ @ 9.4.2010,  20:37)
Chien, под процедурой с параметрами имеется ввиду стек? В ассемблере есть 3 вида параметров: через регистры, через стек и через общую память. У вас реализован третий вид. Так что можно сказать задача уже выполнена.
И еще вопрос: это точно нужно под ДОС или все-таки Windows. Потому что во второй задаче сказано делать через стандартные функции. Не совсем понимаю, что под этим понимается в ДОС. А в винде они есть.

во второй задачи подразумевается использовать movs, scas,cmps, И прочее, но алгоритм 2-й задачи не расчитан на это никак


--------------------
icq:3(один)7748666
mail:airyashov( а )inbox.ru
PM MAIL   Вверх
ИванМ
Дата 9.4.2010, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

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



airyashov, теперь понятно. Спасибо.
PM MAIL   Вверх
Chien
Дата 9.4.2010, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да, под параметрами подразумевается стек. 
На счет 2й задачи я сама не уверена, что подразумевается под стандартными функциями   smile 
PM MAIL ICQ   Вверх
ИванМ
Дата 11.4.2010, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

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



Лень мне и некогда весь твой код переделывать. Могу просто показать на примере, как из параметров в глобальной памяти переделать в параметры в реестре. Устроит такой вариант?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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