gpt4 book ai didi

c - 在 GNU C 内联汇编中用 push/assignment/pop 交换?

转载 作者:行者123 更新时间:2023-12-02 06:02:27 25 4
gpt4 key购买 nike

我在这里阅读了一些答案和问题,并不断提出这个建议,但我注意到没有人真正“确切地”解释过你需要做什么,在 Windows 上使用 Intel 和 GCC 编译器。下面的评论正是我想要做的。

#include <stdio.h>

int main()
{
int x = 1;
int y = 2;
//assembly code begin
/*
push x into stack; < Need Help
x=y; < With This
pop stack into y; < Please
*/
//assembly code end
printf("x=%d,y=%d",x,y);
getchar();
return 0;
}

最佳答案

如果要移植到具有红色区域的系统,您不能仅从内联 asm 中安全地推送/弹出。这包括每个非 Windows x86-64 平台。 (There's no way to tell gcc you want to clobber it)。好吧,您可以先添加 rsp,-128 以在推送/弹出任何内容之前跳过红色区域,然后再恢复它。但是你不能使用 "m" 约束,因为编译器可能会使用 RSP 相对寻址和假设 RSP 没有被修改的偏移量。

但在内联汇编中这样做真的很荒谬。

下面是如何使用 inline-asm 交换两个 C 变量:

#include <stdio.h>

int main()
{
int x = 1;
int y = 2;

asm("" // no actual instructions.
: "=r"(y), "=r"(x) // request both outputs in the compiler's choice of register
: "0"(x), "1"(y) // matching constraints: request each input in the same register as the other output
);
// apparently "=m" doesn't compile: you can't use a matching constraint on a memory operand

printf("x=%d,y=%d\n",x,y);
// getchar(); // Set up your terminal not to close after the program exits if you want similar behaviour: don't embed it into your programs
return 0;
}

来自 the Godbolt compiler explorer 的 gcc -O3 输出(针对 x86-64 System V ABI,而非 Windows) :

.section .rodata
.LC0:
.string "x=%d,y=%d"
.section .text
main:
sub rsp, 8
mov edi, OFFSET FLAT:.LC0
xor eax, eax
mov edx, 1
mov esi, 2
#APP
# 8 "/tmp/gcc-explorer-compiler116814-16347-5i3lz1/example.cpp" 1
# I used "\n" instead of just "" so we could see exactly where our inline-asm code ended up.

# 0 "" 2
#NO_APP
call printf
xor eax, eax
add rsp, 8
ret

C 变量是一个高级概念;决定相同的寄存器现在逻辑上保存不同的命名变量,而不是在不更改 varname->register 映射的情况下交换寄存器内容,这不需要任何成本。

在手写 asm 时,使用注释来跟踪不同寄存器或 vector 寄存器部分的当前逻辑含义。


inline-asm 也不会导致 inline-asm block 之外的任何额外指令,因此在这种情况下它非常有效。尽管如此,编译器仍无法看穿它,并且不知道值仍然是 1 和 2,因此进一步的常量传播将被击败。 https://gcc.gnu.org/wiki/DontUseInlineAsm

关于c - 在 GNU C 内联汇编中用 push/assignment/pop 交换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17921591/

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