Работа с матрицей - 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;

Объяснение кода листинга программы

  1. mov edi, imax; Переменная edi получает значение imax.
  2. mov esi, jmax; Переменная esi получает значение jmax.
  3. lea edx, [edi + esi * 4]; Переменная edx получает значение, равное сумме edi и произведения esi на 4.
  4. mov eax, min; Переменная eax получает значение min.
  5. mov Matr[edx], eax; В матрицу Matr по адресу, полученному в предыдущем шаге, записывается значение переменной eax.
  6. mov edi, imin; Переменная edi получает значение imin.
  7. mov esi, jmin; Переменная esi получает значение jmin.
  8. lea edx, [edi + esi * 4]; Переменная edx получает значение, равное сумме edi и произведения esi на 4.
  9. mov eax, max; Переменная eax получает значение max.
  10. mov Matr[edx], eax; В матрицу Matr по адресу, полученному в предыдущем шаге, записывается значение переменной eax.

Оцени полезность:

5   голосов , оценка 3.6 из 5