• SEARCH

    통합검색
  • GAMEZONE
    • 커뮤니티
      • 공지사항
      • 유저게시판
        • 등업게시판
        • 출석체크
        • 정회원 무료자료실
      • 스크린샷
      • 인증자료실
    • 리니지
      • 게임공략 & 팁
      • 홍보게시판
      • 유틸자료실
      • 소스자료실
      • 자유게시판
      • 노하우 게시판
    • 메이플스토리
      • 게임공략 & 팁
      • 홍보게시판
      • 유틸자료실
      • 소스자료실
      • 자유게시판
      • 노하우 게시판
    • 바람의나라
      • 자유게시판
      • 홍보게시판
      • 자료게시판
        • 유틸자료실
        • 소스자료실
        • 클라이언트
        • 팩 자료실
      • 연구게시판
        • 개발내역
        • 질문과답변
        • 기타
      • 강의게시판
        • DR
        • CR
        • 구버전
        • 클라이언트 개조
        • 노하우 게시판
        • 게임공략 & 팁
    • 다크에덴
      • 게임공략 & 팁
      • 홍보게시판
      • 유틸자료실
      • 소스자료실
      • 자유게시판
      • 노하우 게시판
    • 믹스마스터
      • 게임공략 & 팁
      • 홍보게시판
      • 유틸자료실
      • 소스자료실
      • 자유게시판
      • 노하우 게시판
    • 라그나로크
      • 게임공략 & 팁
      • 홍보게시판
      • 유틸자료실
      • 소스자료실
      • 자유게시판
      • 노하우 게시판
    • 기타게임
      • 게임공략 & 팁
      • 홍보게시판
      • 유틸자료실
      • 소스자료실
      • 자유게시판
      • 노하우 게시판
    • 게임강의
    • 비베&포토샵
      • 자유게시판
      • 자료실
        • 일반자료실
        • 포인트 자료실
      • 노하우게시판
      • 포토샵게시판
    • 모바일
      • 게임공략
      • 포인트 자료실
      • 유틸자료실
      • 자유게시판
  • 기타게임 소스자료실
    • 기타게임 소스자료실 기타 ()
    • [Go 공식문서 한국어 정리] ⑯26. Go 어셍리이터 빠른 가이드

      • 오뉴노노
      • 2026.05.30 - 01:52 6

    https://go.dev/doc/asm

     

    [Go 공식문서 한국어 정리] ⑯26. Go 어셍리이터 빠른 가이드

     

    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

     

    1. 서론

    이 문서는 Go 컴파일러(gc) 의 어셍리어의 특이한 형태에 대한 간략한 소개입니다. Go의 어셍리어는 Plan 9 어셍리어 입력 스타일을 기반으로 하며, 기계어를 직접 표현하는 것이 아닌 반전상적인 명령어 집합(semi-abstract instruction set)을 사용한다는 특징이 있습니다.

     

    2. 핵심 개념

    • Go 어셍리어는 기계어를 직접 표현하지 않는다. MOV 명령어가 실제로 이동 명령이 아닌 clear 나 load 로 범위할 수 도 있습니다.
    • 기계별 수행 명령은 그대로 나타나지만, 메모리 이동이나 함수 호출 같은 일반적인 개념은 방식에 당해 더 운색하게 된다.
    • 어셍리런이 만들어 내는 실제 어셍리에 대한 정보는 컴파일러의 -S 플래그나 go tool objdump 로 확인할 수 있습니다.

     

    3. 주요 내용 상세

     

    3.1 상수와 기호

    • 상수 표현식은 Go의 연산자 우선순위를 사용합니다. 3&1<<2는 4입니다(Plan 9의 C스타읽 스타일과 다릅니다).
    • 상수는 항상 64비트 어상정수로 평가됩니다.
    • 사전 정의 기호는 R1, LR 등 레지스터를 가리키며, 아키텍처에 따라 종류가 다릅니다.

     

    3.2 가상 레지스터(Pseudo-Registers)

    • FP(Frame Pointer): 인자와 지역변수를 참조. 0(FP)는 첫 번째 인자. 이름을 필수로 붙여야 합니다(예: arg+0(FP)).
    • PC(Program Counter): 점프와 분기를 참조.
    • SB(Static Base): 전역 기호의 기저 주소. foo(SB)는 전역 기호 foo의 메모리 주소를 가리킨다.
    • SP(Stack Pointer): 스택 프레임 내에서 가장 높은 주소를 가리킵니다. 지역변수는 음수 오프셋(예: x-8(SP))를 사용합니다.
    • 레지스터 이름이 있는 SP와 없는 SP는 다른 위치를 가리킵니다. x-8(SP)는 가상 스택, -8(SP)는 하드웨어 스택입니다.

     

    3.3 지시어(Directives)

    • TEXT: 함수 정의에 사용. TEXT runtime·profileloop(SB),NOSPLIT,$8 형태로 사용합니다. 마지막 명령은 RET이어야 합니다.
    • DATA: 기호의 메모리 일부를 초기화. DATA divtab<>+0x00(SB)/4, $0xf4f8fcff
    • GLOBL: 기호를 전역적으로 노출합니다. 후속 플래그(RODATA, NOPTR 등)과 크기를 지정합니다.
    • FUNCDATA/PCDATA: 쓰레기 컬렉터에 필요한 메타데이터를 기록합니다.

     

    3.4 플래그

    • NOSPLIT(4): 스택 분할 전염을 삽입하지 않습니다.
    • RODATA(8): 읽기 전용 센션에 배치합니다.
    • NOPTR(16): 포인터가 없으므로 쓰레기 컬렉터의 스캔 대상이 아닙니다.
    • DUPOK(2): 중복 기호가 허용됩니다.
    • WRAPPER(32): 랩퍼 함수로, recover 비활성화를 반영하지 않습니다.

     

    3.5 아키텍처별 특수사항

    • x86/amd64: BP는 콜리-세이브 레지스터. 플레임 크기가 0보다 크면 자동으로 저장/복원한다.
    • ARM: R10은 g(코루틴)을, R11은 컴파일러/링커가 예약한다. SP대신 하드웨어 R13을 사용.
    • ARM64: R18_PLATFORM은 애플 플랫폼 예약. R27, R28은 컴파일러/링커 예약.
    • s390x: R13은 g를, R15는 스택 프레임을 가리킨다.
    • MIPS/MIPS64: R30은 g를 가리킨다. 하드웨어 SP는 R29.

     

    3.6 런타임과 상호작용

    • 어셍블리 소스에서는 포인터를 포함한 기호를 정의할 수 없습니다. 필요한 경우 Go 소스에서 정의하고 어셍블리에서 이름을 참조하십시오.
    • 어셍블리 함수에는 레지스터 지역 포인터 위치를 설명해야 합니다.
    • 포인터가 없는 데이터는 NOPTR 플래그로 표시합니다.
    • 모든 어셍블리 함수는 Go 프로토타입을 가져야 하며, go vet이 인자 오프셋을 검증할 수 있습니다.
    • 스택 이동이 발생할 수 있다는 점을 염두어야 한다: 스택 데이터의 포인터를 지역변수에 유지하면 안됩니다.

     

    3.7 go_asm.h

    • 패키지에 .s 파일이 있으면 컴파일러가 go_asm.h를 생성한다.
    • 이 파일에는 해당 패키지의 Go 상수(const), 스트럭트 필드 오프셍, 스트럭트 크기에 대한 #define 등이 포함됩니다.
    • 예: const_bufSize, reader__size, reader_buf, reader_r. 어셍블리에서 이러한 상수를 사용하는 것이 약한 타입 의존성을 높이는 데 효적입니다.

     

    4. 실전 활용

    • 표준 라이브러리(runtime, math/big) 소스에서 어셍블리 코드를 참고하면 다양한 아키텍처의 사용예를 확인할 수 있습니다.
    • go tool compile -S x.go 나 go build -gcflags -S x.go를 사용하면 컴파일러가 발생하는 어셍블리를 볼 수 있습니다.
    • 목없는 어셍리를 사용해야 할 때는 BYTE, WORD 지시어로 명시적인 인스트럼션 바이트를 직접 기입할 수 있습니다.

     

    5. 정리

    • Go 어셍리어는 Plan 9 기반의 반전상적 명령어 집합을 사용합니다.
    • FP, PC, SB, SP 네 가지 가상 레지스터를 이해하는 것이 어셍블리 코딩의 핵심입니다.
    • TEXT, DATA, GLOBL 지시어와 다양한 플래그를 활용해 함수와 전역 데이터를 정의할 수 있습니다.
    • 가비지 컬렉터와 정확한 상호작용을 위해 go_asm.h와 프로토타입, 그리고 go vet을 활용하십시오.
    • 아키텍처별 세부사항은 아키텍처의 cmd/internal/obj 소스에서 확인할 수 있습니다.

     

    #Go #Golang #Assembler #어셍리 #Plan9 #공식문서

    이 게시물을..
    N
    0
    0
    • [Rust 공식문서 한국어 정리] 150. Attribute Macros오뉴노노
    • 2
      오뉴노노

    오뉴노노 님의 최근 글

    [Rust 공식문서 한국어 정리] 184. PartialOrd 16 2026 06.08 [Rust 공식문서 한국어 정리] 183. Ord 13 2026 06.08 [Rust 공식문서 한국어 정리] 182. Eq 15 2026 06.08 [Rust 공식문서 한국어 정리] 181. PartialEq 15 2026 06.08 [Rust 공식문서 한국어 정리] 180. TryFrom 13 2026 06.08

    오뉴노노 님의 최근 댓글

    ㅋㅋㅋㅋㅋ 2019 01.14 잘 읽었습니다 2018 12.30 포인트가 없어서 아직 시작을 못하고있는데요! 글은 잘 읽었습니다! 포인트 쌓고 도전할거에요 2018 12.30
    글쓴이의 서명작성글 감추기 
    댓글 쓰기 에디터 사용하기 닫기
    • view_headline 목록
    • 14px
    • [Rust 공식문서 한국어 정리] 150. Attribute Macros
    • 목록
      view_headline
    × CLOSE
    전체 던파 5 뮤 18 천상비 프로젝트신루 5 아이온 18 어둠의전설 28 리니지2 7 크로노스 5 칼온라인 3 기타 490
    기본 (582) 제목 날짜 수정 조회 댓글 추천 비추
    분류 정렬 검색
    • 포인트 획득 공지
      5
      2026.04.24 - 19:48 4946 5
    • 링크 업로드 관련 공지
      8
      2026.03.25 - 21:56 4711 8
    • 인증메일 공지
      3
      2026.03.15 - 16:42 4605 3
    • 파일링크 및 인증메일 발송 관련 문의 안내
      9
      2026.03.14 - 22:03 5248 9
    • 포인트 게시판 안내
      2026.02.28 - 19:14 5993
    • 게임존 사이트 변경 사항 안내
      9
      2026.02.26 - 01:07 7853 9
    • 소스자료는 직접 올려주세요
      2017.06.06 - 16:16 853
    582
    기타
    [Rust 공식문서 한국어 정리] 184. PartialOrd
    오뉴노노 2026.06.08 - 15:42 16
    581
    기타
    [Rust 공식문서 한국어 정리] 183. Ord
    오뉴노노 2026.06.08 - 15:42 13
    580
    기타
    [Rust 공식문서 한국어 정리] 182. Eq
    오뉴노노 2026.06.08 - 15:42 15
    579
    기타
    [Rust 공식문서 한국어 정리] 181. PartialEq
    오뉴노노 2026.06.08 - 15:42 15
    578
    기타
    [Rust 공식문서 한국어 정리] 180. TryFrom
    오뉴노노 2026.06.08 - 15:42 13
    577
    기타
    [Rust 공식문서 한국어 정리] 179. TryInto
    오뉴노노 2026.06.08 - 15:42 11
    576
    기타
    [Rust 공식문서 한국어 정리] 178. From
    오뉴노노 2026.06.08 - 15:39 14
    575
    기타
    [Rust 공식문서 한국어 정리] 177. Into
    오뉴노노 2026.06.08 - 15:39 9
    574
    기타
    [Rust 공식문서 한국어 정리] 176. AsRef
    오뉴노노 2026.06.08 - 15:39 5
    573
    기타
    [Rust 공식문서 한국어 정리] 175. Deref
    오뉴노노 2026.06.08 - 15:39 4
    572
    기타
    [Rust 공식문서 한국어 정리] 174. Default
    오뉴노노 2026.06.08 - 15:39
    571
    기타
    [Rust 공식문서 한국어 정리] 173. Clone
    오뉴노노 2026.06.08 - 15:38
    570
    기타
    [Rust 공식문서 한국어 정리] 172. Copy
    오뉴노노 2026.06.08 - 15:38
    569
    기타
    [Rust 공식문서 한국어 정리] 171. Drop
    오뉴노노 2026.06.08 - 15:38
    568
    기타
    [Rust 공식문서 한국어 정리] 170. Weak
    오뉴노노 2026.06.08 - 15:37
    567
    기타
    [Rust 공식문서 한국어 정리] 169. Arc
    오뉴노노 2026.06.08 - 15:37
    566
    기타
    [Rust 공식문서 한국어 정리] 168. Rc
    오뉴노노 2026.06.08 - 15:37
    565
    기타
    [Rust 공식문서 한국어 정리] 167. Box
    오뉴노노 2026.06.08 - 15:36
    564
    기타
    [Rust 공식문서 한국어 정리] 166. str
    오뉴노노 2026.06.08 - 15:36
    563
    기타
    [Rust 공식문서 한국어 정리] 165. String
    오뉴노노 2026.06.08 - 15:36
    562
    기타
    [Rust 공식문서 한국어 정리] 164. HashMap
    오뉴노노 2026.06.08 - 15:36 1
    561
    기타
    [Rust 공식문서 한국어 정리] 163. Vec
    오뉴노노 2026.06.08 - 15:35
    560
    기타
    [Rust 공식문서 한국어 정리] 162. Result
    오뉴노노 2026.06.08 - 15:35
    559
    기타
    [Rust 공식문서 한국어 정리] 161. Option
    오뉴노노 2026.06.08 - 15:35
    558
    기타
    [Rust 공식문서 한국어 정리] 160. Iterators
    오뉴노노 2026.06.08 - 15:35
    557
    기타
    [Rust 공식문서 한국어 정리] 159. Closures
    오뉴노노 2026.06.08 - 15:35
    556
    기타
    [Rust 공식문서 한국어 정리] 158. Trait Objects
    오뉴노노 2026.06.08 - 15:34
    555
    기타
    [Rust 공식문서 한국어 정리] 157. Lifetimes
    오뉴노노 2026.06.08 - 15:34 1
    554
    기타
    [Rust 공식문서 한국어 정리] 156. Cargo.lock
    오뉴노노 2026.06.08 - 15:34
    553
    기타
    [Rust 공식문서 한국어 정리] 155. Cargo.toml
    오뉴노노 2026.06.08 - 15:34 1
    552
    기타
    [Rust 공식문서 한국어 정리] 154. Workspaces
    오뉴노노 2026.06.08 - 15:34
    551
    기타
    [Rust 공식문서 한국어 정리] 153. Crates
    오뉴노노 2026.06.08 - 15:33
    550
    기타
    [Rust 공식문서 한국어 정리] 152. Modules
    오뉴노노 2026.06.08 - 15:33
    549
    기타
    [Rust 공식문서 한국어 정리] 151. Proc Macros
    오뉴노노 2026.06.08 - 15:32 1
    548
    기타
    [Rust 공식문서 한국어 정리] 150. Attribute Macros
    오뉴노노 2026.06.08 - 15:32
    547
    기타
    [Rust 공식문서 한국어 정리] 149. cfg
    오뉴노노 2026.06.08 - 15:32
    546
    기타
    [Rust 공식문서 한국어 정리] 148. assert
    오뉴노노 2026.06.08 - 15:31
    545
    기타
    [Rust 공식문서 한국어 정리] 147. panic
    오뉴노노 2026.06.08 - 15:27
    544
    기타
    [Rust 공식문서 한국어 정리] 146. Error
    오뉴노노 2026.06.08 - 15:24
    543
    기타
    [Rust 공식문서 한국어 정리] 145. Any
    오뉴노노 2026.06.08 - 15:22
    542
    기타
    [Rust 공식문서 한국어 정리] 144. Unpin
    오뉴노노 2026.06.08 - 15:19
    541
    기타
    [Rust 공식문서 한국어 정리] 143. Pin
    오뉴노노 2026.06.08 - 15:17 2
    540
    기타
    [Rust 공식문서 한국어 정리] 142. LazyLock
    오뉴노노 2026.06.08 - 15:14 1
    539
    기타
    [Rust 공식문서 한국어 정리] 141. OnceCell
    오뉴노노 2026.06.08 - 15:11
    538
    기타
    [Rust 공식문서 한국어 정리] 140. Atomic
    오뉴노노 2026.06.08 - 15:06
    537
    기타
    [Rust 공식문서 한국어 정리] 139. RwLock
    오뉴노노 2026.06.08 - 14:34 3
    536
    기타
    [Rust 공식문서 한국어 정리] 152. Modules
    오뉴노노 2026.06.08 - 14:00
    535
    기타
    [Rust 공식문서 한국어 정리] 151. Proc Macros
    오뉴노노 2026.06.08 - 14:00
    534
    기타
    [Rust 공식문서 한국어 정리] 150. Attribute Macros
    오뉴노노 2026.06.08 - 14:00 3
    533
    기타
    [Rust 공식문서 한국어 정리] 149. cfg
    오뉴노노 2026.06.08 - 14:00 3
    • 1 2 3 4 5 6 7 8 9 10 .. 12
    • / 12 GO
  • GAMEZONE
 GAMEZONE all rights reserved.
by OrangeDay