NO

Author Topic: don't have too many branches  (Read 1311 times)

HellOfMice

  • Guest
don't have too many branches
« on: February 11, 2025, 09:45:55 AM »
I have read that it would be a good idea to avoid jumps/branches
Code: [Select]

;   ***************************
;   *** 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?

Code: [Select]

;   ***************************
;   *** 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

Offline Vortex

  • Member
  • *
  • Posts: 990
    • http://www.vortex.masmcode.com
Re: don't have too many branches
« Reply #1 on: February 11, 2025, 10:49:37 AM »
Hi Philippe,

Both of the options are looking good. By the way, no need to optimize every section of your code.
Code it... That's all...

HellOfMice

  • Guest
Re: don't have too many branches
« Reply #2 on: February 11, 2025, 11:36:05 AM »
Yes Vortex, but it is interesting to see what the cpu does.
Code: [Select]
@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:
Code: [Select]
@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
« Last Edit: February 11, 2025, 11:38:28 AM by HellOfMice »