디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

Ada와 어셈블리 섞어쓰기

루비갤로그로 이동합니다. 2025.06.25 22:59:51
조회 21 추천 0 댓글 0

2025년 6월 25일 22:14:00 KST


시스템 프로그래밍, 하드웨어 제어, 또는 성능이 매우 중요한 최적화를 수행할 때, Ada와 같은 고급 언어에서 순수 어셈블리로 내려가야 할 때가 있습니다. 하지만 어떻게 하면 구조적이고 표준을 준수하는 방식으로 이 작업을 수행하고, 또 그것이 제대로 동작하는지 검증할 수 있을까요?


Ada 언어 표준은 이를 위한 두 가지 주요 방법을 제공합니다. GNAT 컴파일러를 사용하여, 컴파일 가능한 완전한 예제와 컴파일 방법과 함께 두 가지 방법을 모두 살펴보겠습니다.


방법 1: System.Machine_Code를 이용한 인라인 어셈블리


이 방법은 Ada 코드 내에 어셈블리 명령어를 직접 삽입하는 가장 직접적인 방법으로, 짧고 목표 지향적인 하드웨어 상호작용에 적합합니다. 다음 예제는 어셈블리에서 계산을 수행하고, 그 결과를 Ada로 반환한 다음, 화면에 출력할 것입니다.


예제: show_asm_result.adb


with Ada.Text_IO;

with System.Machine_Code;


procedure show_asm_result is

   input_value     : Integer := 100;

   result_from_asm : Integer;

begin

   Ada.Text_IO.put_line ("  Ada -> 어셈블리로 전송: " & Integer'image(input_value));


   System.Machine_Code.asm (

      -- 어셈블리 명령어 템플릿:

      -- %0은 첫 번째 출력(Outputs) 피연산자, %1은 첫 번째 입력(Inputs) 피연산자를 가리킵니다.

      "movl %1, %0; addl $23, %0",


      -- [Inputs]

      -- 'input_value' 변수를 어셈블리 코드에 대한 입력으로 지정합니다.

      -- "r": 'r'은 'r e g i s t e r'의 약자로, 컴파일러에게 이 변수 값을

      --      아무 범용 레지스터(general-purpose r e g i s t e r)에 넣어달라고 요청합니다.

      --      어셈블리 템플릿에서는 %1으로 이 레지스터를 참조할 수 있습니다.

      Inputs  => (Integer'asm_input  ("r", input_value)),


      -- [Outputs]

      -- 어셈블리 코드의 결과를 'result_from_asm' 변수에 저장하도록 지정합니다.

      -- "=": 이 피연산자가 출력 전용(write-only)임을 나타내는 제약 조건입니다.

      -- "r": 결과값 또한 범용 레지스터에 저장됨을 의미합니다.

      --      어셈블리 템플릿에서는 %0으로 이 레지스터를 참조할 수 있습니다.

      Outputs => (Integer'asm_output ("=r", result_from_asm))

   );


   Ada.Text_IO.put_line ("  Ada <- 어셈블리로부터 수신: " & Integer'image(result_from_asm));

   Ada.Text_IO.put_line ("------------------------------------");


   if result_from_asm = 123 then

      Ada.Text_IO.put_line ("성공: 결과가 정확합니다!");

   else

      Ada.Text_IO.put_line ("실패: 결과가 부정확합니다.");

   end if;


end show_asm_result;


인라인 어셈블리 컴파일하기


gnatmake show_asm_result.adb


방법 2: pragma import와 어셈블러 규약을 통한 연동


더 큰 어셈블리 루틴이 있는 경우, 별도의 .s 파일에 보관하는 것이 더 깔끔합니다. 이 작업은 Assembler 호출 규약을 지정한 pragma import를 사용하여 수행됩니다.


예제 파일


1. 어셈블리 파일: math_ops.s


.global my_add

.type my_add, @function


my_add:

    movl %edi, %eax

    addl %esi, %eax

    ret


# 이 섹션은 스택이 실행 가능할 필요가 없음을 선언하여,

# 흔한 링커 경고를 해결하고 보안을 향상시킵니다.

.section .note.GNU-stack,"",@progbits


2. Ada 패키지 명세: math_functions.ads


package Math_Functions is

   function my_add (x, y : Integer) return Integer;

private

   -- 'Assembler' 규약을 사용하여 어셈블리 루틴임을 명확히 합니다.

   -- (참고: 'C' 규약의 호출 방식 또한 어셈블리 루틴과 호환되는 경우가 많아

   -- 자주 사용되기도 합니다.)

   pragma import (Assembler, my_add, "my_add");

end Math_Functions;


3. Ada 메인 프로시저: main.adb


with Ada.Text_IO;

with Math_Functions;


procedure main is

   result : Integer;

begin

   result := Math_Functions.my_add(10, 5);

   Ada.Text_IO.put_line ("외부 어셈블리 결과: " & Integer'image(result));

end main;


외부 어셈블리 컴파일하기


방법 A: gprbuild 사용 (권장)


여러 언어가 섞인 프로젝트를 컴파일하는 가장 쉬운 방법은 gprbuild와 프로젝트 파일을 사용하는 것입니다.


1. GNAT 프로젝트 파일: my_project.gpr


project My_Project is

   for Source_Dirs use (".");

   for Object_Dir use "obj";

   for Main use ("main.adb");

   for Languages use ("Ada", "A s s e m b l y");

end My_Project;


2. 빌드 명령어


gprbuild -P my_project.gpr


방법 B: 수동 컴파일 (gprbuild 없이)


gprbuild가 없거나 수동 접근 방식을 선호한다면, 두 단계로 나누어 파일을 컴파일할 수 있습니다.


1. 어셈블리 파일 어셈블하기


먼저 gcc를 사용하여 .s 파일을 오브젝트 파일(.o)로 어셈블합니다.


gcc -c math_ops.s -o math_ops.o


2. Ada 코드 컴파일 및 링크하기


이제 gnatmake로 Ada 코드를 컴파일하고, -largs 스위치를 사용하여 어셈블리 오브젝트 파일을 링커에 전달합니다.


gnatmake main.adb -largs math_ops.o


결론


Ada는 어셈블리와 통합하기 위한 두 가지 견고한 방법을 제공합니다.


작은 인라인 코드 조각에는 System.Machine_Code.asm을 사용하십시오.

더 큰 외부 어셈블리 루틴에는 pragma import를 사용하십시오.

추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 정치에 절대 관여 안 했으면 싶은 스타는? 운영자 25/06/23 - -
이슈 [디시人터뷰] 짧지만 강렬하게, 인플루언서 장은비 운영자 25/06/24 - -
공지 프로그래밍 갤러리 이용 안내 [88] 운영자 20.09.28 44933 65
2867268 나쁜 짓을 하면 벌 받아야지 김건희 삼부토건 주가조작 넥도리아(175.196) 03:47 6 0
2867266 코리안워가 진짜로 시작된 곳은 여순과 제주 4.3이다 발명도둑잡기갤로그로 이동합니다. 03:37 10 0
2867265 조국해방전쟁 승리 기념일 발명도둑잡기갤로그로 이동합니다. 03:36 7 0
2867263 오늘의 영상 기획 실마리: 유명인사가 지하철, 버스 타기 발명도둑잡기갤로그로 이동합니다. 03:23 8 0
2867261 이승만 정권의 해외입양은 '혼혈아 청소'였다 발명도둑잡기갤로그로 이동합니다. 03:11 9 0
2867259 표현이 아니라 철학·관점의 문제! 송미령은 거짓 사과 그만두고 즉각 사퇴 발명도둑잡기갤로그로 이동합니다. 03:01 8 0
2867257 농민들 입장에선 송 장관이 "성과와 실력, 소신이 없는 자" 발명도둑잡기갤로그로 이동합니다. 02:35 10 0
2867255 [기고] 복지로는 농촌을 지킬 수 없다 송미령 유임으로 추론하는 이재명 발명도둑잡기갤로그로 이동합니다. 02:26 11 0
2867254 넥도리아 글 보면 복지라는 게 뭔지 가끔 다시 생각함 [1] ㅆㅇㅆ(124.216) 02:22 16 0
2867253 내일부터 그냥 핸드폰 자체를 하지말아볼까 시발 ㅇㅇ(223.38) 02:21 18 0
2867251 정신 질환이나, 구조적인 빈곤은 운이 나빠서가 아니고 ㅆㅇㅆ(124.216) 02:15 23 0
2867250 넥도리아 글 보면 나만 괜히 슬프냐. 나쁜놈은 아닌데 [1] ㅆㅇㅆ(124.216) 02:12 13 0
2867249 편의점 우유사러.. 너무 많이 먹나... 일주일에 900ml면... [1] 넥도리아(223.38) 01:58 22 0
2867248 이성 혐오자는 이성에게 인기가 없나 연구 [1] 발명도둑잡기갤로그로 이동합니다. 01:50 18 0
2867247 와 근데 지금 역류기 돌아가던데 커뮤가 대체 뭐길래 프록시 저거 [3] ㅆㅇㅆ(124.216) 01:45 23 0
2867246 유럽, 미국에서 나치 온라인 활동 검열로 논쟁 중 발명도둑잡기갤로그로 이동합니다. 01:42 11 0
2867245 "서울시 주선 미혼남녀 미팅서 26쌍 커플 탄생…" 발명도둑잡기갤로그로 이동합니다. 01:33 16 0
2867244 Installing Mac OS on the Nintendo Wii! 발명도둑잡기갤로그로 이동합니다. 01:29 12 0
2867243 요즘은 공채가 진짜 의미 없는듯 ㅇㅇ(172.225) 01:22 25 0
2867242 "푸틴 직속 첩보 요원, 호날두 유튜브 통해 암호 전달" 발명도둑잡기갤로그로 이동합니다. 01:16 17 0
2867241 내년 좇소충들 최저임금 동결 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ ㅅㅅㅅㅅㅅㅅ 뒷통수한방(1.213) 01:14 21 0
2867239 해킹에 능통하신 분 댓글 부탁드립니다 [1] 프갤러(106.101) 01:06 26 0
2867238 기업 회계공시는 주식 구입자용이지만 노조는 노조원이 탄핵가능 발명도둑잡기갤로그로 이동합니다. 00:55 16 0
2867237 민주노동당 저질 논평 발명도둑잡기갤로그로 이동합니다. 00:42 12 0
2867236 MCP 잘되농 [1] 밀우갤로그로 이동합니다. 00:39 32 0
2867235 중산층 정의가 치킨이 땡길 때 부담없이 주문할 수 있는 사람 발명도둑잡기갤로그로 이동합니다. 00:38 17 0
2867234 레눅스 텍스트 셸에 인공지능 빨리 도입되야 발명도둑잡기갤로그로 이동합니다. 00:35 10 0
2867233 델파이 파스칼도 메모리안전 언어구나 [3] 발명도둑잡기갤로그로 이동합니다. 00:31 26 0
2867232 가난이 밉다... 남 치킨먹는거 보면서 난 국에 밥이나 말아먹는 인생이 [1] ㅇㅇ(223.38) 00:30 23 0
2867231 일본의 유아같은 면을 뜻하는 문화 용어 발명도둑잡기갤로그로 이동합니다. 00:20 20 0
2867229 난리 난 청담 분양 아파트 발명도둑잡기갤로그로 이동합니다. 00:15 20 0
2867228 러까책 집필 중 현재 15페이지입니다. 루비갤로그로 이동합니다. 00:14 17 0
2867227 모사드 십새끼 넥도리아(175.196) 00:10 19 0
2867226 scpc 대회 난이도 어느정도에여? 프갤러(58.127) 00:05 14 0
2867225 구시대 언론의 상징, 기자실·기자단 없앨 때 됐다 [2] 발명도둑잡기갤로그로 이동합니다. 06.25 16 0
2867224 제미나이 2.5 CLI, 코딩 어시스턴트 공개 [6] ㅇㅇ(118.40) 06.25 45 2
2867223 일본은 약간 [2] 아스카영원히사랑해갤로그로 이동합니다. 06.25 31 0
2867222 백엔드 개발자분들 프갤러(112.160) 06.25 27 0
2867221 면접관을 하게 됐다 프갤러(125.132) 06.25 18 0
2867220 짤남 정도면 잘생긴 편임? 메쿠이로갤로그로 이동합니다. 06.25 25 0
2867219 캠핑 발명도둑잡기갤로그로 이동합니다. 06.25 13 0
2867218 초소형 콘솔 게임기 Thumby 발명도둑잡기갤로그로 이동합니다. 06.25 20 0
2867217 리액트에 제이쿼리 플젝 올릴 방법 없나? 프갤러(180.233) 06.25 15 0
2867216 과거 기억, 레트로, 클래식이 행복한 뇌과학 원리 발명도둑잡기갤로그로 이동합니다. 06.25 12 0
2867213 김가영, 차유람 꺾고 LPBA 8연속 우승 [1] 발명도둑잡기갤로그로 이동합니다. 06.25 18 0
Ada와 어셈블리 섞어쓰기 루비갤로그로 이동합니다. 06.25 21 0
2867211 구글 ceo 빌게이츠 저커버그 좇센에서 태어났으면 진작에 밟혀죽었음 뒷통수한방(1.213) 06.25 20 1
2867208 차은우 이새끼 정체가 뭐냐?? 뒷통수한방(1.213) 06.25 41 0
2867207 MS 도스 에디터 클론 발명도둑잡기갤로그로 이동합니다. 06.25 14 0
뉴스 정승제, ‘이것’해서 미국장 공략…“내 수익률 들으면 깜짝 놀란다” 디시트렌드 06.24
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2