디시인사이드 갤러리

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

갤러리 본문 영역

Ada와 어셈블리 섞어쓰기

루비갤로그로 이동합니다. 2025.06.25 22:59:51
조회 47 추천 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 - -
2867241 내년 좇소충들 최저임금 동결 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ ㅅㅅㅅㅅㅅㅅ 뒷통수한방(1.213) 06.26 38 0
2867239 해킹에 능통하신 분 댓글 부탁드립니다 [1] 프갤러(106.101) 06.26 51 0
2867238 기업 회계공시는 주식 구입자용이지만 노조는 노조원이 탄핵가능 발명도둑잡기갤로그로 이동합니다. 06.26 26 0
2867237 민주노동당 저질 논평 발명도둑잡기갤로그로 이동합니다. 06.26 28 0
2867236 MCP 잘되농 [1] 밀우갤로그로 이동합니다. 06.26 51 0
2867235 중산층 정의가 치킨이 땡길 때 부담없이 주문할 수 있는 사람 발명도둑잡기갤로그로 이동합니다. 06.26 28 0
2867234 리눅스 텍스트 셸에 인공지능 빨리 도입되야 발명도둑잡기갤로그로 이동합니다. 06.26 24 0
2867233 델파이 파스칼도 메모리안전 언어구나 [1] 발명도둑잡기갤로그로 이동합니다. 06.26 42 0
2867232 가난이 밉다... 남 치킨먹는거 보면서 난 국에 밥이나 말아먹는 인생이 ㅇㅇ(223.38) 06.26 33 0
2867231 일본의 유아같은 면을 뜻하는 문화 용어 발명도둑잡기갤로그로 이동합니다. 06.26 39 0
2867229 난리 난 청담 분양 아파트 발명도둑잡기갤로그로 이동합니다. 06.26 27 0
2867228 러까책 집필 중 현재 15페이지입니다. 루비갤로그로 이동합니다. 06.26 26 0
2867227 모사드 십새끼 넥도리아(175.196) 06.26 25 0
2867226 scpc 대회 난이도 어느정도에여? 프갤러(58.127) 06.26 24 0
2867225 구시대 언론의 상징, 기자실·기자단 없앨 때 됐다 [2] 발명도둑잡기갤로그로 이동합니다. 06.25 31 0
2867224 제미나이 2.5 CLI, 코딩 어시스턴트 공개 [6] ㅇㅇ(118.40) 06.25 63 2
2867223 일본은 약간 아스카영원히사랑해갤로그로 이동합니다. 06.25 40 0
2867222 백엔드 개발자분들 프갤러(112.160) 06.25 45 0
2867221 면접관을 하게 됐다 프갤러(125.132) 06.25 30 0
2867220 짤남 정도면 잘생긴 편임? 메쿠이로갤로그로 이동합니다. 06.25 42 0
2867219 캠핑 발명도둑잡기갤로그로 이동합니다. 06.25 20 0
2867218 초소형 콘솔 게임기 Thumby 발명도둑잡기갤로그로 이동합니다. 06.25 27 0
2867217 리액트에 제이쿼리 플젝 올릴 방법 없나? 프갤러(180.233) 06.25 20 0
2867216 과거 기억, 레트로, 클래식이 행복한 뇌과학 원리 발명도둑잡기갤로그로 이동합니다. 06.25 17 0
2867213 김가영, 차유람 꺾고 LPBA 8연속 우승 [1] 발명도둑잡기갤로그로 이동합니다. 06.25 37 0
Ada와 어셈블리 섞어쓰기 루비갤로그로 이동합니다. 06.25 47 0
2867211 구글 ceo 빌게이츠 저커버그 좇센에서 태어났으면 진작에 밟혀죽었음 뒷통수한방(1.213) 06.25 27 1
2867208 차은우 이새끼 정체가 뭐냐?? 뒷통수한방(1.213) 06.25 47 0
2867207 MS 도스 에디터 클론 발명도둑잡기갤로그로 이동합니다. 06.25 20 0
2867204 뉴비 처음으로 실버 문제 풀었다 [1] 프갤러(58.234) 06.25 40 0
2867203 슬롯에 끼우는 메인보드, 호스트 보드 발명도둑잡기갤로그로 이동합니다. 06.25 22 0
2867201 내년 좇소충들 최저임금 동결 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ ㅅㅅㅅㅅㅅㅅ 뒷통수한방(1.213) 06.25 37 0
2867200 역사상 한민족 제일 많이 학살한 국가 미국 발명도둑잡기갤로그로 이동합니다. 06.25 30 0
2867199 안녕하세요 형님들 처음왔는데 여기 갤러리 혹시 코딩도 봐주시나요?? 프갤러(61.42) 06.25 32 0
2867197 대학/언론보다 기술기업이 미래를 이끈다 [1] ㅇㅇ(183.101) 06.25 30 0
2867196 비 올 때 춤 추는 게 좋은 이유 발명도둑잡기갤로그로 이동합니다. 06.25 37 0
2867194 오늘 연봉 협상함 ㅋㅋ [1] ㅇㅇ(123.111) 06.25 70 0
2867192 내년까지 30km 달려야 ♥냥덩이♥갤로그로 이동합니다. 06.25 30 0
2867190 내년 좇소충들 최저임금 동결 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ ㅅㅅㅅㅅㅅㅅ 타이밍뒷통수한방(1.213) 06.25 32 0
2867188 컴공 4학년 인턴가면 뭐 하냐...? [1] ㅇㅇ(58.235) 06.25 47 0
2867187 i5 cpu를 외부에서 연결해 쓰는 방법은 없나? [1] 프갤러(203.250) 06.25 26 0
2867186 매일 1시간이상 걷거나 뛰는거 시간낭비임?? [1] ㅇㅇ(223.38) 06.25 22 0
2867184 내가 AI로 글쓰는 험난한 과정 보고가. [3] 루비갤로그로 이동합니다. 06.25 87 0
2867182 재매이햄이 25만원 준다는게 매월임? ㅇㅇ(211.210) 06.25 43 0
2867180 fromis_9 (프로미스나인) 'LIKE YOU BETTER' 발명도둑잡기갤로그로 이동합니다. 06.25 23 0
2867178 좇센은 무언가 열심히할려고하면 위에 기득권 노인새끼들이 찍어밟아버림 ㅋㅋ 뒷통수한방(1.213) 06.25 25 0
2867177 오늘의 영상 기획 실마리: 지원금 25만원으로 여행기 발명도둑잡기갤로그로 이동합니다. 06.25 23 0
2867175 오늘의 발명 실마리: 자동으로 날짜 맞춰지는 스탬프 발명도둑잡기갤로그로 이동합니다. 06.25 24 0
2867173 일베특 ) 노인들이 싫어함 ㅇㅇ 타이밍뒷통수한방(1.213) 06.25 24 0
2867171 일본 도장 발명도둑잡기갤로그로 이동합니다. 06.25 19 0
뉴스 '1호가 될 순 없어2' 권재관, “개그맨 부부가 이혼 안 하는 이유는 집에 개 탈이 하나씩 있기 때문” 폭소 디시트렌드 06.26
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2