페이지

2014. 10. 30.

[MASM] 배열의 역순

TITLE 배열의 역순 (인덱스 주소지정 사용)


INCLUDE Irvine32.inc

.data
arrayD DWORD 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24
before BYTE "변경 전 arrayD",0
after BYTE "변경 후 arrayD",0

.code
main PROC

;맨 처음 배열 보이기
mov esi, OFFSET arrayD
mov ecx, LENGTHOF arrayD
mov ebx, TYPE arrayD
mov edx, OFFSET before
call WriteString
call DumpMem
call Crlf

mov esi, 0 ;배열의 가장 앞 주소
mov edi, OFFSET (SIZEOF arrayD - TYPE arrayD) ;배열의 가장 뒤 4바이트를 가리키는 가장 처음 주소
mov ecx, (LENGTHOF arrayD) / 2 ;루프 카운터

L1:
mov eax, [arrayD + esi] ;esi가 가리키는 곳을 eax에 복사
xchg eax, [arrayD + edi] ;eax와 edi가 가리키는 곳을 교환
mov [arrayD + esi], eax ;esi가 가리키는 곳에 eax로 복사
add esi, TYPE arrayD ;esi를 4만큼 올림
sub edi, TYPE arrayD ;edi를 4만큼 내림
loop L1


;변경 후 배열 보이기
mov esi, OFFSET arrayD
mov ecx, LENGTHOF arrayD
mov ebx, TYPE arrayD
mov edx, OFFSET after
call WriteString
call DumpMem
call Crlf

exit
main ENDP
END main







------------------------------------------------------------------------------------------------------

TITLE 배열의 역순 (간접피연산자 사용)

INCLUDE Irvine32.inc

.data
arrayD DWORD 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24
before BYTE "변경 전 arrayD",0
after BYTE "변경 후 arrayD",0

.code
main PROC

;변경 전 배열 출력
mov esi, OFFSET arrayD
mov ecx, LENGTHOF arrayD
mov ebx, TYPE arrayD
mov edx, OFFSET before
call WriteString
call DumpMem
call Crlf

mov esi, OFFSET arrayD ;배열의 가장 앞 주소
mov edi, OFFSET arrayD + SIZEOF arrayD - TYPE arrayD;배열의 가장 뒤 4바이트를 가리키는 가장 처음 주소
mov ecx, (LENGTHOF arrayD) / 2  ;루프 카운터

L1:
mov eax, [esi] ;esi가 가리키는 곳의 값을 eax에 복사
xchg eax, [edi] ;eax와 edi가 가리키는 곳의 값을 교환
mov [esi], eax ;esi가 가리키는 곳의 값을 eax로 복사
add esi, TYPE arrayD ;esi를 offset을 4만큼 올림
sub edi, TYPE arrayD ;edi를 offset을 4만큼 내림
loop L1

;변경 후 배열 출력
mov esi, OFFSET arrayD
mov ecx, LENGTHOF arrayD
mov ebx, TYPE arrayD
mov edx, OFFSET after
call WriteString
call DumpMem
call Crlf

exit
main ENDP
END main