4

根据我阅读英特尔手册的理解,应该可以编写类似的指令add $0x7f, %ebx,并且应该将其编码为83 /0 ib总共三个字节。

但是,当我这样做时(无论我使用addaddb还是addl),它总是将立即值“提升”为 32 位值并编码为81 /0 id并占用六个字节。adc,等也存在同样的问题sub。请注意,我在 GNU 中使用 AT&T 语法as

我一直在寻找解决方案超过一天,但没有找到。有人可以请教吗?

4

1 回答 1

2

令人惊讶的是,我没有这样的问题。

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"

并编译它,as这就是我在 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

C程序是:

volatile int x = 0;

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

您确定您的直接操作数可以表示为 8 位有符号整数吗?如果它在 -128 到 +127 范围之外,汇编器将不得不使用更长的编码。

于 2011-12-07T03:27:28.557 回答