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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.04.2011, 00:28   #1
koshkarjov
Пользователь
 
Аватар для koshkarjov
 
Регистрация: 31.01.2009
Сообщений: 26
Восклицание [Assembler] Массив

Доброго времени суток!
Помогите пожалуйста в написании программы.

Задание:
Входные данные передаются в подпрограмму через стек, а результат возвращается через регистр AL.
Для массивов входными данными являются адрес массива и число элементов в нем.
Необходимо подсчитать сумму ненулевых элементов массива.

Большое спасибо!
koshkarjov вне форума Ответить с цитированием
Старый 16.04.2011, 12:58   #2
VKorablev
Форумчанин
 
Аватар для VKorablev
 
Регистрация: 14.04.2011
Сообщений: 126
По умолчанию

сами то попытались хоть чтонить сделать? если да то покажите код
Нам больше не нужно смотреть на мир сквозь замочную скважину 64Кб сегмента (с) ВалИк
VKorablev вне форума Ответить с цитированием
Старый 20.04.2011, 01:23   #3
koshkarjov
Пользователь
 
Аватар для koshkarjov
 
Регистрация: 31.01.2009
Сообщений: 26
Восклицание

Пытался
Код:
ASSUME CS:kom, SS:stek, DS:dan	; описание сегментов
;сегмент кода
kom     SEGMENT
; сегмент данных
dan     SEGMENT
mas     DW 2,1,0,2,4,0,1,3,6,1,4,1	; массив чисел
koli     DW 12	; количество элементов массива
max     DW ?	;переменная для хранения максимального элемента
ind     DW ?	; переменная для хранения индекса этого элемента
dan     ENDS

; главная функция
main    PROC FAR
        MOV AX,dan	; записываем адрес данных в ax
        MOV DS,AX	; записываем адрес данных из ax  в сегмент данных
        MOV AX,stek	; записываем адрес стека в ax
        MOV SS,AX	; записываем адрес стека из ax в сегмент стека
        PUSH BP	; сохраняем старый адрес возврата
        MOV BP,SP	; BP=SP адрес кадра стека    
caller:
       	; ввод параметров процедуры в стек              
        MOV AX, koli	; количество элементов - счетчик цикла
        PUSH AX	; суем в стек
        LEA BX,mas	; адрес массива
        PUSH BX	; суем в стек   
        CALL summa	; вызов функции поиска максимального элемента
vyvod: 		  
        MOV AX,max	; берем значение максимального элемента массива
        PUSH AX	; отправляем в стек
        MOV AX,10	; задаем базу – десятеричная система
        PUSH AX	; отправляем в стек базу
        CALL kod	; вызываем функцию вывода чисел 
        MOV BX,'#'	; берем символ 
        PUSH BX	; заталкиваем его в стек
        CALL putchar	; вызываем функцию вывода символа
        MOV AX,ind	; берем индекс максимального элемента
        PUSH AX	; кидаем индекс в стек
        MOV AX,10	; выводим его как десятеричное число
        PUSH AX	; для этого отправляем как параметр
        CALL kod	; функции вывода числа                       
exit:   xor AX,AX	; обнуляем ax
        MOV AH,4cH	; выход в DOS
        INT 21H	; передача управления в DOS 
main    ENDP

; процедура поиска суммы ненулевых элементов массива
summa  PROC	; объявление процедуры
ike     EQU -2[BP]	; локальная переменная будет храниться в стеке 
        PUSH  BP	; сохранить старое значение BP в стек
        MOV BP,SP	; BP=SP - устанавливаем указатель на базу
b1:        
        mov CX,6[BP]	; количество элементов массива 
        mov BX,4[BP]	; адрес массива
        mov si,0	; индекс - номер элемента храним в si  
        mov sum,0
b2:
        mov dx,BX[si]	; текущий элемент массива в dx
        cmp dx,0 	; сравниваем текущий с 0
        jbe  b4                                            ; >= тогда в конец цикла, к следующему числу
        and dx,0                                        ; 
        cmp dx,0
         jne b4                                            ; >= тогда в конец цикла, к следующему числу
b3:	
        mov ax,sum	 
        add ax,BX[si]			
        mov sum,ax                                  ; увеличиваем сумму

b4:        
        add si,2 	; увеличиваем индекс на длину элемента 
        dec cx	; уменьшаем счетчик цикла
        jcxz vyhod	; cx=0? Если да - на выход
        jmp b2	; нет - повторить цикл сравнения 
vyhod: 
        POP  BP	; восстанавливаем BP
        RET  6	; возврат с удалением параметров из стека
summa ENDP

; процедура вывода строчного символа
putchar PROC
        PUSH BP	; сохранить старое значение BP в стек
        PUSH AX	; 
        PUSH DX	; 
        MOV BP,SP	; BP=SP
        MOV DL,8[BP]	; 
        MOV AH,2	; 2 - вывод символа на экран
        INT 21H	; передача управления в DOS 
        POP DX	; вытолкнуть из стека DX
        POP AX	; вытолкнуть из стека AX
        POP BP	; восстанавливаем адрес возврата
        RET 2	; 
putchar ENDP
; процедура вывода числа в десятеричной форме
kod     PROC
x       EQU 6[BP]	; локальная переменная x в стеке
baza    EQU 4[BP]	; локальная переменная baza в стеке
y       EQU -2[BP]	; локальная переменная y в стеке
        PUSH BP	; сохранить старое значение BP
           MOV BP,SP	; BP=SP адрес кадра стека
        SUB SP,2	; SP=SP-2
        MOV AX,x	; 
        CWD 	; 
        IDIV WORD PTR baza	; 
        MOV y,AX	; 
        CMP AX,0	; 
        JE m1	; 
        MOV AX,y	; 
        PUSH AX	; 
        MOV AX,baza	; 
        PUSH AX	; 
        CALL kod	; рекурсия
m1:     MOV AX,x	; 
        CWD
        IDIV WORD PTR baza
        ADD DX,'0'	; 
        PUSH DX	; 
        CALL putchar	; вызов процедуры вывода символа на экран
        ADD SP,2	; переходим на 1 вниз
        POP BP 	; восстановление адреса возврата
        RET 4	; возврат с удалением параметров (4 ячейки)
kod     ENDP
kom     ENDS	; завершение сегмента кода

; сегмент стека
stek    SEGMENT STACK 
        DW 1000 DUP(?)	; создается пустая область из 1000 слов стек
; dnost   EQU $	; символ конца строки
stek    ENDS
        END main
Подозреваю, что очень сильно накосячил в самой процедуре поиска суммы ненулевых элементов массива

P.S.: Компилятор TASM

Последний раз редактировалось koshkarjov; 20.04.2011 в 02:39. Причина: добавил компилятор
koshkarjov вне форума Ответить с цитированием
Старый 20.04.2011, 22:22   #4
VKorablev
Форумчанин
 
Аватар для VKorablev
 
Регистрация: 14.04.2011
Сообщений: 126
По умолчанию

поправьте меня если не прав, но разве стек безграничен?)
Нам больше не нужно смотреть на мир сквозь замочную скважину 64Кб сегмента (с) ВалИк
VKorablev вне форума Ответить с цитированием
Старый 23.04.2011, 00:33   #5
koshkarjov
Пользователь
 
Аватар для koshkarjov
 
Регистрация: 31.01.2009
Сообщений: 26
Восклицание

Эмм... Вроде нет
koshkarjov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массив Assembler Leon4eg Фриланс 5 31.03.2010 14:23
assembler массив байтов AlexandrHouse Помощь студентам 5 01.02.2010 19:03
Задача про массив на Assembler натаха Помощь студентам 2 20.12.2009 18:57
Одномерный массив на Assembler Кузеныш Помощь студентам 1 16.12.2009 12:02
[Assembler] Одномерный массив rule-z Помощь студентам 4 03.04.2009 09:10