Другие языки программирования и технологии

как поменять максимум и минимум в матрице на асемблере???

Матрицы в ассемблере программист волен хранить, как ему заблагорассудится.
И лишь при выводе на экран или в файл нужно размещать элементы по столбцам и строкам.
В данной задаче проще всего хранить матрицу и работать с ней, как с одномерным массивом.
Найти адреса максимального и минимального элементов, не обращая внимания на индексы строк и столбцов, а затем просто поменять их местами тремя инструкциями процессора.

PREPARSE EntryPoint Begin

[push | push #1 | #+1]
[call | push #L>2 | call #1]
[ccall | push #L>2 | call #1
    #If #N>1
        add esp ((#N-1)*4)
    #EndIf]

[Text1: B$ 'Дана матрица %ux%u:' 0D 0A 0]
[Text2: B$ 0A 'Минимум и максимум поменялись местами: ' 0D 0A 0]
[Frmt: B$ '%7.2f' 0]
[CRLF: B$ 0D 0A 0]
[Seed: ?]
[N: ?]
[M: ?]
[Size: ?]
[Matrix: ?]
[Buff: ?]

Begin:
    rdtsc
    mov D$Seed eax
    finit
    call Rand
    mov D$N eax
    call Rand
    mov D$M eax
    mul D$N
    mov D$Size eax
    ffree st1
    ffree st0
    shl eax 2
    call 'kernel32.VirtualAlloc' &NULL eax &MEM_COMMIT &PAGE_READWRITE
    mov D$Matrix eax
    ccall 'msvcrt.printf' Text1 D$N D$M
    mov ecx D$Size
    mov edi D$Matrix
L1:
    call Rand
    mov D$Buff 04347FAE1
    fmul F$Buff
    mov D$Buff 042C7FAE1
    fsub F$Buff
    fstp F$edi+ecx*4-4
    loop L1<
    call WriteMatrix
    mov ecx D$Size
    dec ecx
    mov ebx D$Matrix
    mov edi ebx
    mov esi edi
L4:
    add ebx 4
    fld F$ebx
    fld F$edi
    fcomip st0 st1
    cmovb edi ebx
    fld F$esi
    fcomip st0 st1
    cmova esi ebx
    ffree st0
    loop L4<

;Перемена местами максимума и минимума
;в edi адрес максимального элемента
;в esi адрес минимального
    mov eax D$esi
    xchg eax D$edi
    mov D$esi eax

    ccall 'msvcrt.printf' Text2
    call WriteMatrix
    call 'msvcrt._getch'
    call 'kernel32.VirtualFree' D$Matrix &NULL &MEM_RELEASE
    call 'kernel32.ExitProcess' &NULL

WriteMatrix:
    mov ebx D$Matrix
    mov ecx D$Size
    xor esi esi
L3:
    push ecx
    fld F$ebx+esi*4
    sub esp 8
    fstp R$esp
    push Frmt
    call 'msvcrt.printf'
    add esp 0C
    inc esi
    mov eax esi
    cdq
    div D$M
    test edx edx
    jnz L2>
    ccall 'msvcrt.printf' CRLF
L2:
    pop ecx
    loop L3<
    ret

Rand:
    push edx
    mov eax D$Seed
    mov edx 214013
    mul edx
    add eax 2531011
    mov D$Seed eax
    shr eax 16
    and eax 07FFF
    push 08000
    push eax
    fild D$esp
    and eax 7
    fidiv D$esp+4
    add esp 8
    add eax 3
    pop edx
    ret



В 6-м столбце поменялись местами 99.40 и -91.17
Даулет Бралимов
Даулет Бралимов
51 590
Лучший ответ
а разве в ассемблерах есть матрицы? ?
(в попадавшихся мне версиях их не было. можетя сейчашние веяния упустила)

разберись в версии ассемблера под какое железо и что там понимается под матрицей.
Orozbek Аbdumаlikov
27 060
для начала в цикле найти эти самые минимум и максимум. Потом просто записать из ячейки памяти в регистр значение минимума (допустим в АХ) . а из другой ячейки памяти в другой регистр значение максимума (допустим ВХ) . ну и записать с регистров в те же ячейки поменяв их местами - из АХ в ячейку где был максимум, а из ВХ где был минимум.
матрица на асме это, по сути, вывод цыкла в цыкле 3 по 3 на пример, на сколько мне помнится)

Похожие вопросы