디시인사이드 갤러리

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

갤러리 본문 영역

Ada와 어셈블리 섞어쓰기

루비갤로그로 이동합니다. 2025.06.25 22:59:51
조회 39 추천 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 44943 65
2867354 Sm은 개발 안함? ㅇㅇ(211.235) 14:41 6 0
2867353 무전공 노베이스 어떤 분야 추천함 [1] ㅇㅇ갤로그로 이동합니다. 14:41 8 0
2867352 세상사 쉽지 않다 나 또한 세상과 마주하는 장소가 드물기때문에 ㅆㅇㅆ(124.216) 14:35 21 0
2867351 내가 했던건 3년전 경험을 바탕으로 내린 결론이었는데 ㅆㅇㅆ(124.216) 14:28 13 0
2867350 아니 근데 방금은 내가 잘못알고 있었노 유닉스 OS도 많이 변했구나 [3] ㅆㅇㅆ(124.216) 14:26 29 0
2867347 마이클잭슨 이새끼 완전 양남충이네 [3] 개멍청한유라갤로그로 이동합니다. 14:15 18 0
2867345 지잡대는 코딩 못하게 법으로 금지해야한다 [4] ㅇㅇ(118.235) 14:05 35 0
2867344 솔직히 현실적으로 아직도 OSI 7계층 이야기하는 애들보면 ㅆㅇㅆ(124.216) 14:05 21 0
2867343 형들 부산 개발자 IT 시장 망했어? 프갤러(121.145) 14:05 17 0
2867342 근데 어차피 현업자들도 게임만들기 좇으로 알더라 [1] ㅇㅇ(211.210) 14:03 23 1
2867340 주로 자주 나오는 인서울 캡스톤 졸업과제가 거기서 거기라 ㅆㅇㅆ(124.216) 13:52 19 0
2867339 전공 지식이 필요한 부분들은 프레임워크, db같은게 어느정도 해주니까 [1] 프갤러(218.154) 13:52 19 0
2867338 내가 인서울 4년제부터, 지거국까지 베릴로그 해봤는데 ㅆㅇㅆ(124.216) 13:45 27 0
2867337 이 업계는 전공이 중요하나 싶다 [3] 루도그담당(211.184) 13:45 49 0
2867336 실제로 컴공,전자공 베릴로그 대행해보면 전자공쪽이 훨 쉬움 [2] ㅆㅇㅆ(124.216) 13:38 28 0
2867335 리버싱 책 보는데 어렵진 않네 [3] 루도그담당(211.184) 13:37 28 0
2867334 전산직이 컴공을 우대할 수밖에 없는게 유지보수는 컴공쪽임 [2] ㅆㅇㅆ(124.216) 13:37 36 0
2867333 전산직이 컴공 우대해준다 하는데 [1] 프갤러(221.155) 13:34 26 0
2867331 모든걸 동시에 가질수는 없당 ♥냥덩이♥갤로그로 이동합니다. 13:06 15 0
2867329 자바 신입 경쟁율. 프갤러(59.16) 12:51 32 0
2867328 문다혜 이경규 이런새끼도 운전대잡는시대인데 뒷통수한방(1.213) 12:37 20 0
2867326 창업하고 싶다. 창업..... [3] ㅆㅇㅆ(124.216) 12:28 51 0
2867325 센치하다 [7] 개멍청한유라갤로그로 이동합니다. 12:26 38 0
2867324 좆센 타령하는 놈들 특징 [3] 프갤러(223.38) 12:23 28 1
2867323 러스트충 ) 좇센은 아무리봐도 러스트하면안되는데 강요를함 뒷통수한방(1.213) 12:21 15 0
2867322 한국은 뭐 계속 혁신 변화해간다는데 그냥 핑계임 ㅋㅋㅋ 뒷통수한방(1.213) 12:20 16 0
2867320 러스트가 답이 아니라는 사람 대부분은 러스트를 쓸 지적 능력이 부족 프갤러(218.154) 12:19 23 0
2867319 하 너무 피곤하고 지쳐 그냥 ㅆㅇㅆ(124.216) 12:18 16 0
2867318 짤남 정도면 잘생긴 편임? [1] 몌쿠이로갤로그로 이동합니다. 12:18 29 0
2867317 ■이 스펙으로 IT업계 어떤 직무에 취업 가능할가요? [4] ㅇㅇ갤로그로 이동합니다. 12:11 57 0
2867316 C와 C++의 주요 차이점: 사실 기반 안내서 루비갤로그로 이동합니다. 12:06 32 0
2867315 URL 주소: 우월한 러스트와 나르시시즘 (초안) 루비갤로그로 이동합니다. 11:56 21 0
2867314 ‘러스트만이 답이다’ 식의 배타적 사고방식과 ‘모든 시스템 프로그래밍.. 루비갤로그로 이동합니다. 11:52 22 0
2867313 구글 클라우딩 컴퓨팅 잘 아는사람? 프갤러(106.251) 11:48 17 0
2867312 통신사 운영(SM) 정규직도 커리어 자살임?? [6] 프갤러(220.78) 11:29 50 0
2867311 자유도란 나중에 알아보지도 못하는 스파게티 주화입마 코드를 작성할 자유 프갤러(218.154) 11:28 19 0
2867310 러스트 언어 자체는 쉬움 [3] ㅇㅇ(1.240) 11:19 26 0
2867309 리버싱 책 보는데 존잼이네 [3] 루도그담당(211.184) 11:17 43 0
2867308 러스트가 아니라 러스트 못쓰는 프로그래머가 쓰레기인것 [2] 프갤러(218.154) 11:17 29 0
2867307 시발 나보다 운전 좇같이하는새끼들 많은데 왜 나만안되냐고 [1] 뒷통수한방(1.213) 11:07 25 0
2867305 알고리즘 강화학습중 [9] 헬마스터갤로그로 이동합니다. 10:57 61 0
2867304 c와 c++의 차이점 - asm 키워드 ㅇㅇ(118.235) 10:45 40 1
2867303 c와 c++의 차이점 - static [1] ㅇㅇ(118.235) 10:35 58 1
2867302 c든 c++든 병신언어 그만 써라 [1] 밀우갤로그로 이동합니다. 10:32 53 0
2867300 일본 10년차 외노자 6월 월급 [8] 프로외노자갤로그로 이동합니다. 10:30 66 0
2867299 좇센에선 러스트 하면안됌 뒷통수한방(1.213) 10:26 22 0
2867298 c와 c++의 차이점 세번째 [1] ㅇㅇ(118.235) 10:24 56 1
2867297 118.235) 님아, C++에 대해 잘못 알고 있어요. [4] 루비갤로그로 이동합니다. 10:22 59 0
2867296 러스트 쓰레기임? [1] (125.133) 10:22 23 0
뉴스 아이들 소연, ‘더 시즌즈’ 화제의 무대 QWER ‘내 이름 맑음’ 27일 음원 정식 발매 디시트렌드 10:00
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2