Algorithm 有没有一种更简单的方法来编写masm模块化风格的冒泡排序算法?
我在汇编中编写了一个冒泡排序算法,我为自己感到自豪,但同时我认为我的冒泡排序是错误的 有人能告诉我这是否正确吗?我如何使我的程序更加模块化,以便以后可以重用它Algorithm 有没有一种更简单的方法来编写masm模块化风格的冒泡排序算法?,algorithm,sorting,assembly,masm,Algorithm,Sorting,Assembly,Masm,我在汇编中编写了一个冒泡排序算法,我为自己感到自豪,但同时我认为我的冒泡排序是错误的 有人能告诉我这是否正确吗?我如何使我的程序更加模块化,以便以后可以重用它 .386 .model flat,stdcall .stack 100h printf proto c arg1:ptr byte, printlist:vararg .data array dword 8,9,10,40,80,0 fmtmsg2 db 0dh,0ah,0 fmtmsg1 db "%d ",0 .code
.386
.model flat,stdcall
.stack 100h
printf proto c arg1:ptr byte, printlist:vararg
.data
array dword 8,9,10,40,80,0
fmtmsg2 db 0dh,0ah,0
fmtmsg1 db "%d ",0
.code
public main
main proc
mov ecx,0
mov edx,0
mov esi,offset array
innerloop:
inc ecx
cmp ecx,5
je outerloop
mov eax,[esi]
cmp eax,[esi + 4]
Jge noexchange
;exchange values
xchg eax,[esi+4]
mov [esi],eax
noexchange:
add esi,4
jmp innerloop
outerloop:
mov esi,offset array
;inner loop counter
mov ecx,0
;outer loop counter
inc edx
cmp edx,5
jne innerloop
;loop 3 counter
mov edx,0
;load array offset
mov esi,offset array
loop3:
mov eax,[esi]
push edx
invoke printf,addr fmtmsg1,eax
pop edx
add esi,4
inc edx
cmp edx,5
jne loop3
invoke printf,addr fmtmsg2
ret
main endp
end main
您的原始算法非常有效(祝贺您)。它按降序排列数组,例如,如果数组为[1,2,3,4,5],则结果为[5,4,3,2,1]。如果您希望它按升序排列,只需更改一条指令。我使用了Visual Studio 2010,但代码是相同的(我的更改由箭头指示,但您只需要一个更改:“jbe”):
void death\u反向(){
int array[5]={5,4,3,2,1};//“如果正确,请告诉我”-我们不是来为您进行测试的。发布数组声明。如果您希望获得代码反馈而不是代码帮助,我建议将此迁移到codereview
void death_reverse () {
int array[5] = { 5,4,3,2,1 }; // <=====================
__asm { mov ecx,0
mov edx,0
lea esi, array // <=====================
innerloop:
inc ecx
cmp ecx,5
je outerloop
mov eax,[esi]
cmp eax,[esi + 4]
Jbe noexchange // <=============== ASCENDING ORDER.
;exchange values
xchg eax,[esi+4]
mov [esi],eax
noexchange:
add esi,4
jmp innerloop
outerloop:
lea esi, array // <=====================
;inner loop counter
mov ecx,0
;outer loop counter
inc edx
cmp edx,5
jne innerloop
;loop 3 counter
mov edx,0
;load array offset
lea esi, array // <=====================
loop3:
mov eax,[esi]
push edx
invoke printf,addr fmtmsg1,eax
pop edx
add esi,4
inc edx
cmp edx,5
jne loop3
invoke printf,addr fmtmsg2
}
}