根据我阅读英特尔手册的理解,应该可以编写类似的指令add $0x7f, %ebx
,并且应该将其编码为83 /0 ib
总共三个字节。
但是,当我这样做时(无论我使用add
、addb
还是addl
),它总是将立即值“提升”为 32 位值并编码为81 /0 id
并占用六个字节。adc
,等也存在同样的问题sub
。请注意,我在 GNU 中使用 AT&T 语法as
。
我一直在寻找解决方案超过一天,但没有找到。有人可以请教吗?
根据我阅读英特尔手册的理解,应该可以编写类似的指令add $0x7f, %ebx
,并且应该将其编码为83 /0 ib
总共三个字节。
但是,当我这样做时(无论我使用add
、addb
还是addl
),它总是将立即值“提升”为 32 位值并编码为81 /0 id
并占用六个字节。adc
,等也存在同样的问题sub
。请注意,我在 GNU 中使用 AT&T 语法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 范围之外,汇编器将不得不使用更长的编码。