Как добавить непосредственный байт в длинный регистр с синтаксисом AT&T на x86?

StackOverflow https://stackoverflow.com/questions/8409707

Вопрос

Насколько я понимаю, читая руководства Intel, должно быть возможно написать такую инструкцию, как add $0x7f, %ebx, и она должна быть закодирована как 83 /0 ib для всего трех байтов.

Однако, когда я это делаю (использую ли я add, addb или addl), он всегда «продвигает» непосредственное значение к 32-битному значению и кодируется как 81 /0 id и занимает шесть байт.Та же проблема существует с adc, sub и т. Д. Обратите внимание, что я использую синтаксис AT&T с GNU as.

Я искал решение больше дня и не нашел.Кто-нибудь может посоветовать?

Это было полезно?

Решение

Удивительно, у меня нет такой проблемы.

Я взял этот сборнический код, созданный 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, ассемблер должен будет использовать более длительный кодировку.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top