2014-11-06 3 views
0

이 과제가 다소 어려워서 StackOverflow가 무수히 도움이 되었기 때문에 게시하고 있습니다. 바라기를 이것은 누군가 다른 사람을 도울 것입니다.NASM에서 배열을 어떻게 정렬합니까?

문제 설명 : 0의 값으로 종료 정수 N에

읽기 (제로 사용되지 않음). 이 숫자를 오름차순으로 정렬하여 인쇄하십시오. 0 값 이전에 데이터가 입력되지 않았거나 너무 많은 데이터가 입력되어 배열을 오버플로하는 경우 오류 메시지가 생성되어야합니다. 이 프로그램은 최대 100 개의 정수 값을 처리 할 수 ​​있어야합니다.

접근법 : I는 거품 정렬을 사용하기로 결정

그것은 각 값에 보이는 다음의 값과 비교 크기 N. 배열의 배열 N 배의 각 값을 통해 어떤 반복; 첫 번째 값이 다음 값보다 높으면 스위치가 전환됩니다. 이것도 내림차순으로 나열 할 수 있도록 쉽게 수정할 수 있습니다. 어쨌든 여기서 가장 어려운 점은 nasm에서 중첩 된 루프를 처리하고 모든 ecx 값과 그 밖의 것들을 적절하게 반복하는 것입니다. 게시하는 코드는 잘 주석 처리되었습니다. 또한 질문과 마찬가지로 건설적인 비판도 환영합니다. 이 프로젝트에

반사 :

는 차라리 EBX를 사용하는 것보다, 배열의 요소를 통해 갈 수있는 더 좋은 방법이있을 수있다 생각합니다. Masm은 값을 반복하는 데 사용할 수있는 포인터를 가지고 있습니다. 이 코드는 작동하고 요구 사항을 충족하지만 아마도 더 좋을 수 있습니다. 또한 버블 정렬은 그것을 수행하는 최선의 방법이 아닐 수도 있습니다. 나는 다른 정렬 알고리즘이 있다는 것을 알고 있지만, 버블은 nasm에서 구현하는 것이 가장 쉬운 것처럼 보였다.

답변

1

질문에 해결책을 포함시키는 것이 더 좋았을 것입니다. 이제 문제는 이미 대답되었고 더 이상 관심을 필요로하지 않은 것처럼 보였습니다. 다행히도 여기에 대한 나의 생각은 다음과 같습니다.

레이블 tooManyInts로 점프하기 전에 많은 입력을 저장하므로 101 더블 워드로 어레이를 초기화해야합니다.
ECX를 감소시킬 때 주석을다는 것은 0부터 시작하는 인덱싱 때문입니다. 이것은 사실이 아닙니다. 일련의 N 요소가 N-1 비교를 요구하기 때문입니다.
스택에 무엇이 있는지 추적하기가 어렵습니다. 이 같은 코멘트를 조금 더 하시길 권합니다.

push ecx ;(1) 
dec ecx 
push ecx ;(2) 
... 
loop L3 
pop ecx  ;(2) 
SetWrite: 
xor ebx,ebx 
pop ecx  ;(1) 
+0

그것은 101 번째 값을 저장하지 않습니다. 101 번째 int를 읽으면 toomanyints로 점프합니다. 배열에 값을 쓰기 전에 ex와 100을 비교합니다. 또한, 0 기반 인덱싱에 관해서는, 내가 생각했던 [intArray]는 첫 번째 값을 가리키고 [intArray + ecx * 4]는 배열의 길이가 ex 인 이벤트에서 널 포인터 예외에 해당하는 것을 던질 것입니다. 배열의 값이 100 인 경우 첫 번째 값은 [intArray]이고 마지막 값은 [intArray + 4 * 99]입니다. 하지만 버블 정렬을 위해서는 n-1 비교에 대해 당신이 맞다고 생각합니다. – amaleemur

+0

그리고 스택에 두 개 이상의 값이 없습니다. 첫 번째 ecx (나중에 쓸 값 수)를 누른 다음 ecx-1 (외부 루프를 실행해야하는 횟수)을 푸시합니다. – amaleemur

+0

하지만 의견에 감사드립니다! 나는이 문제가 문제가 정한대로 실행될 때이 질문에 완전히 대답했다고 생각했다. 어셈블리 언어는 까다 롭고 미래의 학생들을 돕기를 희망하며, 나는 당신이 지적한 코멘트를 바꾸기로 결정했습니다. – amaleemur