"인텔 기반 컴퓨터를 위한 어셈블리 언어 5판" 은 어제부터 시작한 어셈블리 교재입니다.
공부하면서 풀은 연습문제입니다.
1~4는 별로 필요가 없어보여서... 5~8번 문제만 풀었습니다.
5번 - 직접 오프셋 주소 지정
5번 - 직접 오프셋 주소 지정 - 2
6번 - 피보나치 수
7번 - 산술식
8번 - 문자열의 역방향 복사
이 중에서 8번은 약간 헤깔립니다..
뭔가 비효율적으로 코딩한거 같은데...
흠...........
공부하면서 풀은 연습문제입니다.
1~4는 별로 필요가 없어보여서... 5~8번 문제만 풀었습니다.
5번 - 직접 오프셋 주소 지정
TITLE 4.7.5 eaxmple
;4.7.5-1
;5.1 직접 오프셋 주소지정
INCLUDE Irvine32.inc
.data
Uarray WORD 1000h, 2000h, 3000h, 4000h
Sarray SWORD -1, -2, -3, -4
.code
main PROC
movzx eax, Uarray
movzx ebx, (Uarray+2)
movzx ecx, (Uarray+4)
movzx edx, (Uarray+6)
call DumpRegs
exit
main ENDP
END main
|
5번 - 직접 오프셋 주소 지정 - 2
TITLE 4.7.5 eaxmple
; 4.6.5-2
;5.2 직접 오프셋 주소지정
INCLUDE Irvine32.inc
.data
Uarray WORD 1000h, 2000h, 3000h, 4000h
Sarray SWORD -1, -2, -3, -4
.code
main PROC
movsx eax, Sarray
movsx ebx, (Sarray+2)
movsx ecx, (Sarray+4)
movsx edx, (Sarray+6)
call DumpRegs
exit
main ENDP
END main
|
TITLE 4.7.6 eaxmple
; 4.6.6
; Fibonacci
; 피보나치 수 12항 까지
INCLUDE Irvine32.inc
.data
first BYTE 1
second BYTE 0
sum BYTE ?
.code
main PROC
movsx ebx, first
movsx edx, second
mov ecx, 12
L1:
mov eax, ebx
add eax, edx
call DumpRegs
mov bl, dl
mov dl, al
loop L1
exit
main ENDP
END main
|
7번 - 산술식
TITLE 4.7.7 eaxmple
; 4.6.7
; 산술식
; EAX = -val2 + 7 - val3 + val1
INCLUDE Irvine32.inc
.data
val1 SDWORD 8
val2 SDWORD -15
val3 SDWORD 20
.code
main PROC
mov eax, val2 ; EAX = FFFFFFF1h
neg eax ; EAX = Fh
add eax, 7 ; EAX = 16h
mov ebx, val3 ; EAX = 16h, EBX = 14h
neg ebx ; EAX = 16h, EBX = FFFFFFECh
add eax, ebx ; EAX = 2h
add eax, val1 ; EAX = Ah
call DumpRegs
exit
main ENDP
END main
|
8번 - 문자열의 역방향 복사
TITLE 4.7.8 eaxmple
; 4.6.8
; 8. 문자열의 역방향 복사
INCLUDE Irvine32.inc
.data
source BYTE "This is the source string", 0
target BYTE SIZEOF source DUP('#')
.code
main PROC
xor esi,esi ; esi 초기화
mov esi, OFFSET source ; source 주소를 esi에 넣는다.
add esi, SIZEOF source ; esi가 source의 오프셋에 source 길이를 더한다.
dec esi ; 그럼 1 byte가 넘어가게 되는데 이걸 다시 빼준다.
xor edi, edi ; edi 초기화
mov edi, OFFSET target ; target 주소를 edi에 넣는다.
mov ecx, LENGTHOF source ; ecx(loop count)에 source의 길이를 넣는다.
L1: ; loop L1
mov al, [esi] ; [esi], 즉 source 주소지에 있는 값을 al 로 복사한다.
mov [edi], al ; al, 의 값을 [edi], target 주소이제 복사한다.
inc edi ; edi 주소를 1 증가시킨다.
dec esi ; esi 주소를 1 감소시킨다.
loop L1 ; L1 으로 돌아가라
mov esi, OFFSET target ; target 주소를 esi에 넣어라
mov ebx, 1 ; ebx에 1을 넣어라. DumpMem 에서 사용할 값 - byte format
mov ecx, SIZEOF target ; target의 크기(SIZE * LENGTH)를 ecx 에 넣어라.
call DumpMem ; DumpMem 호출.
exit
main ENDP
END main
|
이 중에서 8번은 약간 헤깔립니다..
뭔가 비효율적으로 코딩한거 같은데...
흠...........
'Programming > Assembly' 카테고리의 다른 글
[인텔 기반 컴퓨터를 위한 어셈블리 언어] 문자열을 역순으로 배치하기 (0) | 2012.01.23 |
---|---|
[인텔 기반 컴퓨터를 위한 어셈블리 언어] GetMSeconds를 이용한 성능 시험 (0) | 2012.01.23 |
[인텔 기반 컴퓨터를 위한 어셈블리 언어] 난수(Random) 생성 (0) | 2012.01.23 |
[인텔 기반 컴퓨터를 위한 어셈블리 언어] 5.3.3 라이브러리 테스트 프로그램 (0) | 2012.01.23 |
Visual Studio 2010 MASM 환경 설정 (1) | 2012.01.23 |