Assembly 冒泡排序后的访问冲突写入位置 /* 对于i=0到n-1 do 对于j=n到i+1 do if(向量[j-1]错误准确地发生在哪里?您是否尊重编译器使用的调用约定?我确实想知道为什么您会费心用汇编优化冒泡排序…由于排序算法是最慢的,我相信编译器自己会做得很好
冒泡排序后的访问冲突写入位置Assembly 冒泡排序后的访问冲突写入位置 /* 对于i=0到n-1 do 对于j=n到i+1 do if(向量[j-1]错误准确地发生在哪里?您是否尊重编译器使用的调用约定?我确实想知道为什么您会费心用汇编优化冒泡排序…由于排序算法是最慢的,我相信编译器自己会做得很好,assembly,visual-c++,x86,bubble-sort,Assembly,Visual C++,X86,Bubble Sort,冒泡排序后的访问冲突写入位置 /* 对于i=0到n-1 do 对于j=n到i+1 do if(向量[j-1]错误准确地发生在哪里?您是否尊重编译器使用的调用约定?我确实想知道为什么您会费心用汇编优化冒泡排序…由于排序算法是最慢的,我相信编译器自己会做得很好;优化汇编会更好d是一个更复杂的问题。只要看一看你的代码,我怀疑问题不是你的类型…问题更可能是你没有告诉编译器哪个寄存器是你的clobber。因此,它期望某些值仍然是你的汇编代码运行之前的值,然后它对它们进行操作,创建access violat
/*
对于i=0到n-1 do
对于j=n到i+1 do
if(向量[j-1]错误准确地发生在哪里?您是否尊重编译器使用的调用约定?我确实想知道为什么您会费心用汇编优化冒泡排序…由于排序算法是最慢的,我相信编译器自己会做得很好;优化汇编会更好d是一个更复杂的问题。只要看一看你的代码,我怀疑问题不是你的类型…问题更可能是你没有告诉编译器哪个寄存器是你的clobber。因此,它期望某些值仍然是你的汇编代码运行之前的值,然后它对它们进行操作,创建access violation。@MargaretBloom如果我在块asm之后做任何事情都会发生。@MichaelPetch非常感谢,现在它可以工作了。错误到底发生在哪里?你尊重你的编译器正在使用的调用约定吗?我真的想知道为什么你会费心用汇编优化冒泡排序…因为它是最慢的排序算法如果是这样的话,我相信编译器自己会做得很好;对汇编进行优化更适合于更复杂的事情。只要看一看你的代码,我怀疑问题不是你的类型…问题更可能是你没有告诉编译器哪个注册了你的clobber。因此,它希望n值仍然是程序集代码运行之前的值,然后它对它们进行操作,从而创建访问冲突。@MargaretBloom如果我在块asm之后执行任何操作,就会发生这种情况。@MichaelPetch非常感谢,现在它可以工作了。
/*
for i=0 to n-1 do
for j=n to i+1 do
if (vector[j-1]<vector[j])
swap(vector[j-1],vector[j])
end_if
end_for
end_for
*/
#include <iostream>
using namespace std;
void bubbleSort(int *v) {
int n = 19;
for (int i = 0; i < 20; i++)
{
printf("<%d> ", v[i]);
}
_asm
{
mov esi, v
mov ebx, n
mov ecx, 0
loopi:
mov edi, esi
mov edx, n
loopj:
mov eax, [edi + 4 * 18]
mov esp, [edi + 4 * 19]
cmp eax, esp
jb no_swap
xchg eax, [edi + 4 * 19] // swap
mov [edi + 4 * 18], eax
no_swap :
sub edi, 4
dec edx
cmp edx, ecx
ja loopj
inc ecx
cmp ecx, ebx
jb loopi
}
printf("%d\n", v[1]);
for (int i = 0; i < 20; i++)
{
printf("%d\n", v[i]);
}
}
int main() {
int vector[20] = {1,3,4,5,2,10,13,15,6,9,20,7,11,19,8,12,18,14,17,16};
bubbleSort(vector);
/*for (int i = 0; i < 20; i++)
{
printf("%d\n",vector[i]);
}*/
return 0;
}