일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Spring Batch
- python
- table not found
- 코루틴 빌더
- kotlin
- 자원부족
- 겨울 부산
- pytest
- PytestPluginManager
- taint
- tolerated
- vfr video
- 개성국밥
- 티스토리챌린지
- terminal
- preemption #
- k8s #kubernetes #쿠버네티스
- 코루틴 컨텍스트
- mp4fpsmod
- VARCHAR (1)
- 오블완
- 헥사고날아키텍처 #육각형아키텍처 #유스케이스
- Value too long for column
- JanusWebRTCServer
- JanusWebRTC
- 깡돼후
- 달인막창
- JanusGateway
- JanusWebRTCGateway
- PersistenceContext
너와 나의 스토리
어셈블리(ch5) - 라이브러리 프로시저 호출 (Linking to an External Library) 본문
어셈블리(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
'Programming Language > Assembly' 카테고리의 다른 글
어셈블리 - FPU(부동 소수점 유닛) (0) | 2019.06.07 |
---|---|
어셈블리 - push&pop 명령어 / USES Operator (0) | 2019.06.03 |
어셈블리 - JMP and LOOP Instructions (0) | 2019.06.03 |
어셈블리 - 지역 변수/ 프로시저 매개변수 넘기기/ 프로시저 프로토타입 (0) | 2019.06.01 |
어셈블리어 - 구조체 사용법 / COORD (0) | 2019.06.01 |