외로운 Nova의 작업실
Assembly 언어 공부 - 20(라이브러리 예제 프로그램) 본문
안녕하세요. 이번 시간에는 이전 시간에 배운 라이브러리 프로시저를 사용하여 예제 프로그램을 만들어보도록 하겠습니다.
1.간단하게 글자색을 변경하고, DumpMem 으로 배열의 값을 나열하고 사용자로부터 값을 3번 입력받아 각각 그것을 int, hex, bin 형태로 출력 하는 프로그램을 짜보도록 하겠습니다. 프로시저들이 궁금하다면 이전 시간의 글을 참고하시면 이해가 편하실 겁니다.
include c:\assembly\irvine32.inc
includelib c:\assembly\irvine32.lib
includelib c:\assembly\kernel32.lib
includelib c:\assembly\user32.lib
.data
COUNT = 3
GreenTextOnBlack = Green + (black * 16)
DefaultColor = lightGray + (black * 16)
arrayD SDWORD 11111111h, 89ABCDEFh, 1234h, 0AAFFh
prompt BYTE "Enter a 32-bit signed integer: ", 0
.code
main PROC
mov eax, GreenTextOnBlack
call SetTextColor
call clrscr
;display an array using DumpMem.
mov esi, OFFSET arrayD
mov ebx, TYPE arrayD
mov ecx, LENGTHOF arrayD
call DumpMem
call Crlf
mov ecx, COUNT
; Ask the user to input a sequence of signed integer
L1 : mov edx, OFFSET prompt
call WriteString
call ReadInt
call Crlf
; Display th integer in decimal, hexdecima, and binary
call WriteInt
call Crlf
call WriteHex
call Crlf
call WriteBin
call Crlf
call Crlf
Loop L1
; Return the console window to default colors
call waitMsg
mov eax, DefaultColor
call SetTextColor
call Clrscr
exit
main ENDP
END main
아래는 실행 화면입니다.
2. 이번에는 난수 생성 프로그램입니다. 1번처럼 글자색을 변경한 후, 0부터 4,294,967,294까지의 범위에 있는 10개의 부호없는 정수를 무작위로 생성한후 그 다음에 -100 부터 99까지 범위에 있는 10개의 부호있는 정수를 생성합니다.
include c:\assembly\irvine32.inc
includelib c:\assembly\irvine32.lib
includelib c:\assembly\kernel32.lib
includelib c:\assembly\user32.lib
.data
GreenTextOnBlack = Green + (Black * 16)
DefaultColor = lightGray + (black * 16)
TAB = 9 ; ASCII code for Tab
.code
main PROC
mov eax, GreenTextOnBlack
call SetTextColor
call ClrScr
call Randomize
call Rand1
call Rand2
call WaitMsg
mov eax, DefaultColor
call SetTextColor
call ClrScr
exit
main ENDP
Rand1 PROC
; Generate ten pseudo-random integer
mov ecx, 10
L1: call Random32
call WriteDec
mov al, TAB
call WriteChar
loop L1
call Crlf
ret
Rand1 ENDP
Rand2 PROC
;Gnerate ten pseudo-random integers from -100 to 99
mov ecx, 10
L1: mov eax, 200
call RandomRange
sub eax, 100
call WriteInt
mov al, TAB
call WriteChar
loop L1
call Crlf
ret
Rand2 ENDP
END main
아래는 실행 화면입니다.
3. 이번에는 프로그램의 처리시간을 출력하는 프로그램을 짜보도록 하겠습니다.
include c:\assembly\irvine32.inc
includelib c:\assembly\irvine32.lib
includelib c:\assembly\kernel32.lib
includelib c:\assembly\user32.lib
.data
startTime DWORD ?
OUTER_LOOP_COUNTER = 3
msg1 BYTE "Please wait...", 0ah, 0dh, 0
msg2 BYTE "Elapsed milliseconds: ", 0
.code
main PROC
mov edx, OFFSET msg1
call WriteString
;Save starting time
call GetMseconds
mov startTime, eax
;Start OUTER_LOOP
mov ecx, OUTER_LOOP_COUNTER
L1: call Loop2
Loop L1
; Calculate the elapsed time
call GetMSeconds
sub eax, startTime
;Display the elapsed time
mov edx, OFFSET msg2
call WriteString
call WriteDec
call Crlf
exit
main ENDP
Loop2 PROC
push ecx
mov ecx, 0FFFFFFFFh
L1: mul eax
mul eax
mul eax
Loop L1
pop ecx
ret
Loop2 ENDP
END main
위 코드를 실행하면 아래와 같은 결과가 나옵니다.
이것으로 예제 프로그램을 마치도록 하겠습니다.
'Programming > Assembly' 카테고리의 다른 글
Assembly 언어 공부 - 22(프로시저의 사용) (0) | 2022.08.24 |
---|---|
Assembly 언어 공부 - 21(Runtime Stack의 사용) (0) | 2022.08.23 |
Assembly 언어 공부 - 19(라이브러리 프로시저 설명) (0) | 2022.08.18 |
Assembly 언어 공부 - 18(JMP와 LOOP 명령어 이론 및 실습) (0) | 2022.08.02 |
Assembly 언어 공부 - 17(간접 주소 지정 이론 및 실습) (0) | 2022.08.01 |
Comments