массива, и туда почему-то не передается размер массива (хотя вводится верно)
Код:
.386
.model flat, stdcall
option casemap :none
include includes\masm32rt.inc
;макросы
.data
A dd 30 dup(0); память под массив А
ASize dd ?; размер массива А
HS dd ?; вспомогательная перем.
B dd 6 dup(0); память под массив В
.code
inps macro; макрос ввода размера массива
local lbl;
lbl:
ccout "Enter array size:\n";
mov HS, input(); в HS ввод
mov ASize, sval(HS);размер - число
cmp ASize, 1;
jl lbl; если размер <= 0, то повторим ввод
endm
inpa macro s; макрос ввода начальнго массива А
local cycl;
ccout "Input array\n";
mov ecx, s; в счетчик размер массива
mov esi, 0;
cycl:
ccout "Input element: ";
mov HS, input();
mov A[esi], sval(HS);
add esi, 4;
dec ecx;
cmp ecx, 0;
ja cycl;
endm
outarr macro aname, s; макрос вывода массива
local cycl, mout1, mout2, lbl;
jmp lbl;
mout1 db 10, 13, "arr [";
mout2 db 10, 13, "] = ";
lbl:
ccout "Output array &aname\n";
mov ecx, s;
mov esi, 0;
cycl:
invoke StdOut, ADDR mout1;
mov HS, sstr$(esi);
invoke StdOut, HS;
invoke StdOut, ADDR mout2;
mov HS, sstr$(aname[esi]);
invoke StdOut, HS;
loop cycl;
endm
inpb macro s; макрос для формирования массива В, s - размер массива А
local lbl, cycl, zr, odd, evn, nxt;
mov ecx, s; счетчик в ecx
mov esi, 0; индекс в esi
cycl:
mov edi, 0; устанавливаем на 0 элемент B
mov eax, A[esi];
cmp eax, 0;
jnz zr; если A[i]=0, переходим на метку zr
add edi, 8; иначе устанавливаем на 2 элемент В
test eax, 1;
jnz odd; если элемент четный, то на метку odd
add edi, 8; иначе устанавливаем на 4 элемент В
jz evn; и переход на метку evn
zr:
mov ebx, B[edi];
inc ebx;
mov B[edi], ebx; B[0]+1
jmp nxt;
odd:
mov ebx, B[edi];
inc ebx;
mov B[edi], ebx; B[2]+1
add edi, 4;
mov ebx, B[edi];
add eax, ebx; B[3]+A[i];
mov eax, B[edi];
jmp nxt;
evn:
mov ebx, B[edi];
inc ebx;
mov B[edi], ebx; B[4]+1
add edi, 4;
mov ebx, B[edi];
add eax, ebx; B[5]+A[i];
mov eax, B[edi];
jmp nxt;
nxt:
add esi, 4;
loop cycl;
endm;
start:
cls; очищаем консоль
SetConsoleCaption "Shelest LW5 PI01"; задаем заголовок окна
inps; вводим размер А
inpa ASize; вводим массив А
outarr A, ASize;печатаем массив А
inpb ASize; формируем массив В
outarr B, 6; печатаем массив В
inkey "Any key to exit..."; ждем нажатие клавиши для выхода
exit; завершаем работу
end start
ccount "... ...." ты уверена что этот макрос не портит регистры которые ты в цикле используешь дальше?
Не уверена, но уже переписала прогу по-другому, работает Просто разнесла вывод текста и массива в разные макросы
Обсуждают сегодня