Пример 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 = 3х + 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 |