[asm] 프로그램 진입점은 항상 원거리(far)가 아닌가요?

gurumong의 이미지

어셈블리어를(MASM, MS-DOS) 공부하고있습니다

여기에 두수의 합을 계산하는 두개의 원시프로그램이 있는데요
하나는 EXE를 위한것이고 다른 하나는 COM을 위한것입니다

제가 알기로는 운영체제로부터 프로그램의 진입점으로 사용하기 위해
첫번째 실행되는 명령어를 포함하는 프로시져는 원거리(far) 여야한다고 알고있는데요
책에서 COM을 위한 원시코드를 보여줄때에는
진입점이 프로시져가 아니라 어떤 하나의 레이블이고 그래서 원거리(far)가 아닌데요

왜 그렇게 차이가 나는지에 대해서 전혀 이해가 되질 않습니다 T.T

EXE를 위한 원시코드

        page    60,132
TITLE   A04ASM1 Skeleton of an .EXE Program
; ------------------------------------------------------------
STACK   SEGMENT PARA STACK 'Stack'
        DW      32 DPU (0)
STACK   ENDS
; ------------------------------------------------------------
DATASEG SEGMENT PARA 'Data'
        FLDD    DW      215
        FLDE    DW      125
        FLDF    DW      ?
DATASEG ENDS
; ------------------------------------------------------------
CODESEG SEGMENT PARA 'Code'
<span><span>MAIN    PROC    FAR</span></span>
        ASSUME  SS:STACK,DS:DATASEG,CS:CODESEG
        MOV     AX,DATASEG      ;Set address of data
        MOV     DS,AX           ;  segment in DS
        MOV     AX,4C00H        ;End processing
        INT     21H
MAIN    ENDP                    ;End of procedure
CODESEG ENDS                    ;End of segment
<span><span>        END     MAIN            ;End of program</span></span>

COM을 위한 원시코드

TITLE   A05COM1 COM program to move and add
;------------------------------------------------------------
CODESEG SEGMENT PARA 'Code'
        ASSUME  CS:CODESEG,DS:CODESEG,SS:CODESEG,ES:CODESEG
        ORG     100H
<span><span>BEGIN:  JMP     MAIN</span></span>
;------------------------------------------------------------
FLDD    DW      215
FLDE    DW      125
FLDF    DW      ?
;------------------------------------------------------------
MAIN    PROC    NEAR
        MOV     AX,FLDD
        ADD     AX,FLDE
        MOV     FLDF,AX
        MOV     AX,4C00H
        INT     21H
MAIN    ENDP
CODESEG ENDS
<span><span>        END     BEGIN</span></span>

단순히 215와 125를 더해서 FLDF 위치에 저장하고 종료하는 단순한 프로그램입니다
중요한 부분을 굶게하고 이탤릭으로 표시했는데;; 눈에 잘 띄지 않네요 T.T

grassman의 이미지

COM 파일의 경우 CS, DS, ES, SS 모두 같은 세그먼트를 가리키며 세그먼트의
변경을 (원칙적으로는) 허용하지 않습니다. 따라서 offset 만으로 프로그램의
전체 범위를 접근할 수 있기 때문에 굳이 far를 붙일 이유가 없습니다. 또한
COM 파일은 헤더를 갖추고 있지 않기 때문에 코드의 실행 시작지점이 고정되어
있습니다.

EXE 파일의 경우 메모리 모델에 따라 CS, DS(ES), SS가 다를 수 있으며 CS 또한
프로그램 크기에 따라 바뀔 수 있습니다. 또한 헤더를 갖추고 있으므로 실행
시작지점이 far pointer 형태로 지정되어야 합니다.

그런데 MS-DOS에 의존적인 내용은 요즘 쓸 일도 없으므로 어셈블리 프로그래밍
감각만 익히시길 권합니다.

gurumong의 이미지

운영체제로부터의 진입점이니까...
운영체제와 같은 세그먼트내에 있는것이 아니라면
스택,코드,데이터 세그먼트가 모두 하나의 세그먼트로 이루어져있더라도
원거리가 되어야 하는것이 아닌가요? T.T

     서 로 다 른 세 그 먼 트
운영체제 --------------------- 프로그램 시작지점
      far(원거리)

grassman의 이미지

COM이든 EXE든 운영체제에서 far jump(call)나 그에 상응하는 호출 방식을 써야하는
것은 당연한 얘기입니다. 앞에서도 설명했듯이 COM 파일에는 헤더가 없습니다.
프로그램의 진입지점은 항상 COM 파일의 offset 0에서 시작합니다. 따라서 END proc_name
구문 자체에 의미가 없습니다. (offset 0은 실제 실행파일의 binary 기준입니다. 메모리에
적재된 상태에서는 그 위치가 100h로 이동합니다)

그리고 MASM에서 관심을 두는 것은 코드가 운영체제에 의해 적재되고 실행할 준비가 된
이후 시점에 대해서만 관심을 가집니다. 그전에 어떠한 적재 방법을 통해 CS:IP가 지정된
위치를 가리키게 될 것인지는 MASM에서 관심을 둘 필요가 없는 것입니다. (EXE의 경우에는
EXE 헤더의 진입 지점 정보를 이용하고 COM은 offset 100h 부터 실행한다는 것이 정해진
약속이므로 거기에 맞추어 실행 파일을 생성하기만 하면 되는 겁니다)

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.