I have read that it would be a good idea to avoid jumps/branches
; ***************************
; *** Verify 32 bits file ***
; ***************************
@Pgm_32_Bits :
xor r12w,r12w
mov r14b,1
mov r13w,1
cmp WORD PTR [rax].IMAGE_NT_HEADERS32.FileHeader.SizeOfOptionalHeader,SIZEOF IMAGE_OPTIONAL_HEADER64
cmovne r13w,r12w
and r14b,r13b
cmp WORD PTR [rax].IMAGE_NT_HEADERS32.OptionalHeader.Subsystem,IMAGE_SUBSYSTEM_WINDOWS_GUI
cmovne r13w,r12w
and r14b,r13b
cmp WORD PTR [rax].IMAGE_NT_HEADERS32.OptionalHeader.NumberOfRvaAndSizes,IMAGE_NUMBEROF_DIRECTORY_ENTRIES
cmovne r13w,r12w
and r14b,r13b
jz @Error_02
Before I had the following shorter code. Which one is the best?
; ***************************
; *** Verify 32 bits file ***
; ***************************
@Pgm_32_Bits :
cmp WORD PTR [rax].IMAGE_NT_HEADERS32.FileHeader.SizeOfOptionalHeader,SIZEOF IMAGE_OPTIONAL_HEADER64
je ERREUR
cmp WORD PTR [rax].IMAGE_NT_HEADERS32.OptionalHeader.Subsystem,IMAGE_SUBSYSTEM_WINDOWS_GUI
je ERREUR
cmp WORD PTR [rax].IMAGE_NT_HEADERS32.OptionalHeader.NumberOfRvaAndSizes,IMAGE_NUMBEROF_DIRECTORY_ENTRIES
je ERREUR
Hi Philippe,
Both of the options are looking good. By the way, no need to optimize every section of your code.
Yes Vortex, but it is interesting to see what the cpu does.@Loop :
mov [rdi].SECTION_FOUND.Index,r8
lea rcx,[rdi].SECTION_FOUND.Section
movdqu xmm1,OWORD PTR [rsi].IMAGE_SECTION_HEADER.Name
movdqu OWORD PTR [rcx].IMAGE_SECTION_HEADER.Name,xmm1
movdqu xmm1,OWORD PTR [rsi].IMAGE_SECTION_HEADER.SizeOfRawData
movdqu OWORD PTR [rcx].IMAGE_SECTION_HEADER.SizeOfRawData,xmm1
movq mm0,QWORD PTR [rsi].IMAGE_SECTION_HEADER.NumberOfRelocations
movq QWORD PTR [rcx].IMAGE_SECTION_HEADER.NumberOfRelocations,mm0
add rdi,SIZEOF SECTION_FOUND
add rsi,SIZEOF IMAGE_SECTION_HEADER
add r8,1
sub rdx,1
jnz @Loop
emms
ret
Here I avoid memcpy I have 96 sections to copy
I think it could be better like this:
@Loop :
mov [rdi].SECTION_FOUND.Index,r8
lea rcx,[rdi].SECTION_FOUND.Section
movdqu xmm1,OWORD PTR [rsi].IMAGE_SECTION_HEADER.Name
movdqu xmm2,OWORD PTR [rsi].IMAGE_SECTION_HEADER.SizeOfRawData
movq mm0,QWORD PTR [rsi].IMAGE_SECTION_HEADER.NumberOfRelocations
movdqu OWORD PTR [rcx].IMAGE_SECTION_HEADER.Name,xmm1
movdqu OWORD PTR [rcx].IMAGE_SECTION_HEADER.SizeOfRawData,xmm2
movq QWORD PTR [rcx].IMAGE_SECTION_HEADER.NumberOfRelocations,mm0
add rdi,SIZEOF SECTION_FOUND
add rsi,SIZEOF IMAGE_SECTION_HEADER
add r8,1
sub rdx,1
jnz @Loop
emms
ret