관리 메뉴

너와 나의 스토리

어셈블리(ch5) - 라이브러리 프로시저 호출 (Linking to an External Library) 본문

Programming Language/Assembly

어셈블리(ch5) - 라이브러리 프로시저 호출 (Linking to an External Library)

노는게제일좋아! 2019. 6. 3. 15:55
반응형

● 프로시저 호출

- call 명령어 사용

 

  프로시저

Procedure 역할
Clrscr 콘솔 클리어 (커서는 왼쪽 상단에 위치)
Crlf 줄 바꿈 (0Dh,0Ah 출력)
Delay

매개변수: eax(delay할 시간)

eax에 넣은 시간만큼 (ms 단위) 작동 멈춤

DumpMem

매개변수: esi(배열의 시작주소), ecx(배열의 원소의 개수). ebx(배열의 타입크기)

esi에서부터 값을 ecx개 출력하며 한번 출력시마다 주소를 ebx만큼 증가시킨다.

DumpRegs 범용레지스터와 플래그들을 전부 출력
GetCommandtail

매개변수: edx(buffer주소)

프로그램의 command-line 인자를 byte 배열에 복사

GetMaxXY(32)

매개변수: dh(행), dl(열)

콘솔 윈도우 버퍼의 행과 열의 수를 가져온다

GetMseconds 자정(00:00)부터 경과된 시간을 eax에 저장함
GetTextColor(32)

al에 현재 설정된 글자색을 저장

al(상위 4비트는 배경색, 하위 4비트는 글자색)

Gotoxy

매개변수: dh(x), dl(y)

콘솔에서 커서의 위치를 설정함

IsDigit al에 10진수 ASCII 코드가 포함된 경우 제로 플래그가 set 됨

MsgBox

MsgBoxAsk

매개변수: ebx(caption), edx(메세지)

팝업 메세지 박스가 보여짐

ParseDecimal32 부호없는 정수 문자열을 이진수로 바꿈 (edx,ecx)
ParseInteger32 부호있는 정수 문자열을 이진수로 바꿈 (edx,ecx)
Random32 0~FFFFFFFFh 중에 랜덤으로 한 숫자가 저장
Randomize

난수생성기의 시드에 현재 시간의 초를 저장함

(randomize 호출 안하고 난수 생성하면 계속 같은 수만 나옴)

RandomRange

매개변수: eax(최대값)

0~(최대값-1) 중에 랜덤으로 한 숫자가 eax에 저장됨

ReadChar

사용자로부터 문자 하나 입력 받는다. 화면에 입력한 글자가 출력되지 않는다.

al에 값이 들어감

ReadDec

부호없는 정수를 입력받아 eax에 저장

만약 CF=0이면  eax=입력값, CF=1이면 eax=0

ReadInt

부호있는 정수를 입력받아 eax에 저장

만약 CF=0이면  eax=입력값, CF=1이면 eax=0

ReadString

매개변수: edx(문자열 입력할 주소), ecx(null문자를 뺀 문자열의 최대길이)

문자열을 입력받아 edx에 저장한다 (최대 ecx 길이만큼 가능)

입력받은 문자열의 길이는 eax에 들어간다

SetTextColor

매개변수: eax(상위 4비트는 배경색, 하위 4비트는 글자색)

eax에 입력된 값에 대해 배경색과 글자색을 정한다.

WaitMsg

Enter key 누르라고 메시지 보여지면서 기다림

WriteBin

매개변수: eax(출력할 숫자)

부호없는 32bit 정수를 이진수 형태로 출력

WriteBinB

매개변수: ebx(크기)

이진수를 byte/word/dword 형태로 출력

WriteChar

매개변수: al(문자)

문자 출력

WriteDec

WriteHex

매개변수: eax(정수)

부호 없는 32bit 정수를 10진수 /16진수 형태로 출력

WriteInt

부호 있는 32bit 정수를 10진수 형태로 출력

WriteString

매개변수: edx(문자열이 있는 메모리 주소)

해당 위치에 있는 문자열 출력

SumOf

매개변수: eax, ebx, ecx

eax에 eax+ebx+ecx 값 들어감

 

● ReadString / SetTextColor / WriteString 예제

include irvine32.inc

.data
tmp byte 10 dup(?)
.code
main proc
	mov edx,offset tmp ; 문자열 입력할 주소
	mov ecx,10
	call ReadString

	mov eax,black+white*16 ; 흰색 배경에 검정 글씨
	call SetTextColor
    
	mov edx,offset tmp  ; 입력받은 문자 다시 출력
	call writestring

	exit
main endp
end main

 

● call GetMSeconds를 통한 실행 시간 측정 (GetMSeconds / Randomize / RandomRange / WriteInt / Crlf 예제)

include irvine32.inc

.data
StartTime dword ?
EndTime dword ?
.code
main proc
	call GetMSeconds
	mov StartTime, eax  ; 시작 시간

	call Randomize 
	mov eax, 10 
	call RandomRange   ; 0~9 사이에서 랜덤하게 하나 결정됨
	call writeint      ; 그 수를 출력
	call crlf          ; 줄 바꿈
	
	call GetMSeconds
	mov EndTime, eax   ; 종료 시간
	sub eax,StartTime ; eax=종료 시간-시작시간
	call writeint

	exit
main endp

end main

 

반응형
Comments