【发布时间】:2021-07-21 03:47:31
【问题描述】:
我正在尝试做一个真正简单的汇编程序来交换寄存器的内容。这是我尝试过的:
movq (%rcx), %rax
movq (%rbx), %rdx
movq %rdx, (%rcx)
movq %rax, (%rbx)
ret
它给了我分段错误。
这是一个 c 中的工作程序示例:
void swap(int64_t *a, int64_t *b) {
int64_t c = *a;
*a = *b;
*b = c;
}
【问题讨论】:
-
你能解释一下你希望这些指令做什么吗?是哪一个导致了故障?
-
你是如何编译你的程序集的?请提供一个可重现的最小示例。
-
欢迎来到 StackOverflow!请使用tour 并阅读“How to Ask”。然后回来edit你的问题,请提供minimal reproducible example。
-
标题说“交换寄存器的内容”,但示例是关于内存位置的。要交换寄存器,您可以使用
xchg。 -
Godbolt 产生不同的程序集(寄存器使用,-O3 优化):godbolt.org/z/dYYeYYrz1
标签: c assembly segmentation-fault x86-64 calling-convention