컴퓨터 언어도 언어입니다. 어셈블리는 고전 언어에 해당됩니다. 최근에 나온 언어는 아니죠. 그래서, 당연히 학습이 되었을 겁니다. ChatGPT는 2021년 9월까지 학습되었으니까요. 그래서, 어셈블리로 간단한 프로그램을 짜는 것을 요청해 보고, 실제로 해당 프로램을 돌려보려고 합니다.
사실 이 작업은 아들에게 ChatGPT가 이제는 프로그램도 짠다는 것을 보여주려는데, 갑자기, ‘그럼 어셈블리로 짜보세요.’ 라는 말에, 그것 재밌겠다 싶어서 시작하게 된 내용입니다. 다만, 어셈블리는 극강의 독해력을 요구하기 때문에 간단한 로직으로 시작했습니다. 적어도 제가 검토할 수 있어야 이게 제대로 된 것인지 알 수 있겠죠. 문제가 생기면 디버깅도 할 수 있을 것이고요.
어셈블리란?
혹시, 어셈블리 언어에 대해서 들어본 적이 없다면, C언어 보다 더 낮은 레벨에서 동작하는 언어라고 생각하시면 됩니다. CPU가 동작하는 방식을 사람이 이해할 수 있는 수준의 언어로 만든 것중, 가장 기계어에 가까운 언어입니다. 이보다 낮은 레벨은 인간이 이해할 수 없는 상황이 됩니다. 0과1로 기록되어 있다면 인간은 이해할 수 없겠죠!?
사용한 프롬프트
아래와 같이 가볍게 시작해 봤습니다.
“계산기 프로그램 어셈블리로 작성해줘. 총 3개의 인수를 받음. 첫번째는 숫자, 두번째는 사칙연산 기호, 세번째는 숫자, 3개의 인수를 받아서, 단순 사칙연산을 수행하여, 값을 보여주는 프로그램.”
그랬더니, 사칙연산은 어려우니, 일단 더하기 프로그램 부터 보여주겠다고 했습니다.
그래서, 추가로 아래와 같이 명령을 내렸습니다.
“위의 코드에서, 더하기만 하지 말고, 다른 연산도 수행할 수 있도록 개선해줘.”
어셈블리는 CPU마다 코드가 다르기 때문에, 애플 칩에서 수행가능하도록 추가 요청을 했습니다.
“맥 실리콘칩에서 구현 가능하도록 변경해줘.”
그랬더니, 또 사칙연산이 아니라, 더하기만 하는 코드를 작성하네요. 그냥 진행해 보겠습니다.
프로그래밍 결과 – 소스코드
아래와 같은 결과 파일이 나왔습니다.
.global _main .section __TEXT,__text _main: sub sp, sp, #16 mov x0, 0 ldr x1, =prompt bl _printf mov x0, 0 ldr x1, =format add x2, sp, 0 add x3, sp, 8 bl _scanf ldr w0, [sp, 0] ldr w1, [sp, 8] add w0, w0, w1 mov x0, 0 ldr x1, =result_format bl _printf add sp, sp, #16 mov w0, 0 ret .section __DATA,__data prompt: .asciz "Enter two numbers: " format: .asciz "%d %d" result_format: .asciz "Result: %d\n"
정말 추억에 솟아오르는 서정적인 고전 문장을 보는 것 같습니다. 한편의 시와 같네요.
실행 및 디버깅
맥에서 어셈블리를 컴파일한 적이 없어서 이 부분도 ChatGPT의 도움을 받았습니다.
as calculator.s -o calculator.o
컴파일은 잘 되는데, link 가 안되어 ChatGPT에게 도움을 요청했습니다.
Xcode CLI Tool을 설치하라고 안내를 하네요. 예전에 설치했다고 생각했는데, 다른 맥에서 했나봅니다.
xcode-select --install
설치후, 실행했지만, 동일한 결과가 나왔습니다. 그래서 구글링을 했더니.
OS가 업데이트되면서, libSystem.B.dylib의 위치가 변경되었다고 합니다. 가상화 되었다는 것 같습니다.
아쉽지만… 이 분야의 일을 하면 모를까 여기서 중단해야 겠다는 생각을 했습니다. 많은 량의 시간 투입 예상됨..
관심있으시면 시도해보세요.
아래는 실제로 대화에 사용한 대화 기록 링크입니다.
https://chat.openai.com/share/002fe570-bff8-4fd1-8ab9-4acc270d3266
대형 언어 모델의 가능성은 상상력에 의해서 무궁무진해 지는 것 같습니다.