WUT_Computer_Science/Programming/ECOAR/C/asm_part.asm

137 lines
3.0 KiB
NASM
Raw Normal View History

section .data
image_info_address EQU 8 ; First argument passed to our function starts from 8
first_piece_address EQU 12 ; From that point we just add 4 to address of next
; arguments
piece_to_swap_with_address EQU 16
horizontal_divisons_address EQU 20
piece_width_address EQU 24
piece_height_address EQU 28
piece_width_bytes_address EQU 32
piece_height_bytes_address EQU 36
bytes_per_row_address EQU 40
firstPieceStartingByte EQU 44
secondPieceStartingByte EQU 48
pImg_inside_image_info_address EQU 12
image_width EQU 0
image_height EQU 4
bytes_per_row_inside_image_info_address EQU 8
image_pImg EQU 12
image_pHeaderInfo EQU 16 ; not really used
; first.X, first.Y, second.X, second.Y
%macro print 2 ;number of arguments this macro takes
mov edx, %1 ;message length
mov ecx, %2 ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
%endmacro
section .text
global inner_loops ;must be declared for linker (ld)
; extern void hello_world(imageInfo* pInfo, int firstPiece, int pieceToSwapWith,
; int horizontalDivisions, int pieceWidth,
; int pieceHeight);
; mov ecx, [ebp + 8] ; ecx <- address of imgInfo struct, not saved
; mov eax, [ebp + 12] ; eax <- firstPiece, not saved
; mov edx, [ebp + 16] ; edx <- pieceToSwapWith, not saved
; mov esi, [ecx + image_pImg] ; esi <- start of pixels in picture, saved
; mov ebx, [ebp + 20] ; ebx <- horizontalDivisions
; mov edi, [ebp + 24] ; edi <- pieceWidth
inner_loops: ;tells linker entry point
push ebp ; as per calling convention we need to keep the values of
; certain registers
mov ebp,esp
push ebx
push esi
push edi
; what we use:
; ecx - firstPieceFirstByteAddress
; edx - secondPieceFirstByteAddress
; esi
; edi
; what we have:
; eax
; ebx
push ebx
push eax
;mov eax, [ebp + firstPieceStartingByte]
;mov eax, [eax + image_pImg]
mov edi, 0
x_pixels_loop:
cmp edi, [ebp + piece_width_bytes_address]
;cmp edi, 300
jge x_pixels_loop_end
mov esi, 0
; ecx = secondPieceStartingByte
; edx = firstPieceStartingByte
; we still have eax and ebx
;
y_pixels_loop:
cmp esi, [ebp + piece_height_bytes_address]
;cmp esi, 96000
jge y_pixels_loop_end
mov ecx, [ebp + secondPieceStartingByte]
mov eax, [ebp + firstPieceStartingByte]
add ecx, edi
add ecx, esi
add eax, edi
add eax, esi
mov BYTE bl, [eax]
mov BYTE dl, [ecx]
mov BYTE[ecx], bl
mov BYTE[eax], dl
mov BYTE bl, [eax + 1]
mov BYTE dl, [ecx + 1]
mov BYTE[ecx + 1], bl
mov BYTE[eax + 1], dl
mov BYTE bl, [eax + 2]
mov BYTE dl, [ecx + 2]
mov BYTE[ecx + 2], bl
mov BYTE[eax + 2], dl
add esi, [ebp + bytes_per_row_address]
jmp y_pixels_loop
; for(x = 0; x < pieceWidth * 3; x += 3)
y_pixels_loop_end:
add edi, 3
jmp x_pixels_loop
x_pixels_loop_end:
pop esi
pop edi
pop ebx
mov esp, ebp
pop ebp
ret