[Assembly] ORG 지시자에 관한 질문..

gyxor의 이미지

ORG지시자의 처리를 알아보기 위해서

A86 어셈블러, MASM5.1과 6.1 ,NASM(nasm-0.98.39-win32) 그리고 리눅스의 AT&T 문법의 어셈블러

이렇게 4가지 어셈블러로 어셈블한뒤에 debug해봤습니다.

ORG 지시자를 사용하면 적재될 메모리의 위치를 정할 수 있었고

CS 레지스터로 부터 OFFSET을 정하고
그 메모리 위치에 로더가 로딩을 했습니다.

ORG 7C00h로 하면

.MODEL SMALL 
ORG 7c00H 
.CODE 
BEGIN: 
DATA1 DB "FANTASY!!!" 
MOV AH,4CH 
INT 21H 
END BEGIN 
 

A86 어셈블러로 컴파일해서 .. 디버깅 해보면


D:MASMTest>DEBUG BOOT.COM 
-R 
AX=0000 BX=0000 CX=7B0E DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 
DS=0CB9 ES=0CB9 SS=0CB9 CS=0CB9 IP=0100 NV UP EI PL NZ NA PO NC 
0CB9:0100 90 NOP 
-D 7C00 
0CB9:7C00 46 41 4E 54 41 53 59 21-21 21 B4 4C CD 21 00 00 FANTASY!!!.L.!.. 
0CB9:7C10 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 
0CB9:7C20 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 
0CB9:7C30 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 
0CB9:7C40 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 
0CB9:7C50 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 
0CB9:7C60 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 
0CB9:7C70 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 
- 
 

offset 7c00위치에서 부터 코드가 적재된것을 볼 수 있습니다.

MASM또한 그렇습니다.

아래는 AT&T문법 소스입니다.

리눅스에서 어셈블한뒤에 FTP로 받아서 DEBUG한 결과 입니다.

.global _start
.org 0x7c00
_start:
data1: 
.ascii "HELLO"
movb $0x0e , %ah
movb $0x52 , %al
int $0x10

D:MASMTest>debug test1
-r
AX=0000 BX=0000 CX=7C0B DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0C3A ES=0C3A SS=0C3A CS=0C3A IP=0100 NV UP EI PL NZ NA PO NC
0C3A:0100 0000 ADD [BX+SI],AL DS:0000=CD
-d 7c00
0C3A:7C00 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0C3A:7C10 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0C3A:7C20 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0C3A:7C30 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0C3A:7C40 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0C3A:7C50 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0C3A:7C60 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0C3A:7C70 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
-d 7d00
0C3A:7D00 48 45 4C 4C 4F B4 0E B0-52 CD 10 00 00 00 00 00 HELLO...R.......
0C3A:7D10 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0C3A:7D20 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0C3A:7D30 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0C3A:7D40 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0C3A:7D50 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0C3A:7D60 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0C3A:7D70 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
-
7c00이 아닌 7d00위치로 로딩이 됐습니다.

아래는 NASM 소스입니다.

[ORG 7c00h]
[BITS 16]

JMP 0X7C00:START
DATA1 DB "HELLO",'$'
START: MOV AH,4CH
INT 21H

D:MASMTest>nasm n.asm

D:MASMTest>nasm -o n.exe n.asm

D:MASMTest>debug n.exe
-r
AX=0000 BX=FFFF CX=FE0F DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=0C9E ES=0C9E SS=0C9E CS=0C9E IP=0100 NV UP EI PL NZ NA PO NC
0C9E:0100 EA0B7C007C JMP 7C00:7C0B
-d
0C9E:0100 EA 0B 7C 00 7C 48 45 4C-4C 4F 24 B4 4C CD 21 70 ..|.|HELLO$.L.!p
0C9E:0110 74 06 3C 61 74 0A EB 13-2E 80 0E 05 B8 04 EB 06 t.<at...........
0C9E:0120 2E 80 0E 04 B8 01 2E C6-44 FE 00 5E 58 C3 50 57 ........D..^X.PW
0C9E:0130 56 2E 8B 3E 06 B8 2E 8A-04 0A C0 74 13 E8 5F 00 V..>.......t.._.
0C9E:0140 75 24 2E C6 06 D2 B8 01-5E 2E C6 04 00 5F EB 3F u$......^...._.?
0C9E:0150 5E 2E C6 04 00 5F 26 F7-07 01 00 75 32 2E C7 06 ^...._&....u2...
0C9E:0160 F9 B7 02 00 EB 29 58 56-2E 8A 04 0A C0 74 1E E8 .....)XV.....t..
0C9E:0170 2D 00 74 0B E8 68 01 73-02 47 46 47 46 EB E9 2E -.t..h.s.GFGF...
-
org지시자는 무시해 버립니다.

org와 관계없이 IP=0100 이며 로딩되는 위치도 0100 이었습니다.

첫째,
org는 컴파일러에게만 정보를 제공하는 지시자로 알고 있습니다.
org의 위치 설정이 실행 파일에 반영이 되어서,

나중에 로더가 실행을 시킬때에 그 설정대로 정해진 메모리 위치로 로딩을 하는 것인가요?
그렇다면 어셈블러마다 org지시자의 처리가 다른것인가요?

---------------------------------------------------------------------------

.MODEL SMALL 
.STACK 64 
.DATA 
DATA1 DB "HELLO",'$' 
.CODE 
ORG 7c00H 
MAIN PROC FAR 
MOV AX, @data 
MOV DS, AX 
MOV ES, AX 

MOV AH,09H 
LEA DX,DATA1 
INT 21H 

MOV AH, 4CH 
INT 21H 
MAIN ENDP 
END MAIN 

 

MASM으로 컴파일 했습니다.
위 소스를 디버깅한 결과 입니다.



D:MASMTest>debug test.exe 
-r 
AX=0000 BX=0000 CX=7C1A DX=0000 SP=0040 BP=0000 SI=0000 DI=0000 
DS=0CB9 ES=0CB9 SS=148B CS=0CC9 IP=7C00 NV UP EI PL NZ NA PO NC 
0CC9:7C00 B88A14 MOV AX,148A 
-d 
0CC9:7C00 B8 8A 14 8E D8 8E C0 B4-09 8D 16 04 00 CD 21 B4 ..............!. 
0CC9:7C10 4C CD 21 00 48 45 4C 4C-4F 24 00 00 00 00 00 00 L.!.HELLO$...... 
0CC9:7C20 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 
0CC9:7C30 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 
0CC9:7C40 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 
0CC9:7C50 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 
0CC9:7C60 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 
0CC9:7C70 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 
-d 148a:0 
148A:0000 4C CD 21 00 48 45 4C 4C-4F 24 00 00 00 00 00 00 L.!.HELLO$...... 
148A:0010 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 
148A:0020 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 
148A:0030 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 
148A:0040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 
148A:0050 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 
148A:0060 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 
148A:0070 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 
- 
 

두번째 소스와 디버깅 결과 입니다.

 
.MODEL SMALL 
.STACK 64 
.DATA 
DATA1 DB "HELLO",'$' 
.CODE 
MAIN PROC FAR 
ORG 7c00H 
MOV AX, @data 
MOV DS, AX 
MOV ES, AX 

MOV AH,09H 
LEA DX,DATA1 
INT 21H 

MOV AH, 4CH 
INT 21H 
MAIN ENDP 
END MAIN 


D:MASMTest>debug test.exe 
-r 
AX=0000 BX=0000 CX=7C1A DX=0000 SP=0040 BP=0000 SI=0000 DI=0000 
DS=0CB9 ES=0CB9 SS=148B CS=0CC9 IP=0000 NV UP EI PL NZ NA PO NC 
0CC9:0000 0000 ADD [BX+SI],AL DS:0000=CD 
-d 0cc9:7c00 
0CC9:7C00 B8 8A 14 8E D8 8E C0 B4-09 8D 16 04 00 CD 21 B4 ..............!. 
0CC9:7C10 4C CD 21 00 48 45 4C 4C-4F 24 00 00 00 00 00 00 L.!.HELLO$...... 
0CC9:7C20 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 
0CC9:7C30 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 
0CC9:7C40 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 
0CC9:7C50 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 
0CC9:7C60 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 
0CC9:7C70 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 
-r ip 
IP 0000 
:7c00 
-r 
AX=0000 BX=0000 CX=7C1A DX=0000 SP=0040 BP=0000 SI=0000 DI=0000 
DS=0CB9 ES=0CB9 SS=148B CS=0CC9 IP=7C00 NV UP EI PL NZ NA PO NC 
0CC9:7C00 B88A14 MOV AX,148A 
-d 148a:0 
148A:0000 4C CD 21 00 48 45 4C 4C-4F 24 00 00 00 00 00 00 L.!.HELLO$...... 
148A:0010 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 
148A:0020 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 
148A:0030 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 
148A:0040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 
148A:0050 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 
148A:0060 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 
148A:0070 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 
- 

둘째,
위 두 소스는 org 지시자의 위치만 다르고 나머지는 같습니다.
디버깅 결과를 보면 두 소스의 차이는
IP 레지스터가 org의 셋팅을 반영하는지의 여부입니다.
procedure안에서 org를 사용하면 ip레지스터에 변경사항이 반영되지 않습니다. procedure 밖에서 사용하면 ip레지스터에 org의 설정이 반영이 됩니다. (첫번째 소스코드는 ip값이 0 이 아니라 7c00인것을 볼 수 있습니다.)
a86어셈블러로 하면 org와 관계없이 IP가 초기값 100이며

(COM형식의 실행파일을 디버깅해보면 모두 그랬습니다.)
NASM을 사용하여도 org와 관계없이 IP초기값이 100입니다.

리눅스에서 어셈블한것도 org와 관계없이 IP초기값이 100입니다.
분명 IP값 또한 실행파일로 부터 정보를 얻는것으로 생각됩니다.
실행파일의 정보를 통해서 (적재되는 위치뿐만아니라) IP레지스터값도 셋팅하는것인가요?
---------------------------------------------------------------------------
셋째, 위 두 소스를 보면 MASM형식인데요..
stack segment
data segment
code segment
의 영역에 따라 ss,ds,cs의 값이 다 다릅니다.
즉 메모리 영역이 구분이 되는것인데요..
그럼에도 불구하고
위 소스에서 두가지 경우 모두 "HELLO"라는 데이터는
코드 영역과 데이터 영역에 둘다 들어갑니다.
또한 데이터 영역에 들어갈때에
(앞서 COM형식에서와는 달리...)
4C CD 21 00 라는 4바이트 값이 문자열 이전에 들어갑니다.

exe파일은 어셈블러에 관계없이 동일한 형식이어야 하는것 아닌가요?

NASM Manual을 참고해서

http://alien.dowling.edu/~rohit/nasmdoc7.html#section-7.1.1

segment data 
hello: db 'HEllo,world',0xa

segment code

mov ax, data
mov ds,ax
mov ah,09h
lea dx , [ds:hello]
int 21h
NASM의 exe형식으로 작성을 해봤는데요.. 에러가 납니다.

mov ax,data가 문제인데요..

MASM에서는 data segment의 위치를 지정하기 위해

mov ax,@data 를 사용했는데요..

NASM에서는 어떻게 하는것인지 모르겠습니다.

따라서 ..비교는 해보지 못했습니다.

왜 이렇게 되는것인지 설명부탁드립니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.