На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
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,0866 ]   [ 14 queries used ]   [ Generated: 25.05.19, 15:11 GMT ]