Pergunta

Pelo que entendi lendo os manuais da Intel, deveria ser possível escrever uma instrução como add $0x7f, %ebx e deve ser codificado como 83 /0 ib para um total de três bytes.

No entanto, quando faço isso (se eu uso add, addb, ou addl) sempre "promove" o valor imediato para um valor de 32 bits e codifica como 81 /0 id e ocupa seis bytes.O mesmo problema existe com adc, sub, etc.Observe que estou usando a sintaxe AT&T com GNU as.

Estou há mais de um dia procurando uma solução e não a encontro.Alguém pode aconselhar?

Foi útil?

Solução

Surpreendentemente, não tenho esse problema.

Peguei esse código assembly produzido por gcc (DJGPP):

        .file   "im.c"
.globl _x
        .section        .bss
        .p2align 2
_x:
        .space 4
        .section .text
        .p2align 4,,15
.globl _main
_main:
        pushl   %ebp
        movl    %esp, %ebp
        pushl   %eax
        pushl   %eax
        movl    _x, %eax
        andl    $-16, %esp
        addl    $127, %eax
        movl    %eax, _x
        movl    %ebp, %esp
        xorl    %eax, %eax
        popl    %ebp
        ret
        .ident  "GCC: (GNU) 3.3.4"

E compilou com as e é isso que estou vendo em a.out:

55                push ebp
89E5              mov ebp,esp
50                push eax
50                push eax
A100000000        mov eax,[0x0]
83E4F0            and esp,byte -0x10
83C07F            add eax,byte +0x7f
A300000000        mov [0x0],eax
89EC              mov esp,ebp
31C0              xor eax,eax
5D                pop ebp
C3                ret

E o programa C era:

volatile int x = 0;

int main(void)
{
  x += 0x7F;
  return 0;
}

Tem certeza de que seu operando imediato pode ser representado como um número inteiro com sinal de 8 bits?Se estiver fora da faixa de -128 a +127, o montador terá que usar uma codificação mais longa.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top