Как добавить непосредственный байт в длинный регистр с синтаксисом AT&T на x86?
-
29-10-2019 - |
Вопрос
Насколько я понимаю, читая руководства 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, ассемблер должен будет использовать более длительный кодировку.