3.4. AS86

AS86 은 16비트와 32비트 모두를 지원하는 80x86 용의 어셈블러이다. 이 프로그램은 Bruce Evans 의 C 컴파일러(BCC) 패키지의 일부이다. 거의 대부분 인텔의 문법을 따르지만, 주소 지정방식 등에서 약간의 차이를 보인다.

3.4.1. AS86 을 어디서 구할 수 있는가

완전히 시대에 뒤떨어진 AS86 의 버젼은 HJLu 에 의해 배포된다. 용도는 단지 리눅스 커널을 컴파일하는것 밖에 없다. bin86 패키지 (현재 버젼 0.4) 안에 포함되어 있다. 리눅스 GCC 를 구할 수 있는 곳이면 어디에나 있다. 그러나, 저자는 리눅스를 컴파일하는 용도 외에는 아무도 AS86 을 쓰지 않는다고 말해주고 싶다. 게다가 리눅스를 컴파일하는데에도, 미닉스의 오브젝트 파일 포맷을 지원하는 부분 외에는 쓰이지 않는다. 이 분야는 GNU binutils 등과 같은 다른 툴에서는 전혀 지원하지 않는 분야이다. 그리고, AS86 은 32비트 모드에서 몇가지 버그를 내포하고 있다. 그냥 AS86 을 리눅스를 컴파일하는 데에만 사용하라.

Bruce Evans 의 컴파일러의 최신 버젼은 항상 FreeBSD 와 함께 배포된다. 2.1 버젼의 배포판에서는 소스를 찾을 수 없었다 :( 저자의 홈페이지에 소스를 두겠다. http://www.tunes.org/~fare/files/asm/bcc-95.3.12.src.tgz

어쨌든 Linux/8086 (aka ELKS) 프로젝트는 bcc 를 유지/보수 하고 있기는 하다. (저자는 32 비트 패치가 포함되었다고는 생각하지 않는다) http://www.linux.org.uk/ELKS-Home/ (혹은 http://www.elks.ecs.soton.ac.uk) 와 ftp://linux.mit.edu/pub/linux/ELKS/ 를 둘러보도록 하라. 저자가 여기 올라오는 개발 버젼들을 모두 확인해 볼 수 없었다. 이 글을 읽으시는 분이 관심이 있다면 조사해 보고 저자에게 이야기해 준다면 좋겠다.

그리고, 무엇보다 이 툴의 보다 최신의 버젼은 리눅스의 a.out 포맷의 실행파일 형식을 지원한다. 그래서, 여러분은 여러분의 코드를 리눅스 프로그램에 링크시켜서 사용하거나, GNU binutils 패키지의 툴들을 여러분의 프로그램의 자료를 유지하는데 사용할 수 있을 것이다. AS86 프로그램은 이전 버젼 혹은 다른 프로그램과 아무런 충돌 없이 여러분의 시스템에 공존할 수 있다.

1995 년 3월 12일 이전의 버젼의 BCC 는 모든 세그먼트의 푸시/팝 을 16비트로 하는 오류가 있는데, 그것은 32비트 모드로 프로그래밍 하는데 있어서 상당히 귀찮고, 골치아픈 문제이다. 저자는 TUNES 프로젝트가 AS86 을 사용할 당시 그에대한 패치를 했었다. http://www.tunes.org/~fare/files/asm/as86.bcc.patch.gz 브루스 에반스도 이 패치를 승인하였다. 그렇지만, 그는 bcc 의 새로운 릴리즈는 발표하지 않았다.

3.4.2. 어셈블러를 작동시키는 방법 : How to invoke the assembler?

아래에 BCC 를 사용해서 .s 파일로부터 a.out 형식의 .o 오브젝트 코드와 .l 의 리스팅 파일을 생성시키는 생성시키는 GNU makefile 의 엔트리가 있다.

    %.o %.l:	%.s
        bcc -3 -G -c -A-d -A-l -A$*.l -o $*.o $<
    

여러분이 리스팅 파일을 생성하기를 원하지 않는다면, %.l-A-l, 그리고 -A$*.l 을 삭제하면 된다. 그리고, a.out 말고 다른 파일이 출력되게 하려면, bcc 의 문서를 참조하여 다른 지원되는 형식을 찾아보거나, GNU binutils 패키지의 objcopy 유틸리티를 사용하라.

3.4.3. AS86의 문서를 찾을 수 있는 곳

문서들은 bcc 패키지 안에 포함되어 있다. FreeBSD 사이트인 http://www.tunes.org/~fare/files/asm/bcc-95.3.12.src.tgz 에서 맨페이지를 구할 수 있었다. ELKS 의 개발자들이 더 많이 알고 있을 것이다. 흠... 그리고, 좀 더 알고 싶다면, AS86 의 소스 그 자체가 좋은 문서가 될 것이다. 주석이 그리 잘 되어 있는 것은 아니지만, 프로그래밍 스타일은 매우 직선적(?)이다. 여러분은 ELKS 프로젝트나 TUNES 프로젝트 0.0.0.25 에서 AS86 이 어떻게 쓰였는지 살펴볼 수도 있을 것이다.

3.4.4. 매크로 지원

AS86 은 간단한 매크로도 지원한다. 그렇지만, 저자는 그에대한 문서는 찾지 못하였다. AS86의 소스는 매우 straightforward 하게 쓰였으므로, 여러분이 원한다면, 소스를 살펴보고, 원하는 부분을 쉽게 이해할 수 있을 것이다. 여러분이 단순한 매크로 이상의 더 많은 것을 원한다면 외부의 필터 (뒤에서 설명한다)를 이용할 수도 있다.

3.4.5. 만약 이 새로운 버젼을 이용해서 리눅스를 더이상 컴파일 할 수 없다면 어떻게 해야 하는가 : What if I can't compile Linux anymore with this new version?

Linus 는 쏟아지는 메일더미에 파묻혀 :) 있다. 그리고, HJLu (bin86 의 공식적 유지/보수자) 가 as86 의 as86 의 최신 버젼을 사용한 코드의 재 구축 보다 구버젼의 해킹을 선택했기 때문에 저자가 as86 에 리눅스를 컴파일 할 수 있도록 한 패치가 제대로 받아들여지지 않았다고 생각한다. (역자주 : 번역이 이상해서 원문을 싣습니다) Linus is buried alive in mail, and since HJLu (official bin86 maintainer) chose to write hacks around an obsolete version of as86 instead of building clean code around the latest version, I don't think my patch for compiling Linux with a modern as86 has any chance to be accepted if resubmitted.

그러나, 별 문제 없다. bin86 패키지에서 as86 을 /usr/bin/ 에 그대로 놔두고, bcc 가 최신의 as86 을 /usr/local/libexec/i386/bcc/as 로 인스톨하도록 해 주면 된다. 여러분은 명시적으로 /좋은/ 버젼의 as86 을 호출할 필요는 없다. 제대로 된 옵션과 함께 호출되면, bcc 가 모든것을 제대로 조정해 주기 때문이다. 리눅스의 a.out 포맷으로의 변환까지 포함해서 말이다. 그래서, 파일을 as86 을 바로 사용하지 말고, bcc 를 프론트엔드로 이용해서 어셈블하라. Now, this shouldn't matter: just keep your as86 from the bin86 package in /usr/bin/, and let bcc install the good as86 as /usr/local/libexec/i386/bcc/as where it should be. You never need explicitly call this "good" as86, because bcc does everything right, including conversion to Linux a.out, when invoked with the right options; so assemble files exclusively with bcc as a frontend, not directly with as86.

지금은 gas 도 16비트 코드도 지원하고, NASM 도 그렇게 할 모양이므로, 리눅스는 AS86 의 그늘에서 벗어날 수 있을 것이다. 누가 알리... Since GAS now supports 16-bit code, and NASM looks promising, maybe Linux will get rid of AS86, anyway? Who knows!