Por que o algoritmo “start small” para deslocamento de ramificação não é ideal?

[pergunta em negrito na parte inferior]

Quando um assembler gera uma codificação binária, ele precisa decidir se deseja tornar cada ramificação longa ou curta, sendo a curta melhor, se possível. Essa parte do montador é chamada dealgoritmo de otimização de deslocamento de ramificação (BDO). Uma abordagem típica é que o montador faztudo as codificações de ramificações são curtas (se elas são menores que um limite), então aumenta iterativamente todos os ramificações que saltam para comprimentos que não atingem. Obviamente, isso pode fazer com que outros ramos sejam convertidos em saltos longos. Portanto, o montador deve continuar passando pela lista de atalhos até que não seja necessário mais upsizing. Essa abordagem de tempo quadrático parece ser um algoritmo ideal para mim, mas supostamente o BDO é NP completo e essa abordagem não é realmente ideal.

Randall Hyde forneceu um contra-exemplo:

                  .386 
                  .model  flat, syscall
00000000          .code
00000000          _HLAMain        proc


00000000  E9 00000016          jmpLbl:         jmp     [near ptr] target
00000005 = 00000005            jmpSize         =       $-jmpLbl
00000005  00000016 [                           byte    32 - jmpSize*2
dup
(0)
            00
           ]
0000001B                       target:
0000001B                       _HLAMain        endp
                                                end

Adicionando a peça entre colchetes "[near ptr]" e forçando uma codificação de 5 bytes, o binário acaba sendo mais curto, porque a matriz alocada é menor, dobrando a quantidade do tamanho do salto. Assim, diminuindo a codificação de salto, o código final é realmente mais longo.

Este parece ser um caso extremamente patológico para mim, e não é realmente relevante porque as codificações de ramificação ainda são menores, é apenas esse efeito colateral bizarro em uma parte não ramificada do programa, que faz com que o binário fique maior. Como as próprias codificações de ramificação ainda são menores, não considero realmente um contra-exemplo válido para o algoritmo "start small".

Posso considerar o algoritmo start-small um ótimo algoritmo BDO ou existe umrealista caso em que ele não fornece um tamanho mínimo de codificação para todas as ramificações?

questionAnswers(2)

yourAnswerToTheQuestion