외로운 Nova의 작업실

Assembly 언어 공부 - 20(라이브러리 예제 프로그램) 본문

Programming/Assembly

Assembly 언어 공부 - 20(라이브러리 예제 프로그램)

Nova_ 2022. 8. 23. 00:31

안녕하세요. 이번 시간에는 이전 시간에 배운 라이브러리 프로시저를 사용하여 예제 프로그램을 만들어보도록 하겠습니다.

 

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

위 코드를 실행하면 아래와 같은 결과가 나옵니다.

 

이것으로 예제 프로그램을 마치도록 하겠습니다.

Comments