【发布时间】:2015-12-05 04:27:58
【问题描述】:
我一直在试图弄清楚如何为我的程序编写一个 x86 GAS 交换函数。我知道做 xchg 或者只写 C 更容易,但我还是希望能够把它写出来。
在我的第一次期中考试中,我们被赋予了这个作为交换功能:
movl 8(%ebp), %edx
movl 12(%ebp), %ecx
movl (%edx), %ebx
movl (%ecx), %eax
movl %eax, (%edx)
movl %ebx, (%ecx)
但我在运行此程序时收到分段错误。无法在网络上的其他任何地方成功找到我的答案,我们将不胜感激。
编辑:
C 代码:
void program2()
{
int numA[2] = {5,10};
int *num1 = &numA[0];
int *num2 = &numA[1];
int loop=0;
printf("stop3\n");
for(loop=0;loop<=10;loop++)
{
*num1 *=2;
*num2 *=3;
printf("%d\n%d\n",*num1,*num2);
_asSwap(*num1,*num2);
printf("stop5\n");
printf("P2num1= %d\n P2num2= %d\n",*num1,*num2);
}
组装:
_asSwap:
push %ebp
movl %esp, %ebp
movl 8(%ebp), %edx
movl 12(%ebp), %ecx
movl (%edx), %ebx
movl (%ecx), %eax
movl %eax, (%edx)
movl %ebx, (%ecx)
pop %ebp
ret
【问题讨论】:
-
在我看来,提供的 2 个参数是指向 32 位整数的指针?如果您没有将指向整数的指针传递给此代码,那么我很可能希望它会出现段错误。也许您只是传递整数值而不是指向整数的指针?
-
好的,我现在就试试指针。
-
不,没用。至少,不是指向数组的指针。这是我的 C 代码
void program2() { int numA[2] = {5,10}; int *num1 = &numA[0]; int *num2 = &numA[1]; int loop=0; printf("stop3\n"); for(loop=0;loop<=10;loop++) { *num1 *=2; *num2 *=3; printf("%d\n%d\n",*num1,*num2); _asSwap(*num1,*num2); printf("stop5\n"); printf("P2num1= %d\n P2num2= %d\n",*num1,*num2); } -
我得看看整个汇编函数以及它是如何被调用的。
标签: linux assembly x86 segmentation-fault swap