Задание:
Написать программу на ассемблере вычисления с выводом данных в окно консоли: Задано массив А из N = 4 элементов. Написать программу определения суммы элементов массива А, для которых биты 0 и 5 совпадают.
Текст программы:
.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 75,31,88,32
sum dw 0
iden db 0
work1 db 0
work2 db 0
prom dd 0
. Code; директива начала кода
_start:
mov eax, 0
mov ebx, 0
mov ecx, 3
mov edx, 0
lea esi, masivA
M1:
mov prom, ebx
mov al, byte ptr [esi + ebx]; пересылки значения массива в младший регистр al
inc ebx
mov bl, byte ptr [esi + ebx]; пересылки значения массива в младший регистр bl
mov work1, al
mov work2, bl
and eax, 21h
and ebx, 21h
sub eax, ebx проверка сходимости битов
jz M3
mov iden, 0;идентификатор. Он необходим для суммы.
M2:
mov ebx, prom
inc ebx
loop M1
jmp M4
M3:
mov al, work1
dec iden
jz Q1; если идентификатов = 0, тогда перейти на метку Q1
mov iden, 1
mov bl, work2
Q1: add sum, ax; подсчета суммы
add sum, bx; подсчета суммы
jmp M2
M4:
mov ebx, 0
mov bx, sum; пересылка значение суммы в регистр
invoke wsprintf, \
ADDR st2, \
ADDR ifmt, \
ebx
invoke MessageBox, \; функция вывода значения
NULL, \
addr st2, \
addr st1 \
MB_OK
invoke ExitProcess, 0
end _start; окончания программы
Результат работы программы: