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

Определить номер (х) элемента функции: 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 ; зак?нчення программы

Реклама

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

Вычислить 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 Результат работы программы

Dll на ассемблере: Написать программу на ассемблер. Задан массив А из N = 40 элементов. Навести алгоритм и программу определения количества элементов массива А, которые удовлетворяют условию L >= Ai >= M, где L = 6 и M = 22.

Пример: Написать программу на ассемблер. Задан массив А из N = 40 элементов. Навести алгоритм и программу определения количества элементов массива А, которые удовлетворяют условию L >= Ai >= M, где L = 6 и M = 22.

Текст программы
файл 1.asm

.386
.model flat,stdcall
option casemap:none ; отличие строчных и прописных букв

includelib\masm32\lib\kernel32.lib

ExitProcess proto :DWORD
Mas_sum proto :DWORD, :DWORD, :DWORD ; прототип процедуры
.code
Mas_sum proc arg1:DWORD,arg2:DWORD,masiv:DWORD

mov ebx,0
mov eax,masiv
cmp eax,arg1
jnc m1
jmp _end
m1:
cmp eax,arg2
jc m2
jmp _end
m2:
inc ebx
_end:

ret ; возвращение управления ОС
Mas_sum endp ; окончание процедуры с именем Mas_sum
end ; окончание программы с именем start

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

Файл 1dll.asm

.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
include \masm32\include\msvcrt.inc

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

includelib 1.lib
ExitProcess proto :DWORD
Mas_sum proto :DWORD, :DWORD, :DWORD ; прототип процедуры

.data ; директива определения данные
_c dd 40
sum dd 0
op1 dd 6 ; запись в 32-разрядную память op1
op2 dd 22 ; минимальных предел
frmt db «%d»,0
buf db 30 dup(?)
stdout DWORD ?
stdin DWORD ?
cRead dd ?
temp dd ?
mas1 dd 40 dup(0)

st1 db «Vvesty masiv: »
st2 db «Вывод количества элементов в пределах (6,22) массива! А, 0
st3 db 10 dup(0)
ifmt db «количество = %d»,0
.code ; директива начала кода программы

_start:
lea esi, mas1 ; загрузка адреса начала массива
mov ecx,_c
m1:
mov ebx,ecx
invoke GetStdHandle,STD_OUTPUT_HANDLE
mov stdout,eax
invoke GetStdHandle,STD_INPUT_HANDLE
mov stdin,eax
invoke WriteConsoleA,stdout,ADDR st1,14,NULL,NULL ; VIVOD ST1
invoke ReadConsole,stdin,ADDR buf,20
ADDR cRead,NULL ; чтения числа как символ
invoke crt_atoi,ADDR buf ; преобразовать символ в число
mov [esi],eax
add esi,4
mov ecx,ebx
loop m1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

mov ecx,_c
lea esi, mas1 ; загрузка адреса начала массива
mov eax [esi] ; загрузка числа
m3:
invoke Mas_sum, op1,op2,eax
add sum,ebx
add esi,4 ; расчет адреса нового числа
mov eax[esi] loop m3

mov ebx,sum

invoke wsprintf \
ADDR st3 \
ADDR ifmt \
ebx
invoke MessageBox \
NULL \
addr st3 \
addr st2 \
MB_OK
invoke ExitProcess,0
ret
end _start ; конец программы

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

Написать программу с использованием макросов для вычисления одного из выражений без предыдущего математического упрощения операций: 2x – 3 + 8(2x –3);

.686 ; директива определения типа микропроцессора

.model flat,stdcall ; задание линейной модели памяти
; но соглашения ОС Windows
option casemap:none ; отличие малых и больших букв
includelib \masm32\lib\kernel32.lib
ExitProcess proto:dword ; прототип API-функції
mSubB macro x,b ; макрос с именем mSubB
mov al,x
shl al,1 ; занос переменной а
sub al,b ; вычитание а – b
mov res1,al ;; сохранение результата в памяти
endm ; окончание макроса
.data ; директива определения данные
x db 6 ; сохранение в амбарчике памяти, размером в байт операнда 6
b db 3
res1 db 0 ; резервирование памяти для результата res1
res2 dw 0 ; резервирование памяти для результата res2
.code ; директива начала программы
_start: ; метка начала программы с именем _start
xor eax,eax
xor ebx,ebx
mSubB [x][b] ; вызов макроса
mov al,8
mov bl,res1
mul bl
mov bl,al
mSubB [x][b] ; вызов макроса
mov al,res1 ; занос с расширением разрядности
add bx,ax
mov res2,bx ; сохранение остаточного результата
invoke ExitProcess, 0 ; возвращение управления ОС Windows
end _start ; директива окончания программы с именем _start

Проанализировать массив данных из 16 элементов. Подсчитать и вывести на экран количество элементов, которые по значению находятся в середине диапазона от 32 до 128.

.686 ; директива определения типа микропроцессора

.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
include \masm32\include\msvcrt.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\msvcrt.lib
includelib \masm32\lib\fpu.lib

.data ; директива определения данные
_c dd 40
sum dd 0
op1 dd 32 ; пределы
op2 dd 128 ; пределы
frmt db «%d»,0
buf db 30 dup(?)
stdout DWORD ?
stdin DWORD ?
cRead dd ?
temp dd ?
mas1 dd 41 dup(0)

st1 db «Vvesty masiv: »
st2 db «Вывод количества элементов в пределах (32,128) массива! С», 0
st3 db 10 dup(0)
ifmt db «количество = %d»,0

.code ; директива начала кода программы
_start:
lea esi, mas1 ; загрузка адреса начала массива
mov ecx,_c
m1:
mov ebx,ecx
invoke GetStdHandle,STD_OUTPUT_HANDLE
mov stdout,eax
invoke GetStdHandle,STD_INPUT_HANDLE
mov stdin,eax
invoke WriteConsoleA,stdout,ADDR st1,14,NULL,NULL ; VIVOD ST1
invoke ReadConsole,stdin,ADDR buf,20
ADDR cRead,NULL ; чтения числа как символ
invoke crt_atoi,ADDR buf ; преобразовать символ в число
mov [esi],eax
add esi,4
mov ecx,ebx
loop m1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

mov ecx,_c
lea esi, mas1 ; загрузка адреса начала массива
mov eax [esi] ; загрузка числа
m3:
.IF(eax>op1)&&(eax

Заданы массивы A и В из N = 8 элементов. Сформировать новый массив С по правилу: если у элементов Ai и Bi биты 0, 1 и 2 совпадают, то Ci = Аi + Вi.

.686 ; директива определения типа микропроцессора

.model flat, stdcall ; задание линейной модели памяти
; но соглашения ОС Windows
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
ExitProcess proto:DWORD

.data ; директива определения данные
st1 db «Вывод массива! С», 0
st2 db 10 dup(?),0
ifmt db «%d»,0
masivA db 7,34,34,45,2,6,2-6
masivB db 54,2,7,43,13-7,65,9
masivC db 8 dup(0)
work1 db 0
work2 db 0
prom dd 0

.code ; директива начала кода программы
_start:
mov eax,0
mov ebx,0
mov ecx,8
mov edx,0

lea esi, masivA
lea edi, masivB
lea edx, masivC

M1:
mov prom,ebx
mov al, byte ptr[esi+ebx] mov bl, byte ptr[edi+ebx] mov work1, al
mov work2, bl
and eax,07h
and ebx,07h
sub eax,ebx
jz M3

M2:
mov ebx, prom
inc ebx
loop M1
jmp M4

M3:
mov al, work1
mov bl, work2
add al,bl
mov [edx+ebx],al
jmp M2

M4:
mov edx,0
mov ecx,08h
Prom:
lea esi,masivC;
mov al[esi+edx] cmp al,0
jnz _M2
_M1: inc edx
loop Prom
jmp _M3
_M2:
mov ebx,eax
jmp _M1
_M3:
invoke wsprintf \
ADDR st2 \
ADDR ifmt \
ebx
invoke MessageBox \
NULL \
addr st2 \
addr st1 \
MB_OK
invoke ExitProcess,0
end _start ; окончание программы

Арифметические выражения через команды: mul, div, sub, add. Пример: Написать программу на ассемблере вычисления выражения: а – e/b – de;

.686 ; директива определения типа микропроцессора

.model flat,stdcall ; задание линейной модели памяти
; но соглашения ОС Windows

.data ; директива определения данные
_a dw 5 ; запись в 16-разрядный амбарчик памяти с именем _а числа 5
_b dw 27 ; запись _b = 16h
_c dw 86 ; запись _c = 56h
_e dw 1986 ; запись _e = 7C2h
_d dw 1112 ; запись _d = 458
res dw 0 ; резервирование памяти для сохранения переменной res

.code ; директива начала сегмента команд
start:
mov edx,0 ; очистка регистров
mov ebx,0 ; очистка регистров
mov ecx,0 ; очистка регистров
mov ах,_e ; в регистр ах заносим число _e = 7C2h
mul _d ; множим _e и _d
SHL edx,16 ; делаем здвиг на 16
mov dx,ax
push edx ; бросаем значение в стек
mov edx,0
mov ах,_e
mov cx,_b
div cx ; делим ах с cx
pop ecx ; достаем из стеку значения
sub ecx,eax ; отнимаем
mov ах,_a
sub eax,ecx
mov res, eax
ret ; возвращение управление ОС
end start ; окончание программы с именем _start

Написать программу на Ассемблере вычисления выражений: b/c + ас. Результат вычисления выражения сохранить в памяти. Навести значение и порядок размещения данные в памяти.

.386 ; директива определения команд микропроцессора

.model flat,stdcall ; задание линейной модели памяти
; но соглашения ОС Windows
option casemap:none ; отличие строчных и прописных букв
includelib\masm32\lib\kernel32.lib
ExitProcess proto :DWORD
ADDDD proto :WORD, :WORD, :WORD ; прототип процедуры
.data ; директива определения данные
res dw 2 dup(0) ; резервирование амбарчиков для результата
.code ; директива начала кода программы
start: ; метка начала программы с именем start
invoke AddDD,5,86,1986 ; вызов директивы AddDD с параметрами
invoke ExitProcess,0
ADDDD proc arg1:WORD,arg2:WORD,arg3:WORD
mov eax,0 ; очистка регистров
mov ebx,0
mov ecx,0
mov edx,0

mov ах,arg3 ; arg3 = 1986
div arg2 ; операция деления
mov bx,ax
mov cx,dx

mov ах,arg1 ; ах := arg1
mul arg2 ; ax* arg2 = 86
SHL edx,16 ; операция здвигу
mov dx,ax

add ebx,edx
mov res,cx ; запоминание в памяти
mov res+2,dx ; запоминание в памяти
ret ; возвращение из процедуры
AddDD endp ; окончание процедуры с именем AddDD
end start ; окончание программы с именем start

Матрица 3 X 4. Определить максимальный элемент каждой строки. Результат выполнения программы вывести в окно консоли.

.386 ; директива определения типа микропроцессора

.model flat, stdcall ; задание линейной модели памяти
option casemap:none ; отличие малых и больших букв
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
ExitProcess proto: dword ; прототип API-функции

DATE1 STRUCT ; тип данных СТРУКТУРА с именем DATE1
elem1 db ? ; имя первого поля структуры
elem2 db ? ; имя второго поля структуры
elem3 db ? ; имя третьего поля структуры
elem4 db ? ; имя четвертого поля структуры
DATE1 ENDS
.data ; директива определения данные
max db 0
nomer db 1
str1 DATE1 <20,9,2,15> ; структура с именем str1
str2 DATE1 <6,31,1,3> ; структура с именем str2
str3 DATE1 <4,6,155,2> ; структура с именем str2
st1 db » Вывод максимальных чисел «,0
st2 db 180 dup(?),0
stemp db 0
stemp2 db 3 dup(?),0
st4 db » Нажмите Ок»,0
st3 db «-й ряд имеет максимальное число = »
kol3 = $ — st3
kol4 = $ — st4
ifmt db «%d «,0
.code ; директива начала сегмента-данных
start: ; метка начала программы с именем start
xor edx,edx ; заполнение нулями
mov ebx,3 ; загрузка количества строк
lea esi, str1 ; загрузка адреса первой строки структуры
lea edi,st2
m1: mov ecx,4 ; количество элементов в строке
mov max,0
m2: mov al[esi] ; загрузка элемента из строки структуры
.IF (al > max)
mov max,al
.ENDIF
jmp m4 ; безусловный переход, если наоборот
m3: add edx,eax ; добавление негативных элементов строки структуры
m4: inc esi ; подготовка адреса нового элемента
loop m2 ; есх := ecx – 1 и переход на m3, если не нуль

mov eax,0
mov al,nomer
invoke wsprintf \ ; API-ФУНКЦИЯ превращения числа
ADDR stemp \ ; адрес буфф., куда будет записан помет. символов
ADDR ifmt \ ; адрес строки превращения формата
eax ; регистр, содержание которого превращается
mov al,stemp
mov [edi],al
inc edi

lea esi, st3
mov ecx,kol3

_m1:
mov al[esi] mov [edi],al
inc esi
inc edi
loop _m1
mov eax,0
mov al,max

invoke wsprintf \ ; API-ФУНКЦИЯ превращения числа
ADDR stemp2 \ ; адрес буфф., куда будет записан помет. символов
ADDR ifmt \ ; адрес строки превращения формата
eax ; регистр, содержание которого превращается
lea esi, stemp2
mov ecx,3
z1:
mov al[esi] mov [edi],al
inc edi
inc esi
loop z1

mov al,10
mov [edi],al
inc edi
inc nomer

dec ebx ; ebx := ebx – 1
.IF ebx == 2
lea esi,str2 ; загрузка адреса новой строки
jmp m1 ; переход на новый цикл
.ELSEIF ebx == 1
lea esi,str3 ; загрузка адреса новой строки
jmp m1 ; переход на новый цикл
.ENDIF

mov al,10
mov [edi],al
inc edi
lea esi, st4
mov ecx,kol4
inc esi
_z1:
mov al[esi] mov [edi],al
inc esi
inc edi
loop _z1

invoke MessageBox \ ; API-ФУНКЦИЯ выведения окна консоли
NULL \ ; hwnd – идентификатор окна
addr st2 \ ; адрес строки, который содержит текст сообщения
addr st1 \ ; адрес строки, который содержит заглавие сообщения
MB_OK ; вид диалогового окна

invoke ExitProcess, 0 ; возвращение управления ОС Windows
end start ; директива окончания программы с именем start.386 ; директива определения типа микропроцессора
.model flat, stdcall ; задание линейной модели памяти
option casemap:none ; отличие малых и больших букв
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
ExitProcess proto: dword ; прототип API-функции

DATE1 STRUCT ; тип данных СТРУКТУРА с именем DATE1
elem1 db ? ; имя первого поля структуры
elem2 db ? ; имя второго поля структуры
elem3 db ? ; имя третьего поля структуры
elem4 db ? ; имя четвертого поля структуры
DATE1 ENDS
.data ; директива определения данные
max db 0
nomer db 1
str1 DATE1 <20,9,2,15> ; структура с именем str1
str2 DATE1 <6,31,1,3> ; структура с именем str2
str3 DATE1 <4,6,155,2> ; структура с именем str2
st1 db » Вывод максимальных чисел «,0
st2 db 180 dup(?),0
stemp db 0
stemp2 db 3 dup(?),0
st4 db » Нажмите Ок»,0
st3 db «-й ряд имеет максимальное число = »
kol3 = $ — st3
kol4 = $ — st4
ifmt db «%d «,0
.code ; директива начала сегмента-данных
start: ; метка начала программы с именем start
xor edx,edx ; заполнение нулями
mov ebx,3 ; загрузка количества строк
lea esi, str1 ; загрузка адреса первой строки структуры
lea edi,st2
m1: mov ecx,4 ; количество элементов в строке
mov max,0
m2: mov al[esi] ; загрузка элемента из строки структуры
.IF (al > max)
mov max,al
.ENDIF
jmp m4 ; безусловный переход, если наоборот
m3: add edx,eax ; добавление негативных элементов строки структуры
m4: inc esi ; подготовка адреса нового элемента
loop m2 ; есх := ecx – 1 и переход на m3, если не нуль

mov eax,0
mov al,nomer
invoke wsprintf \ ; API-ФУНКЦИЯ превращения числа
ADDR stemp \ ; адрес буфф., куда будет записан помет. символов
ADDR ifmt \ ; адрес строки превращения формата
eax ; регистр, содержание которого превращается
mov al,stemp
mov [edi],al
inc edi

lea esi, st3
mov ecx,kol3

_m1:
mov al[esi] mov [edi],al
inc esi
inc edi
loop _m1
mov eax,0
mov al,max

invoke wsprintf \ ; API-ФУНКЦИЯ превращения числа
ADDR stemp2 \ ; адрес буфф., куда будет записан помет. символов
ADDR ifmt \ ; адрес строки превращения формата
eax ; регистр, содержание которого превращается
lea esi, stemp2
mov ecx,3
z1:
mov al[esi] mov [edi],al
inc edi
inc esi
loop z1

mov al,10
mov [edi],al
inc edi
inc nomer

dec ebx ; ebx := ebx – 1
.IF ebx == 2
lea esi,str2 ; загрузка адреса новой строки
jmp m1 ; переход на новый цикл
.ELSEIF ebx == 1
lea esi,str3 ; загрузка адреса новой строки
jmp m1 ; переход на новый цикл
.ENDIF

mov al,10
mov [edi],al
inc edi
lea esi, st4
mov ecx,kol4
inc esi
_z1:
mov al[esi] mov [edi],al
inc esi
inc edi
loop _z1

invoke MessageBox \ ; API-ФУНКЦИЯ выведения окна консоли
NULL \ ; hwnd – идентификатор окна
addr st2 \ ; адрес строки, который содержит текст сообщения
addr st1 \ ; адрес строки, который содержит заглавие сообщения
MB_OK ; вид диалогового окна

invoke ExitProcess, 0 ; возвращение управления ОС Windows
end start ; директива окончания программы с именем start

Вывод данных в файл: для функции Y = 40Х + 10 получить первое значение, превышающей 512, начиная с Х = 1. Значение аргумента и функции записать в ячейки памяти.

.386 ;директива определения типа микропроцессора

. Model flat, stdcall ; задачи линейной модели памяти
; И соглашения ОС Windows
option casemap: none; отличие малых и больших букв

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

BSIZE equ 40; количество байтов, которые записываются в файл
. Data; директива определения данных
fName BYTE «info_file.txt», 0; ячейки для файла
fHandle DWORD? ; Резервирования в памяти 32-разрядной
;ячейки с именем fHandle для дескриптора сохранения файлов
cWritten DWORD? ; Резервирования 32-разрядной ячейки памяти
; С именем cWritten для адреса символов вывода
st1 db ‘Аргумент =’, 0
st1_kol = $ — st1
st2 db ‘Значение функции =’, 0
st2_kol = $ — st2
st3 db 100 dup (0)
stemp db 3 dup (0)
stemp2 db 3 dup (0)
ifmt db «% d», 0
_x dw 1
_y dw 0
const40 dw 40
const10 dw 10
temp db 15
prom db 0

. Code; директива начала сегмента-данных
start:; метка начала программы с именем start

mov eax, 0
mov ebx, 0
mov ecx, 0
mov edx, 0

lea edi, st3
lea esi, st1
mov ecx, st1_kol
m1:
mov al, [esi] mov [edi], al
inc esi
inc edi
loop m1

m2:
mov ax, _x
mul const40
add ax, const10
mov _y, ax
. IF (_y> 512)
jmp _end
. ELSE
inc _x
jmp m2
. ENDIF
_end:
mov eax, 0
mov ax, _x

invoke wsprintf, \; API-функция преобразования числа
ADDR stemp, \; адрес буфф, куда будет записана помет. символов
ADDR ifmt, \; адрес строки преобразования формата
eax; регистр, содержимое которого превращается

lea esi, stemp
mov ecx, 3
dec edi
z1:
mov al, [esi] mov [edi], al
inc edi
inc esi
loop z1
mov al, 10
mov [edi], al
inc edi
mov al, 13
mov [edi], al
inc edi

lea esi, st2
mov ecx, st2_kol
m3:
mov al, [esi] mov [edi], al
inc esi
inc edi
loop m3
dec edi

mov eax, 0
mov ax, _y
invoke wsprintf, \; API-функция преобразования числа
ADDR stemp2, \; адрес буфф, куда будет записана помет.символов
ADDR ifmt, \; адрес строки преобразования формата
eax; регистр, содержимое которого превращается
lea esi, stemp2
mov ecx, 6
dec esi
z2:
mov al, [esi] mov [edi], al
inc edi
inc esi
loop z2

invoke CreateFile, ADDR fName,; адрес имени файла с символами
GENERIC_WRITE, \; запись в файл
0, NULL,; параметры многозадачности
CREATE_ALWAYS,; уничтожить и создать новый файл
FILE_ATTRIBUTE_ARCHIVE, 0

mov fHandle, eax; программирование дескриптора устройства
invoke WriteFile, fHandle,; дескриптор устройства
ADDR st3,;адрес области памяти,сохраняющий символы
BSIZE,, Количество символов
ADDR cWritten,; адрес памяти,где хранится число
NULL; записанных в файл символ_в
invoke CloseHandle,fHandle; дескриптор файла
invoke ExitProcess,0 ; возврат управления Windows
; И освобождения ресурсов
end start; директива окончания программы с именем start