[어셈블리어] 백준 2557번 Hello World 런타임 오류 해결법

2020. 1. 29. 16:08알고리즘/acmicpc 코드

백준 2557번을 어셈블리어로 풀다가 런타임 오류가 떠서 들어오신 분들은 어셈블리어에 대해 어느정도는 숙지하고 계실 거라 생각해요. 2557번에 대한 설명을 원하시는 분들은 뒤로가기를 누르셔도 됩니다.. (죄송합니다 ㅠㅠ)

 

제 생각에 자신의 컴퓨터에서는 돌아가는데 백준 온라인 채점에서 막히는 사람이 있을거라 생각해요.

 


만약 아래와 같은 컴파일 오류가 뜬다면,

/usr/lib/../lib32/crt1.o: In function `_start': (.text+0x18): undefined reference to `main' collect2: error: ld returned 1 exit status

메인 함수의 이름을 main으로 하지 않았을 확률이 높아요. 한번 section .text 부분을 global main, main: 으로 변경해보세요.


 

채점 결과에 런타임 오류가 뜨면 EAX 레지스터에 0 값을 넣지 않았기 때문이에요.

한번 mov eax, 0 을 어셈블리 코드 아래쪽에 넣어주시면 "맞았습니다!" 를 받을 수 있을거에요.

언제나 봐도 기분 좋은..

 

대체로 함수에서 끝날 때 리턴할 값을 EAX 레지스터에 넣어줍니다.

이유는 잘 모르겠지만, main 함수의 정상적인 종료를 확인하려는 목적 같습니다.

EAX 레지스터에 0이 아닌 다른 숫자를 한번 넣어보세요! 전 틀렸다고 나옵니다..

 


 

먼저 제가 푼 답은 아래와 같습니다.(32비트 기준으로 프로그래밍 했습니다.) (Intel 문법)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
section .data
    msg : db "Hello World!"
 
section .text
    global main
 
main:
    push ebp
    mov ebp, esp
    mov eax, 4 ; sys_write
    mov ebx, 1 ; 출력 모드
    mov ecx, msg
    mov edx, 12
    int 0x80 ; syscall 와 같음 32비트 컴파일 시에는 int 0x80 사용해야 함.
    mov eax, 0
    leave
    ret
cs

참고! 64비트 어셈블리어에서 syscall은 int 0x80와 같은 동작을 합니다.