global Four_Byte_Walk
global Eight_Byte_Walk
global Sixteen_Byte_Walk
global Thirtytwo_Byte_Walk
global Sixtyfour_Byte_Walk
global Onetwentyeight_Byte_Walk
global Access_One_Byte
global Four_Byte_Time

;section .data
;my_time dd 0, 1

	section .text

Access_One_Byte:
	;movl    %esi, 0
	;movq    %rdi, %rax

;movq    %rsp, %rbp
;subq    $16, %rsp
;movq    $0, -16(%rbp)
;movq    $1, -8(%rbp)
;leaq    -16(%rbp), %rax
;movl    $0, %esi
;movq    %rax, %rdi

;push   rbp
;mov    rbp, rsp

;mov rbp, rsp
;sub rsp, 16
;mov dword[16+rbp], 0
;mov dword[8+rbp], 1
;lea rax, [16+rbp]
;mov esi, 0
;mov rdi, 1

;	push rbp
;	push rax
;	push rdi
;	push rsi
;	push rbp	
;	push rbx

;        mov qword[rbp], 0
 ;       mov qword[24+rbp], 0
;rax, rcx, rdx, rbx, rsp, rbp, rsi, rdi
; 162	mov qword[16+rbp], 0
;	mov qword[8+rbp], 0

	;mov rcx, 0
	;mov rbx, 0
;lea   rax, rbx

;	mov rbx, 0

;mov qword [16+ts], 0
;mov qword [8+ts], 1
;lea     rax, [rbp+16]
;mov     rsi, 0
;mov     rdi, rax

	;xor rcx, rcx
	;mov rbx, my_time
	;mov dword [8+rbx], 1

	mov ecx, 0
	mov ebx, 0
	;mov bx, 1

	mov eax, 0xA2
	int 80h


	;extern nanosleep
	;call    nanosleep

	;mov byte[rdi],  1

;	pop rbx
;	pop rbp
;	pop rax
;	pop rdi
;	pop rsi
;	pop rbp

	ret


Four_Byte_Time:
	push r10
	mov r10, rdi
	add r10, rsi
	sub r10, 64
.L1:
		mov byte[0+r10],  1
		mov byte[4+r10],  0
		mov byte[8+r10],  1
		mov byte[12+r10], 1
		mov byte[16+r10], 1
		mov byte[20+r10], 0
		mov byte[24+r10], 1
		mov byte[28+r10], 1
		mov byte[32+r10], 1
		mov byte[36+r10], 0
		mov byte[40+r10], 1
		mov byte[44+r10], 1
		mov byte[48+r10], 0
		mov byte[52+r10], 1
		mov byte[56+r10], 1
		mov byte[60+r10], 0
	sub     r10, 64
	cmp     r10, rdi
        jne .L1

	pop r10
	ret

; Params:       rdi = ptr to memory area
;               rsi = length in bytes
;               rdx = loops
;		rcx
; 

Four_Byte_Walk:
        push r10
        push r11
;	push eax
;	mov al, 0
        mov r11, 0
        mov eax, 0
        add     rsi, rdi
        sub rsi, 64
.L1:
        mov     r10, rdi
        add     r10, r11
;        inc     r11
.L2:

;	mov byte[0+r10],  1
;	mov byte[32+r10],  1
;	mov byte[64+r10],  1
;	mov byte[96+r10],  1

        mov byte[20+r10],  dl
        mov byte[28+r10], dl
        mov byte[0+r10],  dl
        mov byte[16+r10], dl
        mov byte[24+r10], dl
        mov byte[8+r10], dl
        mov byte[4+r10], dl
        mov byte[48+r10], dl
        mov byte[36+r10], dl
        mov byte[56+r10], dl
        mov byte[44+r10], dl
        mov byte[32+r10], dl
        mov byte[60+r10], dl
        mov byte[40+r10], dl
        mov byte[52+r10], dl

;        mov byte[64+r10], 0
;        mov byte[68+r10], 1 
;        mov byte[72+r10], 1 
;        mov byte[76+r10], 1
;        mov byte[80+r10], 1 
;        mov byte[84+r10], 1 
;        mov byte[88+r10], 1 
;        mov byte[92+r10], 1 
;        mov byte[96+r10], 1 
;        mov byte[100+r10], 1 
;        mov byte[104+r10], 1 
;        mov byte[108+r10], 1
;        mov byte[112+r10], 1
;        mov byte[114+r10], 1
;        mov byte[120+r10], 1
;        mov byte[124+r10], 1

        add     r10, 64
        inc eax
;mov byte[r10],  1
;	inc r10
        cmp     r10, rsi
        jb      .L2
        
;        dec     rdx
;        jnz     .L1

        inc r11
        cmp r11, 4
        jb  .L1
        

        pop r10
        pop r11
;	pop eax
        ;mov eax, r12 
        ;pop r12
        ret


Eight_Byte_Walk:
	push r10
	add     rsi, rdi
	sub rsi, 128
.L1:
	mov     r10, rdi
.L2:
	mov byte[48+r10], 0
        mov byte[16+r10], 1
        mov byte[8+r10], 0
        mov byte[32+r10], 1
        mov byte[56+r10], 0
        mov byte[0+r10], 1
        mov byte[40+r10], 0
        mov byte[80+r10], 1
        mov byte[112+r10], 0
        mov byte[64+r10], 1
        mov byte[120+r10], 0
        mov byte[96+r10], 1
        mov byte[104+r10], 0
        mov byte[72+r10], 1
        mov byte[88+r10], 0
;        mov byte[128+r10], 2
;        mov byte[136+r10], 2
;        mov byte[144+r10], 2
;        mov byte[152+r10], 2
;        mov byte[160+r10], 2
;        mov byte[168+r10], 2
;        mov byte[176+r10], 2
;        mov byte[184+r10], 2
;        mov byte[192+r10], 2
;        mov byte[200+r10], 2
;        mov byte[208+r10], 2
;        mov byte[216+r10], 2
;        mov byte[224+r10], 2
;        mov byte[232+r10], 2
;        mov byte[240+r10], 2
;        mov byte[248+r10], 2

	add     r10, 128
	cmp     r10, rsi
	jb      .L2

	dec     rdx
	jnz     .L1
	
	pop r10
	ret

Sixteen_Byte_Walk:
        push r10
        add     rsi, rdi
        sub rsi, 256
.L1:
        mov     r10, rdi
.L2:
        mov byte[32+r10], 1
        mov byte[96+r10], 0 
        mov byte[0+r10], 1
        mov byte[48+r10], 0
        mov byte[112+r10], 1
        mov byte[80+r10], 0
        mov byte[16+r10], 1
        mov byte[64+r10], 0
        mov byte[240+r10], 1
        mov byte[144+r10], 0
        mov byte[208+r10], 1
        mov byte[176+r10], 0
        mov byte[192+r10], 1
        mov byte[160+r10], 0
        mov byte[224+r10], 0
        mov byte[128+r10], 1 
;        mov byte[256+r10], 3
;        mov byte[272+r10], 3
;        mov byte[288+r10], 3
;        mov byte[304+r10], 3
;        mov byte[320+r10], 3
;        mov byte[336+r10], 3
;        mov byte[352+r10], 3
;        mov byte[368+r10], 3
;        mov byte[384+r10], 3
;        mov byte[400+r10], 3
;        mov byte[416+r10], 3
;        mov byte[432+r10], 3
;        mov byte[448+r10], 3
;        mov byte[464+r10], 3
;        mov byte[480+r10], 3
;        mov byte[496+r10], 3

        add     r10, 256
        cmp     r10, rsi    
        jb      .L2
        
        dec     rdx
        jnz     .L1

        pop r10
        ret

Thirtytwo_Byte_Walk:
        push r10
        add     rsi, rdi
        sub rsi, 512
.L1:
        mov     r10, rdi
.L2:
        mov byte[384+r10], 0  
        mov byte[288+r10], 1  
        mov byte[64+r10], 0 
        mov byte[480+r10], 1  
        mov byte[128+r10], 0 
        mov byte[416+r10], 1  
        mov byte[192+r10], 0  
        mov byte[224+r10], 1  
        mov byte[256+r10], 0 
        mov byte[32+r10], 1
        mov byte[320+r10], 0 
        mov byte[352+r10], 1 
        mov byte[0+r10], 0
        mov byte[160+r10], 1
        mov byte[448+r10], 0
        mov byte[96+r10], 1

        add     r10, 512  
        cmp     r10, rsi   
        jb      .L2

        dec     rdx
        jnz     .L1

        pop r10
        ret

Sixtyfour_Byte_Walk:
        push r10
        add     rsi, rdi
        sub rsi, 1024
.L1:
        mov     r10, rdi
.L2:
        mov byte[896+r10], 1  
        mov byte[704+r10], 0  
        mov byte[128+r10], 1   
        mov byte[192+r10], 0  
        mov byte[320+r10], 1 
        mov byte[256+r10], 0  
        mov byte[384+r10], 1  
        mov byte[832+r10], 0  
        mov byte[960+r10], 1 
        mov byte[576+r10], 0 
        mov byte[640+r10], 1 
        mov byte[64+r10], 0
        mov byte[768+r10], 1 
        mov byte[448+r10], 0
        mov byte[0+r10], 1
        mov byte[512+r10], 0

        add     r10, 1024  
        cmp     r10, rsi   
        jb      .L2

        dec     rdx
        jnz     .L1

        pop r10
        ret

Onetwentyeight_Byte_Walk:
        push r10
        add     rsi, rdi
        sub rsi, 2048
.L1:
        mov     r10, rdi
.L2:
        mov byte[640+r10], 1
        mov byte[256+r10], 1
        mov byte[128+r10], 1
        mov byte[1664+r10], 1
        mov byte[512+r10], 1
        mov byte[0+r10], 1
        mov byte[768+r10], 1
        mov byte[1408+r10], 1
        mov byte[1920+r10], 1
        mov byte[1152+r10], 1
        mov byte[1280+r10], 1
        mov byte[896+r10], 1
        mov byte[1536+r10], 1
        mov byte[384+r10], 1
        mov byte[1792+r10], 1
        mov byte[1024+r10], 1

        add     r10, 2048
        cmp     r10, rsi
        jb      .L2

        dec     rdx
        jnz     .L1

        pop r10
	ret
