Прочее компьютерное

Как на ассемблере написать процедуру для того, чтобы: эл. каждой строки матрицы циклически сдвинуть на 1 эл. влево?!

format PE console
entry N92055036
include 'win32a.inc'
stack 200h

section '.code' code readable executable

;Процедура циклического сдвига влево строки матрицы
;RowStart - адрес начала строки, M - кол-во столбцов
proc ShiftRow stdcall uses ecx edx edi esi, RowStart:dword, M:dword
    mov ecx,[M]
    dec ecx
    shl ecx,1
    mov edi,[RowStart]
    mov eax,[edi]
    mov edx,[edi+4]
    mov esi,edi
    add esi,8
    rep movsd
    stosd
    mov eax,edx
    stosd
    ret
endp

;Процедура сдвига строк матрицы влево на 1 элемент
;Adr - адрес начала матрицы, N - кол-во строк, M - кол-во столбцов
proc ShiftMatrix stdcall, Adr:dword, N:dword, M:dword
    mov ecx,[N]
    mov edx,[M]
    shl edx,3
    mov esi,[Adr]
@@:
    stdcall ShiftRow,esi,[M]
    add esi,edx
    loop @B
    ret
endp

N92055036:
    rdtsc
    mov [Seed],eax
    finit
    stdcall Random,8
    ffree st
    add eax,3
    mov [Rows],eax
    stdcall Random,8
    ffree st
    add eax,3
    mov [Cols],eax
    mul [Rows]
    mov [Size],eax
    shl eax,3
    invoke VirtualAlloc,NULL,eax,MEM_COMMIT,PAGE_READWRITE
    mov [Matrix],eax
    mov edi,eax
    cinvoke printf,Text1,[Rows],[Cols]
    mov ecx,[Size]
@@:
    stdcall Random,0
    fmul [fConst1]
    fsub [fConst2]
    fstp qword [edi+ecx*8-8]
    loop @B
    stdcall OutMatrix,[Matrix],[Rows],[Cols]
    stdcall ShiftMatrix,[Matrix],[Rows],[Cols]
    cinvoke printf,Text2
    stdcall OutMatrix,[Matrix],[Rows],[Cols]
    invoke getch
    invoke VirtualFree,[Matrix],NULL,MEM_RELEASE
    invoke ExitProcess,NULL

proc Random stdcall uses edx, n:dword
    locals
      FloatConst dq 3DFh shl 52
      IntBuff dq 0
    endl
    mov eax,[Seed]
    mov edx,08088405h
    mul edx
    inc eax
    mov [Seed],eax
    mov dword [IntBuff],eax
    fild [IntBuff]
    mov edx,[n]
    fmul [FloatConst]
    mul edx
    mov eax,edx
    ret
endp

proc OutRow stdcall uses ecx eax esi edx, RowStart:dword, RowLen:dword
    mov ecx,[RowLen]
    mov esi,[RowStart]
@@:
    lodsd
    mov edx,eax
    push ecx
    lodsd
    cinvoke printf,ItemForm,edx,eax
    pop ecx
    loop @B
    ret
endp

proc OutMatrix stdcall, Adr:dword, Rows:dword, Cols:dword
    mov esi,[Adr]
    mov ecx,[Rows]
    mov edx,[Cols]
    shl edx,3
@@:
    stdcall OutRow,esi,[Cols]
    add esi,edx
    push edx
    push ecx
    cinvoke putch,13
    cinvoke putch,10
    pop ecx
    pop edx
    loop @B
    ret
endp

section '.data' data readable writeable
Text1 db 'Исходная матрица (%ux%u):',13,10,0
Text2 db 10,'Преобразованная матрица: ',13,10,0
ItemForm db '%7.2lf',0
fConst1 dd 199.98
fConst2 dd 99.99

Seed rd 1
Rows rd 1
Cols rd 1
Size rd 1
Matrix rd 1

section '.idata' import data readable
library kernel32,'kernel32.dll', msvcrt,'msvcrt.dll'
include 'api/kernel32.inc'
import msvcrt, getch,'_getch', putch,'_putch', printf,'printf'

Виталий Большаков
Виталий Большаков
51 590
Лучший ответ
На ассемблере - это трудно. А вот на VBE - можно.

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