GDB 메모리 조사 방법

examine을 줄인 명령 x로 메모리를 조사할 수 있다.
  • 현재 명령의 위치 확인 방법 : info register eip -> i r eip (축약형)

형식 문자

  • o : 8진법으로 확인
  • x : 16진법으로 확인
  • u : unsigned 표준 10진법으로 확인
  • t : 2진법으로 확인


  • 여러개 확인 하는 방법 : 위 형식문자 앞에 숫자를 넣어준다.


표시 유닛 크기

메모리 단일 유닛의 기본 크기는 워드(Word)로 4 Byte다.

사용방법은 형식 문자 끝에 추가하여 바꿀 수 있다.

  • b : 단일 바이트
  • h : 2바이트의 하프워드(Halfword)
  • w : 4바이트의 워드
  • g : 8바이트의 자이언트(Giant)


STSEG SEGMENT STACK 'stack'

DB 64 DUP(?)

STSEG ENDS

;---

DTSEG SEGMENT

DATA1 DB 'mY NAME is jUn'

ORG 0020H

DATA2 DB 14 DUP(?)

DTSEG ENDS

;----

CDSEG SEGMENT

MAIN PROC FAR

ASSUME CS:CDSEG, DS:DTSEG, SS:STSEG

MOV AX, DTSEG

MOV DS, AX

MOV SI, OFFSET DATA1

MOV BX, OFFSET DATA2

MOV CX, 14

BACK: MOV AL, [SI]

CMP AL, 41H

JB OVER

CMP AL, 5AH

JA OVER

OR AL, 00100000B

OVER: MOV [BX], AL

INC SI

INC BX

LOOP BACK

MOV AH, 4CH

INT 21H

MAIN ENDP

CDSEG ENDS

END MAIN


 window 7에서 어셈블하고 Debug하기


과제를 하려는데 제 컴퓨터(윈도우7 64bit)에서는 debug도 안되고 masm이 없어서 아무것도 안되서 이것저것 찾아 보았습니다.

더 편한 방법이 있겠지만 급한대로 요긴하게 사용할 수 있을 것 같아 올립니다.


** DOSBOX에서 'link 파일명' 할 때 파일이 있는데 오브젝트파일을 찾을 수 없다는 메세지가 뜰 경우.

-> .obj 파일의 이름은 8글자까지만 link되는 것 같습니다. 

아래 파일을 다운받고 실행은 모두 파일을 저장한 폴더 내에서 실행하셔야 합니다.


debug.exe


link.exe


masm.exe


ml.exe

※ 파일 올린 것에 문제가 있다면 말씀해주시면 바로 삭제하겠습니다.


1. 먼저 cmd에서 어셈블해서 obj 파일을 만들어 줍니다.


2. 실행파일을 만들기 위한 link는 DOSBox에서 실행합니다.

    관련글 

    [어셈] win7 debug 사용방법 - DOSBox 다운, 사용

    [어셈] win7 debug 사용방법

    [어셈] Debug 프로그래밍 - 들어가기, 내용 확인 변경하기

    [어셈] Debug 프로그래밍 - 작성, 실행하기



3. 실행파일이 만들어지면 도스박스에서 디버그해서 확인할 수 있습니다.




1. 프로그램 세그먼트의 개요

최소한 3개의 세그먼트로 구성 : 코드 세그먼트, 데이터 세그먼트, 스택 세그먼트

코드 세그먼트 : 프로그램이 수행해야 할 명령어들을 가지고 있다

데이터 세그먼트 : 코드 세그먼트에 있는 명령어 들이 처리해야 할 데이터를 저장하는 곳

스택 세그먼트 : 일시적으로 정보를 보관하는 곳

 

1.1 세그먼트의 시작 위치와 정의

세그먼트 : 메모리의 한 영역, 최대 64kb의 공간을 차지, 시작번지는 0H로 끝나는 번지로 항상 16으로 나누어 떨어져야 한다.

 

1.2 논리 번지와 물리 번지

물리번지(physical address) : CPU의 어드레스 핀에 출력, 메모리 인터페이스 회로에 의해 디코드되는 20비트 번지, 8086 명 리얼모드(286, 386, 486)에서 모두 00000H~FFFFFH. 1mb의 메모리 범위 내에 있음. ROM, RAM의 실제 번지.

옵셋 번지(offset address) : 64kb 세그먼트 범위 내에 있는 번지로 0000H~FFFFH의 값을 가짐.

논리 번지(logical address) : 세그먼트의 값과 옵셋 번지로 결정


ex) CS:IP 24F6:634A

논리번지 : 24F6:634A

옵셋번지 : 634A

물리번지 : 24F60H + 634AH = 2B2AAH

(H는 16진수를 표현한다.)  

물리번지의 최소값 : 24F60 + 0000 = 24F60

코드 세그먼트의 최대값 : 24F60 + FFFF = 34F5F

 

1.3 코드 세그먼트

프로그램을 수행하기 위해 8086은 명령어를 코드 세그먼트에서 읽어옴. 명령어의 논리 번지는 항상 CS(code segment)와 IP(instruction pointer)로 구성되며 CS:IP로 표현한다.

 

1.4 리틀 엔디언 규칙

16비트의 데이터를 저장할 땐, 하나의 번지에 1바이트의 데이터가 저장되므로 2개의 번지에 나누어야 하는데 그때 하위바이트는 아래쪽의 번지에, 상위 바이트는 위쪽의 번지에 저장하는 것을 말한다.

 

1.5 엑스트라 세그먼트

ES(extra segment)는 여분의 데이터 세그먼트로 쓰임. 문자열(string)을 다루는 데 있어서 중요한 역할을 한다.

 

1.6 IBM PC의 메모리 맵

RAM

640K

00000H ~ 9FFFFH

(0~255 : 인트럽터벡터테이블,

BIOS 데이터 영역)

Video Display

RAM 238K

A0000H ~ BFFFFH

ROM

256K

C0000H ~ FFFFFH

(F0000H ~ FFFFFH 까지만 BIOS에 의해 사용)


1.6.1 RAM

휘발성 메모리로써 메모리를 관리하는 일은 아주 복잡하기 때문에 사용자에게 맡겨지지 않고 DOS에 맡겨진다. 일반 사용자는 물리 번지를 지정하는 것에 대한 지식이 없기 때문에 CS, DS, SS 같은 세그먼트 레지스터의 값을 직접 다루지 않는다.

 

1.6.2 ROM

비휘발성 메모리로 C0000H에서 FFFFFH까지가 ROM을 위한 할당이다. 이중 F0000H에서 FFFFFH까지의 64KB만 BIOS에 의해 사용된다. 그 외의 공간은 여러 가지 어댑터 카드에 의해 쓰이거나 비어 있다.

 

1.6.3 BIOS ROM의 기능

CPU는 메모리에 저장되어 잇는 프로그램만 수행할 수 있으므로 전원 스위치를 켰을 때 CPU가 수행해야 할 프로그램을 보관하고 있는 비휘발성 메모리가 필요하다. ROM에 저장되어 있는 이런 프로그램들 PC에서는 BIOS라고 하며, RAM과 CPU에 저장되어 있는 여러 가지 장치를 테스트하고 에러를 사용자에게 알려준다. 주변기기에 대한 테스트와 초기화가 모두 끝나게 되면 DOS를 RAM에 적재하고, PC의 컨트롤을 DOS에게 넘겨준다.

 

 

 

 

 

 

 

 

1. 24K 바이트는 몇 바이트인가?

1024 x 24 = 24576 byte


2. RAM은 무엇의 약자인가? 컴퓨터에서 RAM은 어떻게 이용되는가?

Random Access Memory. 휘발성 메모리로써 실행되고 있는 프로그램을 일시적으로 저장하기 위해 이용,

    사용자나 프로그램에 의해 그 내용을 바꿀 수 있는 정보를 저장하기 위해 사용된다.


3. ROM은 무엇의 약자인가? 컴퓨터에서 ROM은 어떻게 이용되는가?
Read Only Memory. 비휘발성 메모리로써 컴퓨터 작동에 필수적인 프로그램과 정보를 보관하며 사용자가 정보를 바꿀 수 없다(프로그램을 통해 바꿀수도 있지만 보통 바꿀 수 없다.)


4. RAM을 왜 휘발성 메모리라고 하는가?

전원을 끄면 메모리에 저장된 정보는 없어지기 때문이다.


5. 컴퓨터의 가장 중요한 세 가지 구성요소를 나열하다.

CPU, 메모리, I/O장치


6. CPU는 무엇의 약자인가? 컴퓨터에서 CPU의 기능을 설명하라.

Central Processing Unit. 컴퓨터의 두뇌라고 할 수 있으며, 메모리에 저장되어 있는 명령어를 읽어와서 수행한다.

프로그램을 수행하고 컴퓨터 내의 모든 장치를 제어한다.


7. 세 가지 종류의 버스를 열거하고 이등 각각의 기능을 간단히 서술하라.

data bus, address bus, control bus

data bus : CPU와 장치 사이의 정보 교환을 위해 사용되며 크기가 클수록 CPU의 성능이 좋아진다.

address bus : CPU에 연결된 메모리와 장치를 선택하여 그 번지를 전송하며 버스가 클수록 더 많은 양의 메모리를 지정할 수 있다.

control bus : CPU에 의해 사용되며 I/O장치를 제어하는 신호를 전달한다.


8. 다음의 버스 중 어느 것이 단방향이고 어느 것이 양방향 버스인지 밝혀라.

  데이터 버스 : 양방향         어드레스 버스 : 단방향


9. 어떤 컴퓨터의 어드레스 버스가 16라인이면 이 컴퓨터의 CPU가 다룰 수 있는 최대 메모리의 크기는 얼마인가?

2의 16승으로 65536, 64K 이다.


10. ALU는 무엇의 약자인가? 또 그 기능은 무엇인가?
Arithmetic/Logic Unit. CPU내에서 산술연산과 논리연산을 하는 연산장치이다.


11. CPU 내의 레지스터는 어떤 목적으로 이용되는가?
정보를 일시적으로 저장한다.


12. 프로그램 카운터의 기능은 무엇인가?
다음에 수행할 명령어의 번지수를 기억한다.


13. 명령어 디코더의 기능은 무엇인가?
CPU 내부로 읽어온 명령어를 해독하는 역할, 모든 명령어의 의미를 보관하고서 어떤 명령어가 주어지면 CPU에게 어떤 작업을 해야 하는지 알려준다.


2013/09/05 - [대학 정리노트/어셈블리] - [어셈] win7 debug 사용방법 - DOSBox 다운, 사용


이전 포스트에서 DOSBox를 설치하였다. 입력창에 debug를 쳐도 계속 되지않아서 몇시간째 고민이다.

해결방법은 여러가지였다. 먼저 특별버전인 DOSBox SVN을 설치해서 사용하던지, debug.exe를 받아서 실행하는 방법이 있었고 나는 후자인 현재 받은 DOSBox에서 debug.exe를 사용하는 방법을 선택했다.

먼저 SVN버전을 다운받을수 있는 카페와 다른빌드 사이트이다.


DOSBox SVN DAUM버전

위 카페말고 다운로드 사이트

그 외 다른 빌드


이제 DOSBox에서 debug 사용방법이다. 방법은 아주 간단하다.

먼저 아래 링크를 통해 debug.exe 파일을 받는다.


 debug.exe


압축을 풀고 원하는 폴더에 넣는다. (나는 D 드라이브에 넣었다.)

먼저 D드라이브를 마운트(DOSBox에서 해당 드라이브를 인식?시킨다.)하고 debug.exe를 실행시키면된다.



윈도우7 덕분에 어셈블리공부는 시작도 안했지만 뭐하나 하더라도 어려울것 같다... 우선 차근차근 하나씩 배워나가야겠다.

+ Recent posts