Работа с матрицей - Assembler
Формулировка задачи:
Помогите с заданием :
Для прямоугольной матрицы найти минимальный из положительных элементов и
максимальный из отрицательных элементов, после
чего обменять их местами. Нулевые элементы не учитывать.
У меня не получается обмен.
.686 ;Система команд процессора 686 .MODEL FLAT,stdcall;Модель памяти плоская, стандартный вызов процедуры option casemap:none;Режим при котором заглавные и строчные буквы различаются ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ .XLIST include \masm32\include\masm32rt.inc ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ comment * ----------------------------------------------------- Для прямоугольной матрицы найти минимальный из положительных элементов и максимальный из отрицательных элементов, после чего обменять их местами. Нулевые элементы не учитывать. ----------------------------------------------------- * .LIST .data bl_x label byte maxX dd 0 imaxX dd 0 jmaxX dd 0 minX dd 0 iminX dd 0 jminX dd 0 mx dd 3 nx dd 4 ; 0 x dd 11,1,-2,6;0 dd 9,6,-13,10;6 dd 3,12,11,5 bl_y label byte maxY dd 0 ;0 imaxY dd 0 ;4 jmaxy dd 0 ;8 minY dd 0 ;12 iminY dd 0 ;16 jminY dd 0 ;20 my dd 4 ;24 ny dd 5 ;28 y dd 5,7,2,-6,-9 ;32 dd -15,-1,3,50,13 dd 2,-8, 9, -45, 6 dd 9,0,-1, 9, 2 .code start: ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ push offset bl_x call work push offset bl_y call work exit ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ work proc push ebp mov ebp,esp sub esp,4 push eax push ebx; push ecx push edx push esi push edi mov ebx,[ebp+8] Matr equ dword ptr[ebx+32] m equ dword ptr[ebx+24] n equ dword ptr[ebx+28] max equ dword ptr[ebx+0] imax equ dword ptr[ebx+4] jmax equ dword ptr[ebx+8] min equ dword ptr[ebx+12] imin equ dword ptr[ebx+16] jmin equ dword ptr[ebx+20] dbx equ dword ptr[ebp-4] ;--------------------поиск мин. пол._------- mov ecx,m mov eax,n ;Локальная переменная dbx определяет размер строки матрицы. shl eax,2 ;К адресу текущей строки добавляем dbx и переходим к адресу следующей строки mov dbx,eax mov edi,0 ;Это смещение текущей строки относительно адреса начала матрицы. mov imin,-1 ; ; Это смещение текущего элемента матрицы относительно адреса начала матрицы. ; Это эквивалентно add eax,dword ptr[ebx+8+edx], c1: push ecx mov ecx,n mov esi,0 ;Индекс элементов строки:0,1,2,3 c2: lea edx,[edi+esi*4] mov eax,Matr[edx] cmp eax,0 jle m2 cmp imin,-1 jne m3 mov min,eax mov imin,edi mov jmin,esi jmp m2 m3: cmp eax,min jge m2 mov min,eax mov imin,edi mov jmin,esi m2: inc esi loop c2 POP ecx add edi,dbx LOOP c1 cmp imin,-1 je m_ret ;--------поиск макс. отр.----------------------- mov ecx,m mov eax,n ;Локальная переменная dbx определяет размер строки матрицы. shl eax,2 ;К адресу текущей строки добавляем dbx и переходим к адресу следующей строки mov dbx,eax mov edi,0 ;Это смещение текущей строки относительно адреса начала матрицы. mov imax,-1 c11: push ecx mov ecx,n mov esi,0 ;Индекс элементов строки:0,1,2,3 c22: lea edx,[edi+esi*4] ; ; Это смещение текущего элемента матрицы относительно адреса начала матрицы. ; Это эквивалентно add eax,dword ptr[ebx+8+edx], mov eax,Matr[edx] cmp eax,0 jge m22 cmp imax,-1 jne m33 mov max,eax mov imax,edi mov jmax,esi jmp m22 m33: cmp eax,max jle m22 mov max,eax mov imax,edi mov jmax,esi m22: inc esi loop c22 POP ecx add edi,dbx LOOP c11 cmp imax,-1 je m_ret ;-----------обмен----------- mov edi,imax mov esi,jmax lea edx,[edi+esi*4]; mov eax,Matr[edx]; mov eax,min mov edi,imin mov esi,jmin lea edx,[edi+esi*4]; mov eax,Matr[edx]; mov eax,max m_ret: pop edi pop esi pop edx pop ecx pop ebx pop eax mov esp,ebp; Это эквивалентно add esp,4 pop ebp ret 28 work endp ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ end start
Решение задачи: «Работа с матрицей»
textual
Листинг программы
mov edi,imax mov esi,jmax lea edx,[edi+esi*4]; mov eax,min mov Matr[edx],eax; mov edi,imin mov esi,jmin lea edx,[edi+esi*4]; mov eax,max mov Matr[edx],eax;
Объяснение кода листинга программы
- mov edi, imax;
Переменная
edi
получает значениеimax
. - mov esi, jmax;
Переменная
esi
получает значениеjmax
. - lea edx, [edi + esi * 4];
Переменная
edx
получает значение, равное суммеedi
и произведенияesi
на 4. - mov eax, min;
Переменная
eax
получает значениеmin
. - mov Matr[edx], eax;
В матрицу
Matr
по адресу, полученному в предыдущем шаге, записывается значение переменнойeax
. - mov edi, imin;
Переменная
edi
получает значениеimin
. - mov esi, jmin;
Переменная
esi
получает значениеjmin
. - lea edx, [edi + esi * 4];
Переменная
edx
получает значение, равное суммеedi
и произведенияesi
на 4. - mov eax, max;
Переменная
eax
получает значениеmax
. - mov Matr[edx], eax;
В матрицу
Matr
по адресу, полученному в предыдущем шаге, записывается значение переменнойeax
.