2012-07-23 2 views
0

인쇄하려고하는 배열이 있습니다. 올바른지 확인할 수 있도록 인쇄하고 싶습니다. 현재 1 번 인쇄 중입니다. 또는 ECX를 다르게 사용하면 다르게 0과 크래시가 인쇄됩니다.어셈블리 - 배열 요소 액세스

여기 내 프로그램입니다.

.data 

array DWORD 10 DUP(5, 7, 6, 1, 4, 3, 9, 2, 10, 8) 
my_size dd 10 

sorted DWORD 0 
first DWORD 0 
second DWORD 0 

.code 

start: 
main proc 
cls 

mov EBX, offset[array] 
mov ECX, [my_size] 
dec ECX 
sub ESI, ESI 
sub EDI, EDI 

; print 
mov EBX, offset aa 
sub ECX, ECX 
;mov ECX, my_size 
mov ECX, 10 

my_loop: 
mov EAX, [EBX] 
inc EBX 
dec ECX 

cmp ECX, 0 
jle exit_loop 

mov first, EAX 
print chr$("printing array elements: ") 
print str$(first) 

loop my_loop 

exit_loop: 
ret 

main endp 

; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ 

end start 
+1

. 숙제에 대해 [숙제] 태그를 사용하십시오. –

+0

셸 정렬이 더 빠릅니다 –

답변

0

난 당신이 코드를 단순화했습니다 참조하십시오. 좋은 생각! 나는 아직도 당신이 사용하고있는 매크로 "print_str $"에 익숙하지 않다. 그것은 숫자를 인쇄하는 것처럼 "보지"않습니다. "print_int $"또는 이와 비슷한 것이 있습니까? 첫 번째 숫자 "5"만 인쇄하면 좋은 시작이 될 것입니다.

이제 루프를 통해 작업하고 있습니다. "inc ebx"입니다. 그러면 다음 dword가 생기지 않을 것입니다. 첫 번째 dword에서 바이트 2, 3 및 4를 가져오고 두 번째 dword에서 첫 번째 바이트를 가져옵니다. (제거 된) 정렬 코드에 "* 4"를 사용 했으므로 여기에 "[ebx * 4]"가 필요합니다. 어느 쪽이든, 또는 매번 루프를 통해 ebx에 4를 더합니다. 하나 또는 다른 하나 (둘다는 아님)는 dword 배열을 단계별로 실행해야합니다.

첫 번째 단계는 숫자를 인쇄하는 "올바른"매크로를 선택하는 것입니다. 아마 거기에서 더 쉽게 될 것입니다 (?). 용기!:)

베스트, 프랭크 (N^2) 분류 알고리즘은 제로 * * 말이 오 작성 어셈블리를 사용

2

나는 싫지만 거품 정렬을 쓸 준비가되어 있지 않습니다. 그것은 완전히 미친 숙제이거나, 지금까지의 수업 (아마도 둘 다)을 따라 가지 않았습니다.

가장 먼저, 배열을 올바르게 정의했다고 생각하지 않습니다. 내가 당신의 코드를 읽었을 때, 당신은 거기에 100 개의 dwords를 가지고있다 - 당신이 지정한 10 개의 숫자 중 10 개의 복사본. 거기에 "DUP"가 필요하지 않아야합니다.

정렬되지 않은 배열을 먼저 인쇄하여 해당 부분이 올바른지 확인하십시오. 당신은 두 개의 매크로를 사용하고있는 것처럼 보입니다. 그냥 이름에서, 나는 "print_chr $"는 한 문자를 인쇄하고 "print_str $"는 문자열을 인쇄한다고 추측 하겠지만 (문자열과 숫자 1을 인쇄하는 것 같지만). 매크로 집합에 "print_int $"가 있다면, 원하는 것입니다 (!). 내가 매크로에 익숙하지 않으므로 잘못 될 수 있습니다.

배열을 "dword"로 정의했지만 정렬 루틴에서 한 바이트 만 비교합니다. 이것은 아마 당신이 사용하는 작은 숫자에 대해 작동하지만, 그것은 정말로 옳지 않습니다.

버블 정렬을 수행하는 일반적인 방법은 배열을 통과 할 때마다 "플래그"(레지스터 또는 변수 -이 값은 "정렬 된 값"일 수 있음)를 0으로 설정하고 1 당신이 스왑을 할 때마다. 배열을 통과하여 플래그가 여전히 0 인 경우 - 스왑을 수행하지 않은 경우 - 배열 만 정렬됩니다. 각 패스 후에 배열을 인쇄하면 "거품"정렬이라고하는 이유를 알 수 있습니다. 가장 작은/가장 큰 숫자는 최종 위치로 "버블 업"합니다.

dword 배열 (esi * 4)을 통과하는 코드는 바르게 보입니다 (바이트 비교 만 제외하고). 그러나 인쇄 루틴은 매번 루프를 통해 ebx를 하나씩 증가시킵니다. dwords를 인쇄하려면 "ebx, 4"또는 "ebx * 4"(둘 다 아님)를 사용하십시오. 아니면 당신의 배열은 단지 바이트라고 생각할 것입니까?

진지하게, 나는 더 간단한 것으로 시작할 것입니다 - 그냥 배열을 인쇄하고 - 작업을 마친 후에 정렬 루틴을 추가하는 작업을하십시오.

희망이 있습니다.

최저

, 프랭크

+0

dword 배열 (esi * 4)을 통과하는 코드가 16 비트 레지스터와 비교해야하는 대신 (바이트 비교 이외의) 올바르게 표시됩니다. –

+0

전체 32 비트는 사용할 수 있습니까? –

+0

Dont는 내가 32 비트 레지스터를 가지고 있다고 생각합니다. 나는 이미 AH를 대체하기 위해 사용하고 있지 않으며, 비교를 위해 인덱스를 저장하고 있습니다. –