【发布时间】:2017-04-22 18:24:29
【问题描述】:
我想交换两个 int 指针。
我可以像这样在 C 中做到这一点
void swap(int* a, int* b)
int temp = *a;
*a = *b;
*b=temp;
现在我正在尝试在组装中进行,但请耐心等待,我不明白为什么这不起作用
push %ebp
mov %esp,%ebp
mov 8(%ebp), %ecx #a
mov 12(%ebp), %ebx #b
mov (%ecx), %eax #move o a para temp
mov (%ebx), %ecx #move o b para o a
mov (%eax), %ebx #move o temp para o b
mov %ebp, %esp
pop %ebp
ret
谁能解释我做错了什么?
【问题讨论】:
-
因为您需要编写
mov (%ebx), (%ecx)来执行*b = *a;,而 x86 不允许两个操作数都是间接的(movs除外)。 -
C 代码不会“交换两个 int 指针”。它正在交换它们指向的数据。
-
我很惊讶还没有人提到
xchg。 -
@DanielKamilKozar
xchg对此没有多大帮助,而且它比加载和存储要慢得多。 -
@DanielKamilKozar :您不想在这里将
xchg与内存操作数一起使用,因为这会将 LOCK 应用于指令。为避免这种情况,您必须将内存操作数移动到寄存器中并 xchg 寄存器,但是当您这样做时,您还不如使用mov。
标签: assembly x86 gnu-assembler att cdecl