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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.11.2012, 17:48   #1
wicorange
Новичок
Джуниор
 
Регистрация: 02.11.2012
Сообщений: 3
По умолчанию Проверка на четность

Сформировать одномерный массив A{ai} (i=1..30) (i меняется от 1 до 30)
Элементы ai массива A вычисляются по формуле:
ai = |(i*15)/7 - (i/2 + i*3)|
Найти и напечатать минимальный элемент в массиве А.
На основе массива А сформировать новый массив В, куда поместить все четные элементы.
Напечатат ьмассив В.

Проблема в том что он выводит в массиве В только 1 четный элемент а осталные нет.

Вот код программы:


mystack segment stack 'stack' ; сегмент стека mystack
db 100 dup (?)
mystack ends ; конец сегмента стека mystack

mydata segment public 'data' ; сегмент данных mydata
mesBegin db 'Программа выполняется...', 0Dh, 0Ah, '$'
mesEnd db 'Программа завершила свою работу...', 0Dh, 0Ah, '$'
mesVar db '00000'
endVar db ' $'
newline db 0Dh, 0Ah, '$' ; перевод строки
A dw 30 dup (0) ; массив A
B dw 30 dup (0) ; массив B
elem db ?
min dw ? ; минимальный элемент в массиве А
two db 2 ; константа 2
three db 3 ; константа 3
ten dw 10 ; константа 10
nstr dw 10 ; количество выводимых чисел в одной строке
osn1 dw 10
str2 db 9,?,7 dup(' '), '$'
mes2 db "Naimen'shee chislo massiva:$"
mydata ends ; конец сегмента данных mydata

mycode segment public 'code' ; сегмент кода mycode
assume cs:mycode, ds:mydata
start:
mov ax, mydata
mov ds, ax

mov dx, offset mesBegin ; выводим сообщение о
mov ah, 09h ; запуске программы
int 21h

; вычисление элементов массива
mov cl, 15 ; на это умножаем
mov ch, 7 ; на это делим
mov di, 1 ; порядковый номер элемента
mov si, 0 ; доступ к элементу в массив
nexti:
mov ax, di ; берем i-ый элемент
mul cl ; умножаем на 15
div ch ; делим на 7
xor ah, ah ; обнуляем остаток от деления
mov [A+si], ax ; запоминаем пока (i*15)/7

mov ax, di ; теперь вычисляем
div two ; i/2
xor ah, ah ; обнуляем остаток от деления
mov bx, ax ; запоминаем для дальнейшего суммирования

mov ax, di ; теперь вычисляем
mul three ; i*3
add bx, ax ; теперь суммируем i/2 + i*3

mov ax, [A+si] ; берем вычисленный (i*15)/7
sub ax, bx ; вычитаем (i/2 + i*3)
jns noneg ; если результат положительный, то переход
neg ax ; иначе изменяем знак на положительный
noneg:
mov [A+si], ax ; запоминаем вычисленное значение в массиве
add si, 2 ; указываем на следующий элемент в массиве
inc di ; берем следующий i
cmp di, 31 ; если i меньше 31, то переходим на
jl nexti ; вычисление следующего i-го элемента
;/////////////////////////////////////////////////////////////////
;poisk naimenhego
mov di, 1 ; порядковый номер элемента
mov si, 0 ; доступ к элементу в массив
mov ax,di
add si,2
mov min,ax
c1: mov ax,[si]
inc si
cmp ax,min
jl met2


met2: loop c1
;//////////////////////////////////////////////////////////////////
;poisk na 4etnost'
mov si,0

mov cx,30
cikl: mov bx,[A+si]

test bx,1

jz vivodB

add si,2
loop cikl
vivodB:
mov [B+si],bx

add si,2

;/////////////////////////////////////////////////////////////////
wicorange вне форума Ответить с цитированием
Старый 02.11.2012, 17:49   #2
wicorange
Новичок
Джуниор
 
Регистрация: 02.11.2012
Сообщений: 3
По умолчанию

; вывод элементов массива на экран
; в десятичном виде
mov si, 0 ; для доступа к элементам массива
mov di, 1 ; индекс элемента
nextNumber:
mov cx, 5 ; столько раз делим на 10
mov ax, [B+si] ; берем расчитанное число
mov bx, offset endVar ; это за концом строки для вывода числа
dec bx ; это конец строки для вывода числа
nextC:
xor dx, dx ; обнуляем DX
div ten ; делим элемент на 10
add dx, 48d ; прибавляем к остатку 48 (код нуля)
mov ds:[bx], dl ; кладем в конец строки для вывода на экран
dec bx
loop nextC ; получим число следующего порядка

mov bx, offset mesVar ; далее удаляем первые нули из строки вывода
mov cx, 4 ; максимум удаляется 4 символа
delzero:
mov al, ds:[bx] ; берем число
cmp al, '0' ; если это не ноль, то выходим
jnz enddelzero
mov al, ' ' ; иначе туда кладем код пробела
mov ds:[bx], al
inc bx ; следующее число в строке вывода
loop delzero
enddelzero:

mov dx, offset mesVar ; напечатаем преобразованное
mov ah, 09h ; к десятичному виду расчитанное число
int 21h

; это нужно для того, чтобы в строку выводить по 10 элементов
dec nstr ; изначально это равно 10
jnz nonewline
mov nstr, 10 ; если 10 элементов напечатали,
mov dx, offset newline ; то переходим на новую строку
mov ah, 09h
int 21h
nonewline:

add si, 2 ; берём следующий элемент из массива
inc di
cmp di, 31
jl nextNumber

mov dx, offset mesEnd ; выводим сообщение о выходе
mov ah, 09h ; из программы
int 21h
exit:
;Vyvod minimal'nogo 'lementa massiva A
xor si,si
xor ax,ax
xor bx,bx
xor cx,cx
pop cx
mov si,cx
mov cx,16
mov ax,min
conv2: cwd
div osn1
or dl,30h
mov str2[si],dl
dec si
loop conv2

xor si,si
mov ah,09h
lea dx,mes2
int 21h



mov ah,09h
lea dx,str2
int 21h
mov ah,08h
int 21h
mov ah, 4Ch ; выход из программы
mov al, 00h ; с кодом возврата 'ноль'
int 21h
mycode ends ; конец сегмента кода mycode
end start
wicorange вне форума Ответить с цитированием
Старый 02.11.2012, 17:54   #3
wicorange
Новичок
Джуниор
 
Регистрация: 02.11.2012
Сообщений: 3
По умолчанию

все спасибо вопрос снят=) надо было метку безусловного перехода сделать
wicorange вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Четность числа Марина4444 Помощь студентам 3 27.10.2012 12:49
Ввести однозначное число и определить его четность в ассемблере kachur76 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 29.01.2012 23:07
Проверка числа на четность Alex1991 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 10 06.11.2010 16:24
Четность элементов в массиве Pascal Brian Spilner Помощь студентам 8 02.08.2010 21:22
четность числа Sparky Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 8 15.06.2010 10:51