Lecture #8 어셈블리어 (5) - 8086 매크로 어셈블리어 시스템프로그래밍.

Slides:



Advertisements
Similar presentations
신도초 5 학년 4 반 김정수 지도교사 전혜원 선생님.  산출물 주제를 정하다가 문득 낮보다 왜 밤이 더 소리가 잘 들리는지 궁금해서 결정했다. 처음에 는 물질의 종류에 따른 소리의 크기로 하려 그랬 지만 실험이 너무 간단한 것 같아서 재료를 늘리 거나 온도를 높이려고.
Advertisements

1 Prof. Young Jin Nam, Daegu University 컴퓨터 구조 (Computer Architecture) 명령어 세트 : 특성과 기능 남영진
Family 의 개요 의 외부 Pin 기능과 내부 기능 Memory 구조 Timing 2 장 8051 의 구조.
DEBUG 상지대학교컴퓨터정보공학부. Debug 시작하기  Windows XP 에서 “ 시작 ” 버턴을 클릭한다.  시작메뉴에서 “ 프로그램 ” 을 클릭하고, 보조프로그램을 선택한다.  보조프로그램에 “ 명령 프롬프트 ” 를 클릭한다.  Window XP 에서.
Shellcode 작성 김영성.
CRT 뽀개기 신영진.
PIC는 우리의 친구 한국정보통신대학교 디지털미디어연구소.
Part01. 시스템 해킹을 위한 기초 지식 Chapter01. 운영체제에 대한 이해
9장 가로채기(Interrupt) Slide 1 (of 15).
4장 어셈블리 프로그램 작성의 기본 어셈블러 어셈블리 언어 요소 예제 프로그램 데이터 정의
제4장 어셈블리어.
제4장 어셈블리어.
기본 컴퓨터 프로그래밍 Lecture #6.
Lecture #12 인터럽트 Interrupt.
Lecture #5 어셈블리어 (2) 매크로 어셈블리어 시스템프로그래밍.
10장 주변장치 (PIO) Slide 1 (of 28).
Lecture #7 어셈블리어 (4) 매크로 어셈블리어 시스템프로그래밍.
제7강 학습 내용 주소지정 방식의 예 값 즉시 지정 방식과 실행 예 레지스터 직접지정 방식 메모리 직접지정 방식과 실행 예
제 7 장 링커와 로더 설계.
제 1 장 마이크로프로세서의 기본동작.
Lecture # 어셈블러 설계.
3장 MPU 내부구조 Slide 1 (of 28).
2 80×86 시스템에 대한 이해.
C언어: 배열 (Arrays).
제4장 제어 유니트 4.1 제어 유니트의 기능 4.2 제어 유니트의 구조 4.3 마이크로 명령어의 형식
어셈블리 문법 보강 4월 10일.
컴퓨터 구조.
수학 I 2. 방정식과 부등식.
REVERSE ENGINEERING HeXA 1st
+ 가상 메모리 -> 물리 메모리 Selector Offset DIR Page Segmetatation
Ch2-2. VHDL Basic VHDL lexical element VHDL description
버퍼 오버플로우 시스템보안 인터넷공학전공 권영락.
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 02. 프로그램의 기본구성.
제 5장 매크로 프로세서 설계.
제 5장 매크로 프로세서 설계.
리버스 엔지니어링 안녕하십니까? 리버스 엔지니어링 발표를 맡은 정창하입니다. 지금부터 리버스 엔지니어링 발표를
어셈블리어 및 실습 금 1,2 (314) / 금 3,4 (307) RTDCS 이 종 태
Chapter 06 명령어와 번지지정 방식.
제 6 장 8086 어셈블러 설계.
냉난방 시스템 설계 논리회로 설계 및 실험 텀 프로젝트 제안서 16조 김태광 정상훈.
8086 프로세서의 구조 및 동작 방식 시스템 프로그래밍 - Lecture #2 신라대학교 컴퓨터공학과 시스템 프로그래밍.
BOF of 2.6 Kernel ! 박수완 / Su-Wan, PARK [ L1nkC] 숭실대학교 정보보호동아리 ACK
제3장 8086 프로세서의 내부구조.
제 2장 컴퓨터동작의 기본 개념.
10장. 중앙처리 장치의 명령어 다루는 내용 어셈블리 프로그램의 이해 인터럽트(interrupt) 명령어 세트 주소 지정 방식.
명령어 구조 컴퓨터 하드웨어의 구성 프로그램 명령어 프로그램 실행 동작.
명품 C++ 프로그래밍 1장. C++ 시작.
제1장 시스템 소프트웨어의 개요 컴퓨터시스템 및 하드웨어 구성 컴퓨터의 구성과 기능 시스템프로그램의 개요
Buffer Overflow
제 장 학습내용 C 언어에서의 인터럽트 사용 레지스터를 위한 자료구조 인터럽트를 수행하기 위한 명령어
어셈블리어 (2) 매크로 어셈블리어 시스템 프로그래밍 - Lecture #4
PIC16C84의 외형 RA2 1 RA1 I/O PIN I/O PIN RA3 RA0 RTCC OSC1 발 진 RESET
자전거를 배우려면 안장에 올라가 페달을 밟아라.
8051 IO-PORT 정보통신•컴퓨터 공학부 송명규
Lecture #9 매크로 프로세서 설계 & 구현.
3-16. 디지털 시계.
제 2 장 어셈블러(Assemblers) 2.1 기본 어셈블러 기능 단순 SIC 어셈블러
Copyrightⓒ ohta. All Rights Reserved.
11장. 마이크로 프로세서 내부 구조.
현대의 원자 모형에 의한 전자 배치의 원리 현대의 원자 모형
제4강 학습내용 인텔프로세서의 발전 과정 8086 프로세서와 80i86프로세서 개요 인텔 펜티엄 IV프로세서 개요
대한민국-스웨덴 수교 60주년 기념 행사 주 스웨덴 대한민국 대사관 (토)
EZ-8051 Board를 이용한 E-Board의 제어
청소년 댄스 경연대회 제35회 문화체육관광부장관大賞 전국레크리에이션대회
10장. 컴퓨터 구조에 대한 세 번째 이야기 작성자: 윤성우.
제 5 장 82C55를 이용한 포트 출력.
C.
제 10 장  코드 생성.
Assembly 05 방호남 07 반지훈 09 박상욱.
4-1. 명령어 형식.
Presentation transcript:

Lecture #8 어셈블리어 (5) - 8086 매크로 어셈블리어 시스템프로그래밍

반복 제어 명령(1) 반복 제어 명령 일련의 프로그램 코드를 반복적으로 수행하도록 제어하는 명령 예 1) 특정문자(‘ ‘)를 반복적으로 출력한다. 예 2) 1차원 배열의 원소의 합을 구한다. 예 3) 문자열을 다른 문자열로 전송한다. LOOP 명령 / String 명령 시스템프로그래밍

반복 제어 명령(2) LOOP 명령 카운터인 CX 레지스터 값이 0이 될 때까지 일련의 프로그램 코드를 반복적으로 실행하는 명령 C 언어의 for-loop 문장과 유사 CX 레지스터를 연산 카운터로 사용 문장 형식 : DEC CX CMP CX, 0 JNE NEXT MOV CX, 10 NEXT: . . LOOP NEXT 시스템프로그래밍

반복 제어 명령(3) 예제 프로그램 #1 1부터 10H 까지의 수치를 화면에 출력하는 프로그램 시스템프로그래밍 ; MODULE – PUTAL.SUB ; PUTAL: PUSH AX PUSH CX PUSH AX AND AL, 0F0H MOV CL, 4 SHR AL, CL CALL PUTHEX POP AX AND AL, 0FH POP CX RET ;--------------------------------------------------------- PUTHEX: PUSH AX PUSH DX MOV DL, AL CMP DL, 0AH JAE HEX2 ADD DL, ‘0’ JMP HEX3 HEX2: ADD DL, ‘A’-0AH HEX3: MOV AH, 2 INT 21H POP DX POP AX RET ;--------------------------------------------------------- 시스템프로그래밍

반복 제어 명령(4) 예제 프로그램 #1 (계속) 시스템프로그래밍 MAIN SEGMENT ASSUME CS:MAIN, DS:MAIN ; INCLUDE PUTAL.SUB START: MOV AX, MAIN MOV DS, AX MOV AX, 1 MOV CX, 10H NEXT: MOV DL, AL CALL PUTAL CALL SPACE INC AX LOOP NEXT MOV AH, 4CH INT 21H ;--------------------------------------------------------- SPACE: PROC NEAR PUSH AX PUSH DX MOV DL, ‘ ‘ MOV AH, 2 INT 21H POP DX POP AX RET SPACE ENDP ; MAIN ENDS END START 시스템프로그래밍

반복 제어 명령(5) LOOPE(LOOPZ) & LOOPNE 명령 어떤 조건이 만족하면 지정된 횟수 이내에서도 반복을 끝내는 반복 제어 명령 LOOPE(LOOPZ) 명령 앞의 비교 명령(또는 연산 명령)의 결과가 같고(ZF=1), CX 레지스터 값에서 1을 뺀 결과가 0이 아니면 반복 수행하는 명령 반복 상한 횟수를 CX 레지스터에 설정해 놓고 같지 않은 것이 나타날 때까지 반복하는 명령 예) 원소를 100개 가진 배열에서 0인 아닌 값을 가지는 첫번째 원소를 찾기 시스템프로그래밍

반복 제어 명령(6) LOOPE(LOOPZ) & LOOPNE 명령 LOOPNE 명령 앞의 비교 명령(또는 연산 명령)의 결과가 다르고(ZF=0), CX 레지스터 값에서 1을 뺀 결과가 0이 아니면 반복 수행하는 명령 반복 상한 횟수를 CX 레지스터에 설정해 놓고 같은 것이 나타날 때까지 반복하는 명령 예) 원소를 100개 가진 배열에서 값이 0인 첫번째 원소를 찾기 시스템프로그래밍

반복 제어 명령(7) 예제 프로그램 #2 문자열 “ HELLO-WORLD! “에서 앞의 공백의 개수와 공백이 아닌 연속된 문자의 개수를 세어 출력하도록 한다. 단 문자열의 길이는 20H를 넘지 않는다. 우선, PUTAL.SUB 모듈에 스트링 및 CR/LF 출력 프로시저를 추가, 확장한다. LOOPE / LOOPNE 명령을 사용한다. 시스템프로그래밍

반복 제어 명령(8) 예제 프로그램 #2 (계속) 시스템프로그래밍 POP DX POP AX RET ; PUTSTR: PUSH AX PUSH BX CMP DX, 0 JE PUTSTR_END MOV BX, DX CMP BYTE PTR [BX], ‘$’ MOV AH, 9 INT 21H PUTSTR_END: POP BX PUTCRLF: PUSH AX PUSH DX MOV AH, 2 MOV DL, 0DH MOV DL, 0AH ; MODULE – PUTAL.SUB ; PUTAL: PUSH AX PUSH CX PUSH AX AND AL, 0F0H MOV CL, 4 SHR AL, CL CALL PUTHEX POP AX AND AL, 0FH POP CX RET PUTHEX: PUSH AX PUSH DX MOV DL, AL CMP DL, 0AH JAE HEX2 ADD DL, ‘0’ JMP HEX3 HEX2: ADD DL, ‘A’-0AH HEX3: MOV AH, 2 INT 21H 시스템프로그래밍

반복 제어 명령(9) 예제 프로그램 #2 (계속) 시스템프로그래밍 MAIN SEGMENT ASSUME CS:MAIN, DS:MAIN ; INCLUDE PUTAL.SUB SPACE EQU ‘ ‘ MAX-LENGTH EQU 20H START: MOV AX, MAIN MOV DS, AX ; Count space length MOV CX, MAX_LENGTH MOV DL, 0 MOV SI, 0 MOV BX, OFFSET STR1 NEXT1: INC DL INC SI MOV AL, [BX+SI-1] CMP AL, SPACE LOOPE NEXT1 DEC DL MOV AL, DL MOV DX, OFFSET MSG1 CALL PUTSTR CALL PUTAL CALL PUTCRLF ; Count string length MOV DL, 0 NEXT2: INC DL INC SI MOV AL, [BX+SI-1] CMP AL, SPACE LOOPNE NEXT2 DEC DL MOV AL, DL MOV DX, OFFSET MSG2 CALL PUTSTR CALL PUTAL CALL PUTCRLF MOV AH, 4CH INT 21H ; STR1 DB ‘ HELLO-WORLD! ‘ MSG1 DB ‘ Space length = $’ MSG2 DB ‘ String length = $’ MAIN ENDS END START 시스템프로그래밍

반복 제어 명령(10) LOOP 명령 & 플래그 레지스터 LOOP 명령은 반복 수행 과정에서 카운터인 CX 레지스터에서 1을 빼는 연산을 수행한다 이러한 뺄셈 연산의 결과에 대해 플래그 레지스터 값을 영향을 받지 않는다.  LOOP 명령은 현재 플래그 레지스터에 영향을 미치지 않는다 시스템프로그래밍

반복 제어 명령(11) String 명령 연속적인 데이터(문자열)에 대해 비교하거나 전송하기 위해 사용하는 명령 블록 데이터를 전송하는 전송 명령 : LODS / STOS / MOVS 블록 내의 데이터를 검색하는 검색 명령: SCAS / CMPS 리피트 프리픽스(Repeat Prefix)와 결합하여 사용 REP / REPE(REPZ) / REPNE(REPNZ) 시스템프로그래밍

반복 제어 명령(12) LODS 명령(메모리  레지스터) DS:[SI] 번지의 데이터를 AL(AX) 레지스터로 전송하는 명령 Direction Flag(DF)에 따라 SI 레지스터 값을 자동으로 증감 LODSB / LODSW 메모리 DS:[SI]  AL(AX) LODB / LODW LODS 명령을 수행한 후에 자동으로 증가 시스템프로그래밍

반복 제어 명령(13) 예제프로그램 #3 LODS 명령을 이용하여 문자열을 한자씩 출력하는 프로그램 시스템프로그래밍 MAIN SEGMENT ASSUME CS:MAIN, DS:MAIN ; START: MOV AX, MAIN MOV DS, AX MOV SI, OFFSET MSG1 MOV CX, OFFSET MSG2 SUB CX, SI CLD NEXT: LODSB MOV DL, AL MOV AH, 2 INT 21H LOOP NEXT MOV AH, 4CH MSG1 DB ‘ MS-DOS MACRO ASSEMBLER’ MSG2 DB ? ; MAIN ENDS END START 시스템프로그래밍

반복 제어 명령(14) STOS 명령(레지스터  메모리) AL(AX) 레지스터의 내용은 ES:[DI] 번지의 메모리로 전송하는 명령 세그먼트 레지스터로 ES(EXTRA SEGMENT)를 사용 Direction Flag(DF)에 따라 DI 레지스터 값이 자동으로 증감 STOSB / STOSW 메모리 ES:[DI]  AL(AX) STOB / STOW STOS 명령을 수행한 후에 자동으로 증가 시스템프로그래밍

반복 제어 명령(15) 예제프로그램 #4 STOS 명령을 이용하여 문자열을 복사하고 출력하는 프로그램 시스템프로그래밍 MAIN SEGMENT ASSUME CS:MAIN, DS:MAIN, ES:MAIN ; START: MOV AX, MAIN MOV DS, AX MOV ES, AX MOV SI, OFFSET MSG1 MOV DI, OFFSET MSG2 MOV CX, DI SUB CX, SI CLD NEXT: LODSB STOSB MOV DL, AL MOV AH, 2 INT 21H LOOP NEXT MOV AH, 4CH MSG1 DB ‘ MS-DOS MACRO ASSEMBLER’ MSG2 DB 20H DUP (?) ; MAIN ENDS END START 시스템프로그래밍

반복 제어 명령(16) MOVS 명령(메모리  메모리) DS:[SI] 번지의 메모리 내용을 ES:[DI] 번지의 메모리로 전송하는 명령 Direction Flag(DF)에 따라 SI & DI 레지스터 값이 자동으로 증감 MOVSB / MOVSW 메모리 ES:[DI]  DS:[SI]  MOVSB / MOVSW 시스템프로그래밍

반복 제어 명령(17) 예제프로그램 #5 예제프로그램 #4에서 문자열 복사 과정을 MOVS 명령으로 수정한 프로그램 MAIN SEGMENT ASSUME CS:MAIN, DS:MAIN, ES:MAIN ; START: MOV AX, MAIN MOV DS, AX MOV ES, AX MOV SI, OFFSET MSG1 MOV DI, OFFSET MSG2 MOV CX, DI SUB CX, SI CLD NEXT: MOVSB LOOP NEXT MOV AH, 4CH INT 21H MSG1 DB ‘ MS-DOS MACRO ASSEMBLER’ MSG2 DB 20H DUP (?) ; MAIN ENDS END START 시스템프로그래밍

반복 제어 명령(18) Repeat Prefix 명령 스트링 명령과 조합하여 사용 스트링 명령은 일정한 회수(CX 레지스터) 만큼 반복적으로 수행하도록 한다 REP / REPE(REPZ) / REPNE(REPNZ) REP : 스트링 명령을 CX 레지스터 값만큼 반복 수행 REPE(REPZ) : 비교 결과가 같고 CX 레지스터 값이 0이 아닌 동안 스트링 명령을 반복 수행 REPNE(REPNZ) : 비교 결과가 다르고 CX 레지스터 값이 0이 아닌 동안 스트링 명령을 반복 수행 예: REP LODSW REPE STOSB REPNZ MOVSB 시스템프로그래밍

반복 제어 명령(19) 예제프로그램 #6 예제프로그램 #5을 REPEAT PREFIX를 이용하여 수정한 프로그램 MAIN SEGMENT ASSUME CS:MAIN, DS:MAIN, ES:MAIN ; START: MOV AX, MAIN MOV DS, AX MOV ES, AX MOV SI, OFFSET MSG1 MOV DI, OFFSET MSG2 MOV CX, DI SUB CX, SI CLD REP MOVSB MOV AH, 4CH INT 21H MSG1 DB ‘ MS-DOS MACRO ASSEMBLER’ MSG2 DB 20H DUP (?) ; MAIN ENDS END START 시스템프로그래밍

반복 제어 명령(20) SCAS 명령 SCAS(SCAn String Byte/Word)  레지스터와 메모리 내용을 비교하는 명령 AL 레지스터 값과 ES:[DI] 주소의 메모리 내용을 비교하여 플래그 레지스터 상태 비트를 변경한다 Direction Flag(DF)에 따라 DI 레지스터 값이 자동으로 증감 AL 레지스터 및 메모리 내용은 변경되지 않는다 SCASB / SCASW 시스템프로그래밍

반복 제어 명령(21) 예제프로그램 #7 주어진 문자열에서 ‘&’문자를 찾아 위치를 출력하는 프로그램 시스템프로그래밍 MAIN SEGMENT ASSUME CS:MAIN, DS:MAIN, ES:MAIN ; INCLUDE PUTAL.SUB START: MOV AX, MAIN MOV DS, AX MOV ES, AX MOV AL, ‘&’ MOV DI, OFFSET STR1 MOV CX, STR2 – STR1 PUSH CX CLD NEXT: SCASB JE FOUND LOOP NEXT JMP NOTFOUND FOUND: DEC DI MOV DX, OFFSET MSG1 CALL PUTSTR MOV AH, DI MOV AL, AH CALL PUTAL MOV AX, DI CALL PUTAL MOV DX, OFFSET MSG2 CALL PUTSTR POP AX SUB AX, CX CALL PUTCRLF JMP EXIT ; NOTFOUND: MOV DX, OFFSET MSG3 EXIT: MOV AH, 4CH INT 21H MSG1 DB ‘Found address = $’ MSG2 DB ‘ H count = $’ MSG3 DB ‘Not found $’ STR1 DB ‘ABCDEFG&HIJK’ MAIN ENDS END START 시스템프로그래밍

반복 제어 명령(22) CMPS 명령 CMPS(CoMPare String Byte/Word)  메모리와 메모리의 내용을 비교하는 명령 DS:[SI] 주소의 메모리 내용과 ES:[DI] 주소의 메모리 내용을 비교하여 플래그 레지스터 상태 비트를 변경한다 Direction Flag(DF)에 따라 SI & DI 레지스터 값이 자동으로 증감 비교되는 메모리 내용은 변경되지 않는다 CMPSB / CMPSW 시스템프로그래밍

반복 제어 명령(23) 예제프로그램 #8 키보드로부터 입력된 문자열에서 “ABC”가 몇 번째 글자부터인지를 찾아 출력하는 프로그램 MAIN SEGMENT ASSUME CS:MAIN, DS:MAIN, ES:MAIN ; INCLUDE PUTAL.SUB START: MOV AX, MAIN MOV DS, AX MOV ES, AX CLD MOV DX, OFFSET MSG1 CALL PUTSTR CALL PUTCRLF MOV DX, OFFSET MAX_CHARS MOV AH, 0AH INT 21H XOR CX, CX MOV CL, CHARS_ENTERED MOV BP, OFFSET BUFF DEC BP INC CX NEXT: DEC CX CMP CX, 3 JB NOTFOUND INC BP MOV DI, BP MOV SI, OFFSET CMP_STR CMPSB JNE NEXT MOV DX, MSG2 CALL PUTSTR MOV AL, CHARS_ENTERED SUB AL, CL CALL PUTAL CALL PUTCRLF JMP EXIT 시스템프로그래밍

반복 제어 명령(24) 예제프로그램 #8(계속) 시스템프로그래밍 ; NOTFOUND: MOV DX, OFFSET MSG3 CALL PUTSTR CALL PUTCRLF EXIT: MOV AH, 4CH INT 21H MSG1 DB ‘Input string including <ABC> : $’ MSG2 DB ‘Found characters <ABC> at $’ MSG3 DB ‘Not found $’ MAX_CHARS DB 80H CHARS_ENTERED DB ? BUFF DB 80H DUP (?) CMP_STR DB ‘ABC’ MAIN ENDS END START 시스템프로그래밍

입출력 명령(1) CPU & 입출력 입출력(I/O : Input/Output) 입출력 제어기(I/O Controller) 메모리 내용을 출력 장치에 전송하거나 입력 장치에서 입력된 내용을 메모리에 전송하는 작업 모든 입출력은 CPU에 의해 이루어진다 입출력 제어기(I/O Controller) CPU와 입출력 장치간에 데이터 전송을 제어하는 장치 I/O Channel 이라고도 함 입출력 장치는 직접 메모리로부터 데이터를 전송하는 것이 아니라 CPU와 입출력 제어기 사이의 입출력 연산과정을 통해 입출력이 이루어진다 IDE Controller - HDD/FDD 입출력 제어 Sound Card – MIC/Speaker를 통한 sound 입출력 제어 시스템프로그래밍

입출력 명령(2) CPU & 입출력(계속) 입출력 포트(I/O Port) 입출력 명령(I/O 명령) 각각의 입출력 제어기는 자신의 입출력 포트가 할당된다 메모리 공간은 주소를 통해 구분되듯이 입출력 제어기는 입출력 포트를 이용하여 구분한다 입출력 포트는 입출력 주소공간이라고 할 수 있다 입출력 명령(I/O 명령) 입출력 포트를 통해 입출력을 수행하는 명령 IN 명령 입력 포트로부터 데이터를 입력하는 명령 IN [AL/AX], [port-number/DX] OUT 명령 출력 포트로 데이터를 출력하는 명령 OUT [port-number/DX], [AL/AX] 시스템프로그래밍

입출력 명령(3) 예제프로그램 #9 10회 부저를 울리는 프로그램 시스템프로그래밍 MAIN SEGMENT ASSUME CS:MAIN ; DELAY EQU 6000H START: MOV BX, 10 NEXT: IN AL, 61H PUSH AX OR AL, 2 OUT 61H, AL MOV CX, DELAY WAIT1: LOOP WAIT1 POP AX WAIT2: LOOP WAIT2 DEC BX JNZ NEXT MOV AH, 4CH INT 21H MAIN ENDS END START 시스템프로그래밍

8086 어셈블리 명령어 요약 8086 명령어 데이터 전송 명령 – MOV 산술연산 명령 – ADD, ADC, SUB, SBB, MUL, DIV, INC, DEC 논리연산 명령 – AND, OR, XOR, NOT, NEG 비트연산명령 – SHL, SHR, SAR, ROL, ROR, RCL, RCR 비교 분기 명령 – CMP, TEST, JMP, JE, JNE, JAE, CALL, RET 반복 명령 - LOOP, LOOPE, LOOPNE 스트링 명령 – LODSB, STOSB, MOVSB, SCASB, CMPSB I/O 명령 – IN, OUT 인터럽트 명령 – INT, IRET CPU 제어 명령 – WAIT, ESC, LOCK, HLT, NOP 그외 명령 – PUSH, POP, XCHG, XLAT 시스템프로그래밍