На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS

Дорогие друзья! Поздравляем вас с Новым 2019 годом!

Всем удачи, успеха и благополучия!
В новом году ожидаем новых рекордов при подсчёте количества ёлочек на экране ;)


msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Посмотрите, возможно, там уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).
  3.3. Нежелательно поднимать старые темы (не обновлявшиеся более года) без веской на то причины.

Не забывайте также про главные Правила форума!

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
  
> Поиск минимального вещественного числа в массиве
Добрый день! Есть у меня программка, которая вычисляет значение уравнения y при каждом x от 0 до 10. Как занести каждое значение y в массив mas и найти минимальный элемент min? Уже голову сломал) Может есть тут знатоки?

ExpandedWrap disabled
    .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
snapsik, эту программу не сам писал?
OutFloat понятно, что не сам, а остальное тоже?
vpmultishiftqb vscatterpf0dps vfmsubadd132pd vgatherpf1dps vpclmulhqlqdq vcmptrue_ussd vaeskeygenassist
Цитата snapsik @
Уже голову сломал) Может есть тут знатоки?

Знатоки есть, и я даже их всех знаю поименно ... батраков только среди них нет :lol:

Включай моск, я помогу. Ассемблер ничуть не лучше других ЯП - столько же 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 :whistle:
Мои программные ништякиhttp://majestio.info
1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
0 пользователей:


Рейтинг@Mail.ru
[ Script Execution time: 0,0993 ]   [ 19 queries used ]   [ Generated: 16.01.19, 12:09 GMT ]