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에게 넘겨준다.

 

 

 

 

 

 

 

 

어셈블리어(assembly)는 기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어이다. 

- 위키백과


어셈블러(assembler)는 어셈블리어를 기계어 형태의 오브젝트 코드로 해석해 주는 컴퓨터 프로그램(언어번역 프로그램)을 말한다. 어셈블러는 기본 컴퓨터 명령어들을, 컴퓨터 프로세서가 기본 연산을 수행하는데 사용할 수 있는 비트 패턴으로 변환시키는 프로그램이다. 

- 위키백과


초창기엔 기계어로 직접 프로그래밍을 하였다. 하지만 사람에겐 어렵기만한 언어였다. 결국 어셈블리 언어를 개발하였고 이는 0과 1로 된 기계 코드 명령어를 대신하는 기호화 코드(mnemonic)를 이용하여 만든 것이다. 니모닉 코드란 mnemonic, 기억을 돕는다는 의미로 기억하기 쉽도록 간략하게 만든 코드를 말한다.


어셈블러란 어셈블리어를 기계어로 번역해주는 프로그램으로 C로 작성된 코드를 실행하기 위해 C 컴파일러로 기계어로 번역해주는 역할과 같다.


A(assemble) : 어셈블 명령를 메모리에 입력하는데 사용

-A <시작 번지> 



시작 번지를 지정해주고 다음 줄부터 명령어를 입력해 주면된다. debug는 모든 숫자를 16진수로 처리하므로 뒤에 'H'를 붙히지 않아도 된다. 하지만 다른 어셈블리어 프로그램에서는 숫자 뒤에 'H'를 붙혀줘야 한다.

※ 100H부터 시작한 이유는 처음 100H(256)바이트는 DOS에 의해 예약되어 있으며 사용자 프로그램이 사용해서는 안된다.


U(unassemble) 명령 : 기계 코드 확인

-U <시작 번지> <끝 번지>

-U <시작 번지> <L 바이트 수> 



메모리에 있는 기계 코드와 어셈블리어를 보여준다. A 명령이 입력한 어셈블리 명령어를 기계코드로 변환하여 메모리제 저장하는 반면, U 명령은 메모리에 저장된 기계코드를 어셈블리 명령으로 변환해 보여준다.


G(go) 명령 : 실행 명령

-G <=시작 번지> <정지 번지(들)> 



시작번지에서부터 정지번지까지의 명령어들을  실행시키는 명령어이다. 위 사진은 g만 입력했으므로 메모리에 저장된 명령어들을 모두 실행한 것이다. 정지 번지에는 10개까지 넣을 수 있으며 각 브레이크 포인트에서 실행을 멈춘다. 

먼저 DOS상태에서 Debug 프로그램으로 들어가기 위해서는 cmd창에서 debug를 입력하면된다.

(윈도우7 64bit는 debug가 되지 않아서 DOSBox를 이용해서 들어가기 때문에 debug.exe로 들어갔다.)

들어가게되면 '-'가 나타나며, 입력을 기다리게 된다. 빠져나오는 방법은 q(quit)를 입력하면 된다.



레지스터의 내용 확인 및 변경하기.

 -r <레지스터 이름>


첫번째 줄 : 범용 레지스터, 포인터 및 인덱스 레지스터의 내용

두번째 줄 : 세그먼트 레지스터의 내용, 명령 포인터의 현재값 및 플래그 레지스터 비트

  두번째 줄의 끝에 'NV UP EI ...NC'는 플래그 레지스터의 8비트의 상태를 나타냄.

세번째 줄 : CS:IP가 가리키는 명령어, 시스템에 따라 다름.


Debug로 처음 들어가면, 범용 레지스터가 0으로 설정되고 플래그 비트도 모두 리셋된다. 

세그먼트 레지스터의 내용은 사용하고 있는 시스템에 따라 다르지만, 모든 세그먼트는 동일한 값을 가지며 이것은 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에게 어떤 작업을 해야 하는지 알려준다.

컴퓨터의 내부 구조

모든 컴퓨터의 내부 구조는 크게 세 부분으로 나누어진다. : 

  CPU(Central Processing Unit, 중앙처리장치), 메모리, I/O(Input/Output, 입출력) 장치.

CPU는 버스(bus)라 불리는 여러 가닥의 전선을 통해 메모리와 I/O장치에 연결되어 있다.

컴퓨터에는 어드레스 버스(address bus), 데이터 버스(data bus), 컨트롤 버스(control bus)의 세 가지 종류의 버스가 있다.


버스(bus) : 구성 요소들간에 교환할 각종 정보들을 전송하는 선(line)들로 구성.

1) 데이터 버스(data bus)

  · CPU와 장치 사이의 정보 교환을 위한 선들의 집합.

  · 양방향 전송.

  · 크기가 클수록 CPU의 성능이 좋다고 할 수 있다.

2) 어드레스 버스(address bus)

  · CPU에 연결된 메모리와 장치를 선택하기 위한 선들의 집합.

  · 단방향 전송

  · 클수록 더 많은 양의 메모리 혹은 장치를 번지지정할 수 있다.(기억장치의 용량이 결정)

    x를 어드레스 라인의 수라고 할 때 메모리의 최대 위치 개수는 

3) 컨트롤 버스(control bus)

  · CPU와 기억장치 및 I/O 장치 사이에 제어 신호들을 전송하는 선들의 집합.


CPU와 RAM, ROM과의 관계

CPU가 처리할 정보는 RAM이나 ROM에 저장되어 있어야 한다. ROM(Read Only Memory)은 비휘발성 메모리로써 컴퓨터 작동에 필수적인 프로그램, RAM을 테스트하고 설치된 RAM의 크기를 알아내는 프로그램등 변하지 않고 꼭 필요한 정보만을 보관하고 있다가 CPU에 제공한다. RAM(Random Access Memory)은 전원을 끄면 보관되어 있던 데이터는 모두 사라지는 휘발성 메모리로써 실행되고 있는 프로그램을 일시적으로 저장하거나 사용자나 프로그램에 의해 내용을 바꿀수 있는 정보를 저장하기 위해 사용되며 예로 들면 워드프로세싱, 운영체제등 응용프로그램들이 해당된다.

CPU는 처리할 정보를 먼저 RAM, ROM에서 찾아보고 없을 경우 디스크에서 찾는다. 디스크에 있는 정보는 먼저 RAM으로 옮겨진 다음 처리되는데 이런 이유로 해서 RAM, ROM을 주기억장치(primary memory), 디스크를 보조기억장치(secondary memory)라 부르기도 한다.


CPU의 내부

CPU의 가장 기본적인 기능은 메모리에 저장되어 있는 명령어를 읽어와서 수행하는 것이다.  

1. 레지스터(register)CPU가 가지고 있는 자원 중 가장 중요한 것으로 정보를 일시적으로 저장하기 위해 사용

   레지스터가 많을수록 좋은 CPU지만 그 만큼 가격이 비싸다.

2. ALU(Arithmetic / Logic Unit, 연산장치) : 산술연산과 논리연산을 수행한다.

3. PC(Program counter) : 다음에 수행할 명령어의 주소를 가르킴. IBM PC에서는 IP(instruction pointer)라고 부른다

4. 명령어 디코더(instruction decoder) : 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 덕분에 어셈블리공부는 시작도 안했지만 뭐하나 하더라도 어려울것 같다... 우선 차근차근 하나씩 배워나가야겠다.

이번 학기 수업으로 어셈블리언어를 듣게 되었는데 window 7 64bit 에서는 cmd에서 debug가 안된다고 한다. OS를 갈아타긴 좀 무리인가 싶어 DOSBox를 다운받았다. DOS모드에서 실행되던 고전게임을 실행하기 위한 에뮬레이션이라고 하는데 debug가 되니 어셈을 공부하기에 딱인 듯 싶다.


 DOSBox 다운로드(새창)


먼저 처음 실행을 하고나면 아래와 같은 화면이 나온다. 처음에 Z드라이브로 시작되는데 C드라이브(혹은 작업할 드라이브)로 이동하려면 mount c c:\ 를 입력한다.



아래 화면과 같이 마운팅 시키고난 뒤에 c: 를 입력하면 바뀌게 된다. 

dir은 현재 폴더에 있는 파일,폴더 목록을 보여주는 명령어이다.



폴더를 확인하고 cd 폴더명으로 이동하면 된다.

상위폴더로 이동하는 것은 cd.. 이다.



다음 포스팅에는 debug를 해보고 사용방법에 대해서 포스팅하겠다.

+ Recent posts