목차
제1장. IA(Intel Architecture) 계열 프로세서 변천
   1.1 소개 ... 14
   1.2 어셈블리 언어를 배워야 되는 이유? ... 14
   1.3 어셈블리 언어의 응용분야 ... 15
   1.4 IA-32 프로세서 발전 개요 ... 15
   1.5 IA-32 프로세서 변천 ... 16
      1.5.1 Intel 8086 / 8088 ... 16
      1.5.2 Intel 80286(IBM PC-AT) ... 17
      1.5.3 Intel 80386 ... 17
      1.5.4 Intel 80486 ... 18
      1.5.5 Intel Pentium ... 19
제2장. IA-32 프로세서의 기본은 Intel 8086/8088
   2.1 Intel 8086/8088의 기본적인 구조 ... 24
   2.2 Intel 8086/8088의 메모리 ... 25
   2.3 Programming 모델 ... 26
      2.3.1 범용 레지스터 ... 26
      2.3.2 포인터와 인덱스 레지스터 ... 27
      2.3.3 명령어 레지스터 : IP(Instruction Pointer) ... 28
      2.3.4 세그먼트 레지스터(Segment Register) ... 28
연습 문제 ... 38
제3장. 프로그래머 관점에서 바라본 펜티엄4 프로세스
   3.1 IA-32 프로세서의 기본 실행 환경 ... 42
   3.2 IA-32 프로세서 레지스터 ... 43
      3.2.1 IA-32 범용 레지스터 ... 44
      3.2.2 세그먼트 레지스터 ... 46
      3.2.3 명령어 포인터 레지스터 : EIP(Instruction Pointer Register) ... 49
      3.2.4 상태 제어 플래그(EFLAGS) 레지스터 ... 50
      3.2.5 시스템 플래그 ... 51
   3.3 IA-32 프로세서의 동작 모드 종류 ... 52
   3.4 메모리 구성 ... 54
   3.5 32비트 레지스터 모드에서의 특성 ... 56
   3.6 IA-32 프로세서 상에서의 실제 모드 ... 57
      3.6.1 실제 모드 IA-32 프로세서의 세그먼트와 세그먼트 레지스터 ... 57
      3.6.2 IA-32 프로세서 실제 모드에서 사용가능한 레지스터와 주소 지정 방식 ... 58
   3.7 메모리 주소지정의 개념 ... 59
      3.7.1 메모리 주소지정의 기구 ... 60
      3.7.2 실제 모드 IA-32 프로세서 상에서의 20비트 주소계산의 emulation ... 63
연습 문제 ... 64
제4장. IA-32 프로세서의 데이터 형식
   4.1 기본 데이터 크기(Fundamental data size) ... 66
   4.2 표기법 ... 67
   4.3 수치 데이터 형(numeric data types) ... 67
      4.3.1 정수(Integers) ... 68
   4.4 문자열 데이터 형(string data types) ... 71
   4.5 BCD(Binary Coded Decimal) ... 72
      4.5.1 (unpack) BCD 및 pack BCD 정수 ... 72
   4.6 메모리 내의 데이터 저장 ... 73
연습 문제 ... 74
제5장. 프로그램 기초와 주소 지정 방식
   5.1 IA-32 어셈블리 언어 형식 ... 78
      5.1.1 레이블(Label) 필드 ... 78
      5.1.2 OP 코드(umumonic)와 오퍼랜드 필드 ... 79
      5.1.3 설명문 필드 ... 79
   5.2 지시어(directive) ... 80
      5.2.1 리스트 지시어 : PAGE 및 TITLE ... 80
      5.2.2 세그먼트 지시어 ... 81
      5.2.3 프로세스와 실수연산 프로세스의 지정 ... 85
      5.2.4 스택 생성 ... 85
   5.3 단순 세그먼트 지시어 ... 86
      5.3.1 .MODEL ... 86
      5.3.2 .STACK 지시어 ... 86
      5.3.3 .DATA와 DATA 지시어 ... 86
      5.3.4 .CODE 지시어 ... 87
      5.3.5 프로그램의 시작(.STARTUP)과 종료 지시어(.EXIT) ... 88
   5.4 어셈블리 언어로 원시 프로그램을 작성하기 위한 간단한 명령어 ... 89
      5.4.1 데이터 전송 명령어 ... 89
   5.5 원시 프로그램의 작성 ... 91
   5.6 원시 프로그램의 어셈블과 실행 과정 ... 93
      5.6.1 어셈블리 과정 ... 94
      5.6.2 링크 과정 ... 94
      5.6.3 실행 과정 ... 95
      5.6.4 ML 명령에 의한 어셈블과 링크 과정 ... 95
   5.7 정수 및 문자 데이터 정의 ... 95
      5.7.1 바이트 크기 데이터 정의 : DB ... 96
      5.7.2 워드 크기 데이터 정의 : DW ... 99
      5.7.3 더블 워드 크기 데이터 정의 : DD ... 99
      5.7.4 8바이트 크기 데이터 정의 : DQ ... 99
      5.7.5 10바이트 크기 데이터 정의 : DT ... 100
      5.7.6 문자열(string) ... 1000
      5.7.7 등호('=') 지시어 ... 101
      5.7.8 EQU 지시어 ... 102
   5.8 구조체(STRUC) 정의 ... 104
   5.9 시스템 호출(System call)을 이용한 INT 21h 함수 ... 104
      5.9.1 시스템 호출이란 ... 106
      5.9.2 시스템 호출의 종류 ... 106
   5.10 주소 지정방식(Addressing mode) ... 109
      5.10.1 즉치 주소 지정방식(Immediate Addressing) ... 110
      5.10.2 레지스터 주소방식(Resister Addressing) ... 110
      5.10.3 메모리 참조 주소 지정방식 ... 111
      5.10.4 메모리 위치를 가리키는데 사용되는 연산자들 ... 118
   5.11 16비트 레지스터와 32비트 레지스터의 혼용 ... 122
연습 문제 ... 123
제6장. IA-32 정수형 범용 명령어
   6.1 MOV 이외의 데이터 전송 명령어 ... 126
      6.1.1 데이터 교환(Exchange) 명령어 ... 126
      6.1.2 BSWAP(Byte swap) ... 127
      6.1.3 주소를 목적지 레지스터로 옮기는 전송 명령어 ... 128
      6.1.4 XLAT/XLATB : Table Look-Up translation ... 129
   6.2 형 변환(주호 확장, ZERO 확장) 명령어 ... 131
      6.2.1 MOVSX 명령어 : [Signe-extend move 명령어 : MOVSX] ... 132
      6.2.2 MOVZX : [Zero-extend move 명령어 : MOVZX] ... 133
      6.2.3 NEG(NEGate) ... 134
   6.3 산술 명령어 ... 135
      6.3.1 INC와 DEC 명령어 ... 135
      6.3.2 덧셈 및 뺄셈 명령어 ... 138
      6.3.3 XADD : Exchange and ADD ... 141
      6.3.4 뺄셈 명령어 : SUB와 SBB ... 142
   6.4 형 변환 명령어 : CBW, CWD/CWDE, CDQ ... 144
      6.4.1 CBW/CWDE ... 144
      6.4.2 CWD/CDQ ... 145
   6.5 곱셈 ... 146
      6.5.1 부호 없는 정수의 곱셈 ... 147
      6.5.2 부호 있는 곱셈(IMUL) ... 149
      6.5.3 IMUL 곱셈 명령어 ... 151
   6.6 나눗셈 ... 152
      6.6.1 부호 없는 정수의 나눗셈 : DIV 명령어 ... 153
      6.6.2 부호 있는 정수 나눗셈 ... 155
연습 문제 ... 162
제7장. 제어문과 반복문
   7.1 무조건 분기 명령어(JMP) ... 166
      7.1.1 Short JMP 명령어 ... 167
      7.1.2 Near JMP 명령어 ... 169
      7.1.3 far JMP 명령어 ... 169
   7.2 조건부 점프 명령어 ... 171
      7.2.1 비교 명령어(Compare) ... 171
      7.2.2 조건 분기류 명령어 ... 173
      7.2.3 Pretest Loops ... 176
      7.2.4 조건식의 결정구조 ... 182
   7.3 반복 수행문 카운터 제어 구조 ... 187
      7.3.1 LOOP/LOOPcc 명령어 ... 187
      7.3.2 LOOPE/LOOPZ ... 191
      7.3.3 LOONE/LOOPNZ ... 192
      7.3.4 JECXZ ... 194
연습 문제 ... 195
제8장. 배열과 문자열 처리
   8.1 배열의 필요성 ... 200
   8.2 인덱스 주소 지정방식(Index Addressing) ... 201
   8.3 베이스 인덱스 주소 지정방식 ... 203
   8.4 베이스 상대 인덱스 주소 지정방식 ... 206
   8.5 스케일된 인덱스 주소 지정방식 ... 207
   8.6 데이터 저장을 위한 배열이 초기값 설정과 배열의 요소 액세스 ... 210
   8.7 Lengthof, Sizeof와 Type 연산자 ... 212
   8.8 문자열 처리 명령어(string instructions) ... 220
      8.8.1 문자열 동작의 특징 ... 221
      8.8.2 MOVS/MOVSB/MOVSW/MOVSD : 문자열 전송 명령어 ... 222
      8.8.3 REP : 반복 문자열 접두어 ... 226
      8.8.4 LODS/LODSB/LODSW/LODSD : Lode string 명령 ... 231
      8.8.5 STOS/SOSB/STOSW/STOSD : Store string : 문자열을 저장 ... 232
      8.8.6 CMPS/CMPSB/CMPSW/CMPSD : Compare String Operands : 문자열을 비교 ... 233
      8.8.7 SCAS(Scan string) : 문자열을 조사 ... 237
연습 문제 ... 240
제9장. 프로시저
   9.1 스택(Stack) ... 245
      9.1.1 PUSH와 POP 명령 ... 246
   9.2 간단한 프로시저 ... 252
      9.2.1 PROC-ENDP 지시어 ... 252
      9.2.2 CALL 명령과 복귀명령 RET ... 253
      9.2.3 프로시저로 인수(parameters)를 전달하는 방법 ... 256
      9.2.4 스택 프레임(Stack Frame)과 EBP의 효율적 사용 ... 259
      9.2.5 스택 상에서의 지역 변수 사용 ... 263
   9.3 재귀 기법(Recursion) ... 265
   9.4 세그먼트간의 프로시저 호출 명령 ... 269
   9.5 세그먼트 오버라이트 프리픽스와 GROUP 의사 명령어 ... 270
   9.6 EXTRN, PUBLIC 선언 ... 272
      9.6.1 PUBLIC 지시어 ... 273
      9.6.2 EXTRN 지시어 ... 273
   9.7 인크루트(include) 파일의 사용 ... 279
연습 문제 ... 283
제10장. 어셈블리 언어와 Visual C++ 과의 연결
   10.1 Visual C++상에서의 인라인 어셈블리 코드 ... 287
      10.1.1 인라인 어셈블리 코드 작성 특징 ... 290
   10.2 Visual C++과 어셈블리 언어 ... 291
   10.3 IA-32 프로세서 어셈블리 언어와 Visual C++ 6.0과의 연결 ... 292
      10.3.1 Visual Studio 상에서 C와 어셈블리 project 생성 ... 292
      10.3.2 C 언어로 작성된 소스 프로그램 작성 ... 295
      10.3.3 Visual Studio상에서 어셈블리 프로그램 작성 ... 298
      103.4 Visual Studio상에서 작성된 C와 어셈블리 프로그램의 실행 예 ... 300
연습 문제 ... 304
제11장. 매크로(Macro)
   11.1 매크로 구조 ... 309
   11.2 매크로 내에 인수를 사용하는 경우 ... 311
      11.2.1 인수를 하나만 가지는 경우 ... 311
      11.2.2 인수를 2개 이상 가지는 경우 ... 313
   11.3 조건부 지시어 ... 315
   11.4 Local 지시어 ... 317
   11.5 블록 반복 지시어 ... 322
      11.5.1 REPT(REPEAT) 지시어 ... 322
      11.5.2 IRP(Indefinite RePeat) 지시어 ... 323
      11.5.3 IRPC(Indefinite RePeat Character) 의사 명령어 ... 324
연습 문제 ... 326
제12장. 비트별 논리 연산자
   12.1 AND, OR, XOR, NOT, TEST ... 330
      12.1.1 AND : A∧B ... 330
      12.1.2 OR : A∨B ... 332
      12.1.3 XOR(Exclusive - OR) : A+B ... 333
      12.1.4 NOT : A' 혹은 BAR A ... 335
      12.1.5 TEST ... 336
   12.2 시프트 ... 338
      12.2.1 시프트명령 ... 339
   12.3 로테이트 : RCL, RCR, ROL, ROR ... 343
      12.3.1 RCL(Rotate through Carry Left) ... 344
      12.3.2 RCR(Rotate through Carry Right) ... 346
      12.3.3 ROL(ROtate Left) ... 347
      12.3.4 ROR(ROtate Right) ... 349
연습 문제 ... 351
제13장. 10진 보정 명령어
   13.1 ASCII 코드와 10진 계산 ... 354
   13.2 ASCII 산술 연산 명령(ASCII arithmetic instruction) ... 355
      13.2.1 AAA(ASCII adjust AL after addition) ... 355
      13.2.2 AAS ; 뺄셈 뒤 ASCII 조정 ... 358
      13.2.3 AAM ; 곱셈한 뒤 ASCII 조정 ... 359
      13.2.4 AAD ; 나눗셈하기 전에 ASCII 조정 ... 360
   13.3 BCD 산술 연산 명령(DAA, DAS) ... 362
      13.3.1 DAA(Decimal Adjust AL after Addition) ... 363
      13.3.2 DAS(Decimal Adjust AL after Subtraction) ... 365
연습 문제 ... 368
제14장. 부동소수점 형(Floating Point : 실수)
   14.1 부동소수점 수 ... 370
   14.2 부동소수점 수 연산 ... 370
      14.2.1 부동 소수점 형 데이터 표현의 필요성 ... 370
      14.2
닫기