4

Intelのマニュアルを読んで理解していることから、次のような命令を記述できるはずであり、合計3バイトadd $0x7f, %ebxとしてエンコードされている必要があります。83 /0 ib

ただし、これを行うと(、、、またはを使用するかどうかに関係なくaddaddbaddl常に即値を32ビット値に「プロモート」し、81 /0 id6バイトとしてエンコードして使用します。adc、などにも同じ問題がありsubます。GNUでAT&T構文を使用していることに注意してくださいas

私は1日以上解決策を探していましたが、見つかりませんでした。誰かアドバイスしてもらえますか?

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 に答える