这是我的汇编程序,它只是交换* 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)
答案 0 :(得分:1)
也许你可以使用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源和目的地都不能用指令访问存储器。只有一个能够在每一条指令中使用。所以我就是那样用的。