gpt4 book ai didi

assembly - 如何在 x86 上使用 AT&T 语法将立即字节添加到长寄存器?

转载 作者:行者123 更新时间:2023-12-02 14:43:17 24 4
gpt4 key购买 nike

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

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

我已经找了一天多的解决方案了,但还没有找到。有谁可以指教一下吗?

最佳答案

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

我采用了 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 范围,汇编器将不得不使用更长的编码。

关于assembly - 如何在 x86 上使用 AT&T 语法将立即字节添加到长寄存器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8409707/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com