x86汇编问题

时间:2010-05-03 12:10:36

标签: assembly x86

这是我的汇编程序,它只是交换* x * y的函数。 因此,main的第一个参数是8(%ebp)中的x的地址,第二个是y的地址在12(%ebp)中。 该程序交换x和y。 这样做需要7行。你能做到6行吗? 并且有一个条件是您只能使用%eax%ecx%edx 3个寄存器。 我考虑了这么多,但我不能做到6行。一定有办法,不是吗? 这可能不是什么大问题,但是如果有办法在6行中获得它,我想知道。

movl 8(%ebp), %eax
movl (%eax), %ecx
movl 12(%ebp), %edx
movl (%edx), %eax
movl %ecx, (%edx)
movl 8(%ebp), %ecx
movl %eax, (%ecx)

4 个答案:

答案 0 :(得分:1)

也许你可以使用xor swap技巧:

http://en.wikipedia.org/wiki/Xor_swap

答案 1 :(得分:1)

您使用的是哪种汇编程序,以及您要使用哪种处理器?

如果您使用的是MASM,则可以向寄存器添加偏移量,如下所示:

mov eax, ebp - 12
mov ecx, ebp - 8
mov ebp - 12, ecx
mov ebp - 8, eax

或者,您可以使用xchg指令并在3行中执行:

mov eax, ebp - 12
xchg ebp - 8, eax
xchg ebp - 12, eax

这看起来很简单,也许我错过了什么?

答案 2 :(得分:1)

摩托罗拉的语法并不是我的意思,但这里有5条指令:

movl 8(%ebp), %eax
movl (%eax), %ecx
movl 12(%ebp), %edx
xchg (%edx), %ecx
movl %ecx, (%eax)

请参阅Pascal关于较短可能较慢的评论。由于隐含的xchg %reg,(mem)前缀,lock很可能比重新加载地址慢。

答案 3 :(得分:0)

我懂了!!它基于xor swap技巧。但是有些不同^^;答案是

movl    8(%ebp), %eax 
movl    (%eax), %ecx 
movl    12(%ebp), %edx 
xorl    (%edx), %ecx
xorl    %ecx, (%eax) 
xorl    %ecx, (%edx) 
像这样继续使用一个内存访问。因为在x86源和目的地都不能用指令访问存储器。只有一个能够在每一条指令中使用。所以我就是那样用的。