Programming/Assembly2012. 1. 23. 14:02


"인텔 기반 컴퓨터를 위한 어셈블리 언어 5판" 은 어제부터 시작한 어셈블리 교재입니다.

공부하면서 풀은 연습문제입니다.

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 
 
6번 - 피보나치 수
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번은 약간 헤깔립니다..
뭔가 비효율적으로 코딩한거 같은데...
흠...........
 
Posted by NullBr4in