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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2015, 21:13   #1
Nisekoi
Новичок
Джуниор
 
Регистрация: 25.05.2015
Сообщений: 1
По умолчанию Assembler - Описать близкую процедуру F(X, N, P), определяющую, сколько элементов массива X из N байтов равно байту P

Здравствуйте. Помогите, пожалуйста, решить задачу.
Описать близкую процедуру F(X, N, P), определяющую, сколько элементов массива X из N байтов равно байту P, и возвращающую результат через регистр AL.
Использовать эту процедуру для вычисления
K = F(A, 70, F(B, 30, K))
где A – массив из 70 байтов, B – массив из 30 байтов, а K – байтовая переменная.
Выполнить это упражнение при условии, что параметры передаются переменной через регистры.

решение с передачей через стек:
Код:
include io.asm
STACK_ SEGMENT STACK
DB 100h DUP(?)
STACK_ ENDS
 
 
data segment
a  db 1,2,3,4,5,6,7,8,9,10
   db 11,12,13,4,5,16,17,18,19,20
   db 21,22,22,4,22,22,23,24,25,30
   db 31,32,33,4,5,36,37,38,39,40
   db 41,42,43,44,4,46,47,48,49,50
   db 5,5,5,5,5,56,57,58,59,60
   db 61,62,22,64,65,66,67,68,69,70; Байты
 
 
b  db 1,2,3,4,5,6,7,8,9,10
   db 11,12,13,14,15,6,17,18,22,20
   db 21,22,22,22,22,6,23,24,25,30
 
 
 
data ends
 
 
 
code segment;сегмент кода
assume cs:code,ds:data,ss:stack_;
 
num_eq proc near;Начало процедуры
         push bp    ; предыдущий указатель базы стека в стек
         mov bp,sp  ; текущий адрес вершины стека делаем базой (чтобы адресация параметров не съезжала)
         push dx    ; сохраняем в стеке dx
         push bx    
         push cx    
             mov dl,[bp+4]  ; помещаем в dl третий параметр (значение заданного байта)
             mov cx,[bp+6]  ; (размер массива) 
             mov bx,[bp+8]  ; (адрес начала массива)
             mov ax,0       ; обнуляем счётчик совпадений     
count:  ; начало цикла          
       mov dh,ds:[bx]   ; по текущему адресу массива помещаем dh байт
       cmp dh,dl        ; сравниваем со значением заданного байта
       jne no_eq    ; если не совпадает переход на метку
       inc ax   ; если совпадает увеличиваем счётчик совпадений на 1
no_eq:       
       inc bx  ; увеличиваем текущий адрес массива на 1  
         loop count ; отнимаем от числа проверенных байт еденицу и смотрим результат
         ; если не ноль повторить проврку со следующим байтом из массива
       pop cx ; востанавливаем из стека сохранённый cx
       pop bx    
       pop dx   
       mov sp,bp 
       pop bp
     
       ret;Возврат из процедуры
 
       endp num_eq
 
start:;Начало
mov ax,data
mov ds,ax
 
lea dx,b ; адрес начала массива как первый параметр 
push dx ; в стек
mov dx,30   ; размер массива как второй параметр в стек
push dx 
mov dx,22   ; заданный байт (младшая часть регистра dx (dl)
push dx 
call num_eq ; начало так сказать процедуры
pop dx  ; по выходу из процедуры выравниваем стек выталкивая из него загруженные перед процедурой параметры (третий)
pop dx  ;  (второй)
pop dx  ;  (первый)
 
lea dx,a ; адрес начала массива как первый параметр 
push dx ; в стек
mov dx,70 ; размер массива 
push dx 
push ax ; используемый ранее как счётчик совпадений этот регистр теперь выступает как код заданного символа
call num_eq 
pop dx  ; по выходу из процедуры выравниваем стек выталкивая из него загруженные перед процедурой параметры (третий)
pop dx  ;  (второй)
pop dx  ;  (первый)
 
 
outword ax ; количество символов второго массива 
; совпавших по значению с числом совпавших символов первого массива которые в свою очередь совпали с заданным байтом
 
 
 
MOV AX, 4C00h; 
INT 21h ;End Program
 
code ends
 
end start
Nisekoi вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Описать процедуру sort(x), упорядочивающую по неубыванию числа массива x raviti21 C# (си шарп) 0 23.11.2014 11:21
Дано описание X DD ? описать близкую процедуру OUTW16 Thanat Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 04.06.2014 21:21
Добавить новый элемент массива, если его значение не равно значениям элементов заданного массива ? ассемблер Пиф Помощь студентам 1 09.03.2013 23:35
Написать программу, определяющую количество всех байтов памяти сегмента кода с ненулевыми значениями skorik-1992 Помощь студентам 0 15.01.2013 07:21
Описать процедуру,осуществляющую циклический сдвиг элементов массива на k позиций Bloodpoisoning Общие вопросы C/C++ 0 29.11.2010 15:50