이 과제가 다소 어려워서 StackOverflow가 무수히 도움이 되었기 때문에 게시하고 있습니다. 바라기를 이것은 누군가 다른 사람을 도울 것입니다.NASM에서 배열을 어떻게 정렬합니까?
문제 설명 : 0의 값으로 종료 정수 N에
읽기 (제로 사용되지 않음). 이 숫자를 오름차순으로 정렬하여 인쇄하십시오. 0 값 이전에 데이터가 입력되지 않았거나 너무 많은 데이터가 입력되어 배열을 오버플로하는 경우 오류 메시지가 생성되어야합니다. 이 프로그램은 최대 100 개의 정수 값을 처리 할 수 있어야합니다.
접근법 : I는 거품 정렬을 사용하기로 결정
그것은 각 값에 보이는 다음의 값과 비교 크기 N. 배열의 배열 N 배의 각 값을 통해 어떤 반복; 첫 번째 값이 다음 값보다 높으면 스위치가 전환됩니다. 이것도 내림차순으로 나열 할 수 있도록 쉽게 수정할 수 있습니다. 어쨌든 여기서 가장 어려운 점은 nasm에서 중첩 된 루프를 처리하고 모든 ecx 값과 그 밖의 것들을 적절하게 반복하는 것입니다. 게시하는 코드는 잘 주석 처리되었습니다. 또한 질문과 마찬가지로 건설적인 비판도 환영합니다. 이 프로젝트에
반사 :
는 차라리 EBX를 사용하는 것보다, 배열의 요소를 통해 갈 수있는 더 좋은 방법이있을 수있다 생각합니다. Masm은 값을 반복하는 데 사용할 수있는 포인터를 가지고 있습니다. 이 코드는 작동하고 요구 사항을 충족하지만 아마도 더 좋을 수 있습니다. 또한 버블 정렬은 그것을 수행하는 최선의 방법이 아닐 수도 있습니다. 나는 다른 정렬 알고리즘이 있다는 것을 알고 있지만, 버블은 nasm에서 구현하는 것이 가장 쉬운 것처럼 보였다.
그것은 101 번째 값을 저장하지 않습니다. 101 번째 int를 읽으면 toomanyints로 점프합니다. 배열에 값을 쓰기 전에 ex와 100을 비교합니다. 또한, 0 기반 인덱싱에 관해서는, 내가 생각했던 [intArray]는 첫 번째 값을 가리키고 [intArray + ecx * 4]는 배열의 길이가 ex 인 이벤트에서 널 포인터 예외에 해당하는 것을 던질 것입니다. 배열의 값이 100 인 경우 첫 번째 값은 [intArray]이고 마지막 값은 [intArray + 4 * 99]입니다. 하지만 버블 정렬을 위해서는 n-1 비교에 대해 당신이 맞다고 생각합니다. – amaleemur
그리고 스택에 두 개 이상의 값이 없습니다. 첫 번째 ecx (나중에 쓸 값 수)를 누른 다음 ecx-1 (외부 루프를 실행해야하는 횟수)을 푸시합니다. – amaleemur
하지만 의견에 감사드립니다! 나는이 문제가 문제가 정한대로 실행될 때이 질문에 완전히 대답했다고 생각했다. 어셈블리 언어는 까다 롭고 미래의 학생들을 돕기를 희망하며, 나는 당신이 지적한 코멘트를 바꾸기로 결정했습니다. – amaleemur