NASM으로 procedure에 관한 질문 두 가지입니다.

HDNua의 이미지

안녕하세요. 시간이 안 가는 ★병장★ HDNua입니다.

아직도 작성하고 있는 compiler를 위해 MASM, NASM 등의 어셈블리 서적을 참고해가면서
어셈블리 인터프리터를 동시에 개발하고 있습니다.

MASM을 공부할 때는 프로시저라는 것이 반드시 정의되어야 하는 것이라고 생각했는데
NASM을 보니 프로시저는 단순한 레이블일 뿐이었군요. 처음 알았습니다.

(1) 이걸 제 가상 머신에 적용하려고 생각해보니 다음과 같은 문제가 떠올랐습니다.

code.asm
-----
segment .text
 global _main       ; _main procedure is global
_main:              ; proc _main definition start
 push ebp           ; save previous stack base pointer
 mov ebp, esp       ; make new procedure stack
 push 2             ; 
 push 1             ; 
 call sum           ; sum(1, 2)
 add esp, 8         ; restore stack pointer
 jmp _end           ; jump to label _end
_end:               ; proc _main end
 mov esp, ebp       ; move stack pointer to present procedure's base
 pop ebp            ; load stored stack base pointer
 exit               ; terminate program
 
_sum:               ; proc _sum definition start
 push ebp           ; save previous stack base pointer
 mov ebp, esp       ; make new procedure stack
 mov edx, [ebp+0x8] ; edx = second parameter
 mov eax, [ebp+0xc] ; eax = first parameter
 mov eax, edx       ; eax += edx
 jmp _end           ; jump to label _end
_end:               ; proc _sum end; _main 프로시저와 레이블 이름이 충돌하는 지점
 mov esp, ebp       ; move stack pointer to present procedure's base
 pop ebp            ; load stored stack base pointer
 ret                ; return to previous instruction address

파일 하나에서 _end를 함수의 끝으로 정하자니, 프로시저가 두 개 이상이 되면 충돌해서 불가능합니다.
이 문제를 해결하려면 각각의 _end 레이블 이름 앞에 프로시저의 이름을 넣어서 충돌하지 않게 해야 한다고 생각합니다.
MASM에는 proc, endp 디렉티브를 준비함으로써 이 문제를 해결했는데, NASM에는 이 문제를 해결하는 근본적인 방법이 없나요?
(지금 제가 만드는 HASM에는 proc, endp를 디렉티브로 준비하여 procedure 이내에 선언된 모든 레이블에 procedure의 이름을 자동으로 붙이는 방법을 생각하고 있습니다.)

(2) MASM 서적에서도 답을 찾지 못하고 검색 실력이 부족한지 proc far, jmp short 등으로 검색해봐도 나오질 않아 질문합니다.
MASM에서의 near/far, NASM에서의 short이 도대체 무슨 역할을 하는 것인가요?
near면 파일 내, far면 파일끼리 연결 뭐 그런 식인지, 그러면 global 디렉티브는 그냥 있는 건지..
동시에 두 언어를 참고해서 그런건지, 아니면 공부할 환경이 없어 실제로 테스트를 못 해봐서 그런건지 도무지 답을 찾을 수 없습니다.

이런 이유로 KLDP 여러분의 도움을 청합니다.
읽어주셔서 감사합니다.

익명 사용자의 이미지

x86은 segment(보호 모드에서는 selector)와 offset 조합으로 주소를 지정합니다.
분기 명령에서도 주소 범위를 모두 지정할 수 있어야 하기 때문에 segment 지정을 할 수 있습니다.
그런데 일일이 segment를 지정해서 분기 하면 분기 명령의 길이가 길어지므로 두 가지 분기 명령을 만듭니다.
near는 segment 지정 없이 현재 위치의 상대 offset으로 분기 하는 반면 far의 경우 segment:offset 조합으로
segment를 바꿔서 분기 할 수 있게 합니다. flat 모드로 동작하는 운영체제에서는 응용 프로그램이 far jump를
사용하는 경우가 없을 것이므로 생소하겠지만 운영체제를 만드는 경우에는 특정 목적을 위해 사용할 경우가
가끔 있습니다.
x86 어셈블리에서 조건 분기 명령은 near(또는 short)만 사용합니다. 무조건 분기만 near와 far로 나눕니다.

HDNua의 이미지

운영체제 레벨에서 주로 사용하고 사용자 레벨에서는 거의 사용하지 않는다고 생각하면 되겠군요.
답변 감사합니다.

저는 이렇게 생각했습니다.

댓글 달기

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