|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
02.11.2012, 17:48 | #1 |
Новичок
Джуниор
Регистрация: 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 ;///////////////////////////////////////////////////////////////// |
02.11.2012, 17:49 | #2 |
Новичок
Джуниор
Регистрация: 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 |
02.11.2012, 17:54 | #3 |
Новичок
Джуниор
Регистрация: 02.11.2012
Сообщений: 3
|
все спасибо вопрос снят=) надо было метку безусловного перехода сделать
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Четность числа | Марина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 |