[어셈블리어] 백준 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와 같은 동작을 합니다.
'알고리즘 > acmicpc 코드' 카테고리의 다른 글
[acmicpc] 10814 나이순 정렬 정답 코드 (0) | 2020.04.13 |
---|---|
[acmicpc] 11650 좌표 정렬하기 정답 코드 (0) | 2020.04.12 |
[acmicpc] 백준 1018 체스판 다시 칠하기 정답 코드 (0) | 2020.04.12 |
[acmicpc] 백준 7568 덩치 C언어 정답 코드 (0) | 2020.04.12 |
[acmicpc] 백준 2446번: 별 찍기 - 9 (피라미드 출력하기) (0) | 2020.04.09 |