我正在尝试用汇编语言编写函数类。它将对二维数组进行排序,使得行现在将按字母顺序包含数据。 我尝试了很多东西,但它实际上超出了我目前的知识。 这是我到目前为止所尝试的......
.386
public _Sort
.model flat
.code
_Sort proc
push ebp
mov ebp, esp
push esi
push edi
mov edi, [esp + 4] ; address of destination array
mov esi, [esp + 8] ; address of source array
mov ecx, [esp + 16] ; # of elements to mov
cld
rep movsd
L1:
mov eax, [esi]
cmp [esi + 8], eax
jg L2
xchg eax, [esi + 8]
mov [esi], eax
L2:
pop edi
pop esi
pop ebp
ret
_Sort endp
end
这是C ++代码......
#include <iostream>
using namespace std;
extern "C" int Sort (char [] [20], int, int);
void main ()
{
char Strings [10] [20]
= { "One",
"Two",
"Three",
"Four",
"Five",
"Six",
"Seven",
"Eight",
"Nine",
"Ten" };
int i;
cout << "Unsorted Strings are" << endl;
for (i = 0; i < 10; i++)
cout << '\t' << Strings [i] << endl;
Sort (Strings, 10, 20);
cout << "Sorted Strings are" << endl;
for (i = 0; i < 10; i++)
cout << '\t' << Strings [i] << endl;
}
我确实认识到我的集会没有意义,抱歉。
答案 0 :(得分:2)
您需要在函数/过程中构建汇编代码,就像使用其他语言编写代码一样。与C类似,字符串比较,复制等需要在函数中完成。仅举例:
; compares [esi] to [edi], returns +, 0 or - to indicate order
; inputs: esi, edi: addresses of strings
; destroys: esi, edi, edx
;
strcmp_int proc
jmp short start
loop_top:
inc esi
inc edi
start:
movsx eax, byte ptr [esi]
movsx edx, byte ptr [edi]
test edx, edx
jz @f
sub eax, edx
jz loop_top
ret
@@:
sub eax, edx
ret
strcmp_int endp
[警告:此代码不一定是按原样使用 - 只是您通常需要编写的一种函数的示例,以便在汇编语言中执行此类工作。这已经足够长了,因为我编写了很多汇编语言,你无疑可以在现代处理器上做得更好 - 至少对于纯粹用汇编语言完成的事情,你通常希望将结果放在标志中,而不是 - / 0 / +在strcmp
(和)这样的寄存器中产生。但请注意,此确实返回标记由最终sub
]
有关显式长度字符串的优化实现(SSE2 / AVX2)的一些链接,请参见Why is memcmp so much faster than a for loop check?,对于中长字符串,这可能要快得多。有关优化链接,请参阅the x86 tag wiki。
您的sort
将取决于您决定实施的排序算法。显然,Quicksort看起来与插入排序看起来不一样。然而,要点很简单:不要试图把它写成一个单一的整块代码 - 将它分解成易于编写和理解的部分。