Вторник, 2025-07-08, 1:28 PM
Приветствую Вас Гость | RSS
Главная | Ассемблер сопроцессор | Регистрация | Вход
Меню сайта
Вход на сайт
Поиск
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Программирование

    Ассемблер сопроцессор. Примеры задач

     

     

    Пример 1: Вычислить 6 значений функции: Yn = 4x/(x + 5) (хизменяется от 3 с шагом 1,25). Результат округлить к целому, разместить в памяти и вывести на экран.


    1.1 Текст программы


    .386               ; директива определения типа микропроцессора 
    .model flat,stdcall                      ; задание линейной модели памяти 
    option casemap:none          ; отличие малых и больших букв 
    include \masm32\include\windows.inc
    include \masm32\include\kernel32.inc 
    include \masm32\include\fpu.inc 
    include \masm32\include\user32.inc

    includelib \masm32\lib\user32.lib 
    includelib \masm32\lib\kernel32.lib
    includelib \masm32\lib\fpu.lib

    .data            ; директива определения данные

    _x dd 3 ; сохранение в 32-разрядном амбарчике памяти переменной х 
    _y dd 0   ; резервирование 32-х разрядов памяти для переменной в 
    tmp1 dd ? ; резервирование 32-х разрядов памяти для переменной tmp1 
    tmp2 dd ? ; резервирование 32-х разрядов памяти для переменной tmp2 
    hod dd 1.25 
    krok dd 5 
    _umnoj dd 4 ; умножение на 4 
    probel dd 09h    ; для вывода на экран 
    res dd 0 
    ifmt db "Yn = %d",0 
    st1 db "Yn = 4x/(x + 5) ",0 
    st2 dd  10 dup(?),0 
    st3 dd  10 dup(?),0

    .code    ; директива начала кода программы 
    _start:         ; директива начала кода программы 
    lea edi,st2 
    lea esi,st3 
    xor eax,eax   ; обнуление регистров 
    xor ebx,ebx 
    xor ecx,ecx 
    xor edx,edx 
    finit   ; инициирующее сопроцессора 
    mov ecx,6     
    fild _x 
    m1: 
    fld st(0) 
    fiadd krok 
    fld st(1) 
    fimul _umnoj 
    fmul st(0),st(1) 
    fistp dword ptr [edi] 
    fistp dword ptr [esi] 
    fadd hod

      add edi,4

      loop m1

    lea edi,st2 
    mov eax[edi+20]

    invoke wsprintf \ 
    ADDR st2 \ 
    ADDR ifmt \ 
    eax 
    invoke MessageBox \ 
    NULL \ 
    addr st2 \ 
    addr st1 \ 
    MB_OK 
    invoke ExitProcess,0 
    end _start    ; зак?нчення программы


    1.2 Результат работы программы


     

     

    Пример 2 : Определить номер (х) элемента функции: xn =  + 5, при котором сумма элементов превысит 12 000. Результат разместить в памяти и вывести соответствующие сообщения.


    2.1 Текст программы


    .386               ; директива определения типа микропроцессора 
    .model flat,stdcall                      ; задание линейной модели памяти 
    option casemap:none          ; отличие малых и больших букв 
    include \masm32\include\windows.inc 
    include \masm32\include\kernel32.inc 
    include \masm32\include\fpu.inc 
    include \masm32\include\user32.inc

    includelib \masm32\lib\user32.lib 
    includelib \masm32\lib\kernel32.lib 
    includelib \masm32\lib\fpu.lib

    .data            ; директива определения данные

    _x dd 0 ; сохранение переменной х 
    _y dd 0   ; резервирование 32-х разрядов памяти для переменной в 
    tmp1 dd ? ; резервирование 32-х разрядов памяти для переменной tmp1 
    tmp2 dd ? ; резервирование 32-х разрядов памяти для переменной tmp2 
    hod dd 1 
    krok dd 3 
    plus dd 5 
    mem dw ? 
    _MASK equ 0C00h 
    limit dd 12000 
    ifmt db "№ = %d",0 
    st1 db "Вывод номера елемента",0 
    st2 dd  10 dup(?),0 
    st3 dd  10 dup(?),0

    .code    ; директива начала кода программы 
    _start:         ; директива начала кода программы 
    lea edi,st2 
    lea esi,st3 
    xor eax,eax   ; обнуление регистров 
    xor ebx,ebx 
    xor ecx,ecx 
    xor edx,edx 
    mov edx,limit 
    finit   ; инициализация сопроцессора 
    fstcw mem 
    OR mem,_MASK 
    fldcw mem 
    mov ecx,6     
    m1: 
    inc _x      
    fild _x 
    fild krok 
    fyl2x 
    fld st(0) 
    frndint 
    fsub st(1),st(0) 
    frndint 
    f2xm1 
    fiadd hod 
    fldz 
    fadd st(0),st(2) 
    f2xm1 
    fiadd hod 
    fmul st(0),st(1) 
    fiadd plus 
    fistp dword ptr [edi] 
    fistp dword ptr [esi] 
    fistp dword ptr [esi] 
    mov eax[edi] 
    add ebx,eax 
    add edi,4 
    add esi,4 
    cmp edx,ebx 
    jns m1

    mov eax,_x

    invoke wsprintf \ 
    ADDR st2 \ 
    ADDR ifmt \ 
    eax 
    invoke MessageBox \ 
    NULL \ 
    addr st2 \ 
    addr st1 \ 
    MB_OK 
    invoke ExitProcess,0 
    end _start    ; зак?нчення программы


    2.2 Результат работы программы


     

    Пример 3: Вычислить 4 значения функции: Y = 3 * log2(x2+1), x  изменяется от 0,2 с шагом 0,3.


    3.1 Текст программы


    .386               ; директива определения типа микропроцессора 
    .model flat,stdcall                      ; задание линейной модели памяти 
    option casemap:none          ; отличие малых и больших букв 
    include \masm32\include\windows.inc 
    include \masm32\include\kernel32.inc 
    include \masm32\include\fpu.inc 
    include \masm32\include\user32.inc

    includelib \masm32\lib\user32.lib 
    includelib \masm32\lib\kernel32.lib 
    includelib \masm32\lib\fpu.lib

    .data            ; директива определения данные

    _x dd 0.2 ; сохранение в 32-разрядном амбарчике памяти переменной х 
    _y dd 0   ; резервирование 32-х разрядов памяти для переменной в 
    tmp1 dd ? ; резервирование 32-х разрядов памяти для переменной tmp1 
    tmp2 dd ? ; резервирование 32-х разрядов памяти для переменной tmp2 
    hod dd 0.3 
    umnoj dd 3 
    const dd 4 
    mem dw ? 
    _MASK equ 0C00h 
    ifmt db "Y = %d",0 
    st1 db "Вывод функции",0 
    st2 dd  10 dup(?),0 
    st3 dd  10 dup(?),0

    .code    ; директива начала кода программы 
    _start:         ; директива начала кода программы 
    lea edi,st2 
    lea esi,st3 
    xor eax,eax   ; обнуление регистров 
    xor ebx,ebx 
    xor ecx,ecx 
    xor edx,edx 
    finit   ; инициализания сопроцессора 
    fstcw mem 
    OR mem,_MASK 
    fldcw mem 
    mov ecx,4    

      fld _x 
    fld _x 
    m1: 
    fild umnoj 
    fld st(1) 
    fmulp st(2),st(0) 
    fyl2x 
    fld hod 
    fadd st(2),st(0) 

    fistp dword ptr [edi] 
    dec const 
    jz m2 
    fistp dword ptr [esi] 
    fld st(0) 
    mov eax[esi] 
    add edi,4 
    add esi,4 
    loop m1 
    m2:

     

    invoke FpuFLtoA, 0, 10, ADDR st2, SRC1_FPU or SRC2_DIMM 
    invoke MessageBox, NULL, addr st2, addr st1, MB_OK 
    invoke ExitProcess, NULL ; возвращение управления ОС Windows 
    ; но освобождение ресурсов

    end _start         ; директива окончания программы с именем start

    3.2 Результат работы программы


    uCozCopyright MyCorp © 2025