Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.119.167.196] |
|
Сообщ.
#1
,
|
|
|
Добрый день! Есть у меня программка, которая вычисляет значение уравнения y при каждом x от 0 до 10. Как занести каждое значение y в массив mas и найти минимальный элемент min? Уже голову сломал) Может есть тут знатоки?
.286 .model tiny .data .code org 100h main proc jmp start ;Данные CrLf db 0Dh, 0Ah, '$' X dw 0 Y dw ? i dw 0 press db 13,10,'$' minElem db 13,10,'Минимальный элемент массива: $' mas dw 11 dup (?) min dw ? ;int i = 10; start: ;программа fninit mov i,0 mov cx,11 lea bx, mas label1: mov ax,[i] fild [i] ;загрузить целое число со знаком в стек ;fild [X] ;загрузить целое число со знаком в стек fld1 ;поместить в стек 1.0 (вещественное число) fld st(1) fsubp st(1), st(0) ; st(0)=1-x, st(1)=x - верно?? ;exp(1-x) fldl2e ;st(0)=1/ln(2)=log2(e) fmulp st(1), st(0) ;st(0)=x/ln(2)=x*log2(e) fld st(0) frndint fsub st(1), st(0) fxch st(1) f2xm1 ;st(0)=2^(mantissa)-1 fld1 ;st(0)=2^(mantissa)-1+1=2^(mantissa) faddp st(1), st(0) fscale fstp st(1) ;2*x-epx(1-x) fxch st(1) fld st(0) fadd st(0), st(0) fxch st(2) fsubp st(2), st(0) ;3*x^3+2*x+epx(1-x) fld st(0) fmul st(0), st(0) fmulp st(1), st(0) fld st(0) fadd st(0), st(0) faddp st(1), st(0) faddp st(1), st(0) ;тут надо в массив поместить вещ. число из стека fst dword ptr[bx] ;???? тут что-то не так! call outfloat mov dx,offset press ;перевод курсора mov ah,09h int 21h inc i inc bx ;переход к следующему элементу (размер элемента=1 байту) loop label1 ;??? ТУТ НАДО МАССИВ ОБРАБОТАТЬ И НАЙТИ МИНИМАЛЬНЫЙ mov ax,4C00h int 21h ;/ Завершение программы ;завершение программы int 20h RET ;Возврат из процедуры main endp ;----------------------------------------------------------------------------------------------------------------------------------- ;ВЫВОД ВЕЩЕСТВЕННОГО ЧИСЛА ;----------------------------------------------------------------------------------------------------------------------------------- ; .exit ; Вывод вещественного числа ; аргумент - количество цифр дробной части length_frac equ [bp+4] ; локальные переменные ten equ word ptr [bp-2] temp equ word ptr [bp-4] OutFloat proc near push cx push ax enter 4, 0 ; пролог - выделим в кадре стека 4 байта под локальные переменные mov ten, 10 ftst ; определяем знак числа fstsw ax sahf jnc @positiv mov al, '-' ; если число отрицательное - выводим минус int 29h fchs ; и получаем модуль числа @positiv: fld1 ; загружаем единицу fld st(1) ; копируем число на вершину стека fprem ; выделим дробную часть fsub st(2), st ; отнимем ее от числа - получим целую часть fxch st(2) ; меняем местами целую и дробную части xor cx, cx ; обнуляем счетчик ; далее идет стандартный алгоритм вывода целого числа на экран @1: fidiv ten ; делим целую часть на десять fxch st(1) ; обменяем местами st и st(1) для команды fprem fld st(1) ; копируем результат на вершину стека fprem ; выделим дробную часть (цифру справа от целой части) fsub st(2), st ; получим целую часть fimul ten ; *10 fistp temp ; получаем очередную цифру push temp ; заталкиваем ее глубже в стек inc cx ; и увеличим счетчик fxch st(1) ; подготовим стек к следующему шагу цикла (полученное частное на вершину, в st(1) - 1) ftst ; проверим не получили ли в частном 0? fstsw ax sahf jnz @1 ; нет - продолжим цикл @2: ; извлекаем очередную цифру, переводим её в символ и выводим. pop ax add al, '0' int 29h loop @2 ; далее то же самое, только для дробной части. Алгоритм похож на вывод целого числа, только вместо деления умножение и проход по числу слева fstp st ; сначала проверим, есть ли дробная часть fxch st(1) ftst fstsw ax sahf jz @quit ; дробная часть отсутствует mov al, '.' int 29h ; если присутствует - выведем точку ;mov cx, length_frac ; помещаем в счетчик длину дробной части mov cx, 2 ; помещаем в счетчик длину дробной части @3: fimul ten ; умножим на 10 fxch st(1) ; подготовка для fprem - меняем st и st(1) местами и fld st(1) ; копируем число на вершину fprem ; отделим дробную часть от целой fsub st(2), st ; и оставляем дробную fxch st(2) fistp temp ; выталкиваем полученное число из стека в temp mov ax, temp ; по дробной части идем слева, значит число выводим сразу, без предварительного сохранения в стек or al, 30h ; перевод в ascii int 29h ; на экран fxch st(1) ; подготовим стек к следующему шагу цикла (полученное частное на вершину, в st(1) - 1) ftst fstsw ax sahf ; проверим на 0 остаток дробной части loopne @3 @quit: fstp ; готово. Чистим стек сопроцессора fstp st leave ; эпилог pop ax pop cx ret 2 OutFloat endp end main |
Сообщ.
#2
,
|
|
|
snapsik, эту программу не сам писал?
OutFloat понятно, что не сам, а остальное тоже? |
Сообщ.
#3
,
|
|
|
Цитата snapsik @ Уже голову сломал) Может есть тут знатоки? Знатоки есть, и я даже их всех знаю поименно ... батраков только среди них нет Включай моск, я помогу. Ассемблер ничуть не лучше других ЯП - столько же over 9000+ многобукф, особенное если руки золотые, но растут из жопы. 1) Программка, которая вычисляет f=x(i), где i = 0..10 есть - замечательно! Вырежи ее копипастой отдельно и сохрани. Аки Linux Kernel))) 2) Тебе нужно в массиве выбрать минимальный элемент, но про печать массива ни кто не говорил - вывод, массив не нужен 3) Заряжаешь вычисление 0-вого элемента f=x(0), и заносишь его в переменную 4) Делаешь цикл по вычислению остальных от 1 до 9, сравнивая его с п.3 (если меньше - обозначаешь его минимальным) 5) По окончании расчетов ты будешь знать минимальный элемент, он в переменной из п.3 Давно я АСМ не юзал, поэтому извини за менторский тон, но чуйка подсказывает, что есть неплохая вероятность даже call-ы не использовать, а тупо заинлайнить расчеты функции в код. Момент набма ТЮ: научись пользоваться онлайн-компиляторами! Тогда тебе форумчане не просто напишут слова, а возможно и работающий пример подгонят. Как говорится, с бестами и регардами, JoeUser |