본문 바로가기
리버싱/백준

[백준] 입출력과 사칙연산 풀이 with 어셈블리어

by jwcs 2025. 4. 29.
728x90
반응형

2557번

문제: Hello World!를 출력하시오.

문제 링크: https://www.acmicpc.net/problem/2557

 

풀이

global main
extern printf

section .data
    msg: db "Hello World!", 10, 0

section .text

main:
    push rbp
    mov rbp, rsp
    
    mov rdi, msg
    xor rax, rax
    call printf

    xor rax, rax
    pop rbp
    
    leave
    ret

 

1000번

문제: 두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

문제 링크: https://www.acmicpc.net/problem/1000

 

풀이

global main
extern printf
extern scanf

section .data
    prompt_input: db '%d %d', 0
    prompt_output: db '%d', 10,0

section .bss
    num1: resq 1
    num2: resq 1
    sum: resq 1

section .text
main:
    push rbp
    mov rbp, rsp

    ; scan
    mov rdi, prompt_input
    lea rsi, [num1]
    lea rdx, [num2]
    call scanf

    ; add
    mov rax, [num1]
    add rax, [num2]
    mov [sum], rax

    ; print
    mov rdi, prompt_output
    mov rsi, [sum]
    call printf

    xor rax,rax
    pop rbp
    
    leave
    ret

 

1001번

문제: 두 정수 A와 B를 입력받은 다음, A-B를 출력하는 프로그램을 작성하시오.

문제 링크: https://www.acmicpc.net/problem/1001

 

풀이

global main
extern scanf
extern printf

section .data
    scanf_fmt: db '%d %d', 0
    printf_fmt: db '%d', 0


section .bss
    num1: resd 1
    num2: resd 1


section .text

main:
    push rbp
    mov rbp, rsp

    ; ---scan---
    mov rdi, scanf_fmt
    lea rsi, [num1]
    lea rdx, [num2]
    xor rax, rax
    call scanf

    ; ---sub---
    mov rax, [num1]
    mov rbx, [num2]
    sub rax, rbx

    ; ---print---
    mov rdi, printf_fmt
    mov rsi, rax
    xor rax, rax
    call printf

    xor rax, rax
    pop rbp

    leave
    ret

 

10998번

문제: 두 정수 A와 B를 입력받은 다음, A×B를 출력하는 프로그램을 작성하시오.

문제 링크: https://www.acmicpc.net/problem/10998

 

풀이

global main
extern scanf
extern printf

section .data
    scanf_fmt: db '%d %d', 0
    printf_fmt: db '%d', 0


section .bss
    num1: resd 1
    num2: resd 1


section .text

main:
    push rbp
    mov rbp, rsp

    ; ---scan---
    mov rdi, scanf_fmt
    lea rsi, [num1]
    lea rdx, [num2]
    xor rax, rax
    call scanf

    ; ---mul---
    mov rax, [num1]
    mov rbx, [num2]
    mul rbx

    ; ---print---
    mov rdi, printf_fmt
    mov rsi, rax
    xor rax, rax
    call printf

    xor rax, rax
    pop rbp

    leave
    ret

 

 

1008번

문제: 두 정수 A와 B를 입력받은 다음, A/B를 출력하는 프로그램을 작성하시오.

문제 링크: https://www.acmicpc.net/problem/1008

 

풀이

global main
extern scanf
extern printf

section .data
    scanf_fmt: db '%lf %lf', 0
    printf_fmt: db '%.9f', 10, 0


section .bss
    num1: resq 1
    num2: resq 1


section .text

main:
    push rbp
    mov rbp, rsp

    ; ---scan---
    mov rdi, scanf_fmt
    lea rsi, [num1]
    lea rdx, [num2]
    xor rax, rax
    call scanf

    ; ---divsd---
    movsd xmm0, qword [num1]
    movsd xmm1, qword [num2]
    divsd xmm0, xmm1

    ; ---print---
    sub rsp, 16
    mov rdi, printf_fmt
    movsd qword [rsp], xmm0
    mov rsi, qword [rsp]
    mov eax, 1
    call printf
    add rsp, 16

    xor rax, rax
    pop rbp
    
    leave
    ret

 

10869번

문제: 두 자연수 A와 B가 주어진다. 이때, A+B, A-B, A*B, A/B(몫), A%B(나머지)를 출력하는 프로그램을 작성하시오. 

문제 링크: https://www.acmicpc.net/problem/10869https://www.acmicpc.net/problem/10869

 

문제 풀이

global main
extern scanf
extern printf

section .data
    print_fmt: db '%d', 10, 0
    scan_fmt: db '%d %d', 0

section .bss
    num1: resq 1
    num2: resq 1
    addResult: resq 1
    subResult: resq 1
    mulResult: resq 1
    divResult: resq 1
    remainderResult: resq 1


section .text

main:
    push rbp
    mov rbp, rsp

    ;--- scan ---
    mov rdi, scan_fmt
    lea rsi, [num1]
    lea rdx, [num2]
    xor rax, rax
    call scanf

    ;--- add ---
    mov rax, [num1]
    mov rbx, [num2]
    add rax, rbx
    mov [addResult], rax

    ;--- print add ---
    mov rdi, print_fmt
    mov rsi, [addResult]
    xor rax, rax
    call printf

    ;--- sub ---
    mov rax, [num1]
    mov rbx, [num2]
    sub rax, rbx
    mov [subResult], rax

    ;--- print sub ---
    mov rdi, print_fmt
    mov rsi, [subResult]
    xor rax, rax
    call printf

    ;--- mul ---
    mov rax, [num1]
    mov rbx, [num2]
    mul rbx
    mov [mulResult], rax

    ;--- print mul ---
    mov rdi, print_fmt
    mov rsi, [mulResult]
    xor rax, rax
    call printf

    ;--- div ---
    mov rax, [num1]
    mov rbx, [num2]
    xor rdx, rdx
    div rbx
    mov [divResult], rax
    mov [remainderResult], rdx

    ;--- print div ---
    mov rdi, print_fmt
    mov rsi, [divResult]
    xor rax, rax
    call printf

    ;--- print remainder ---
    mov rdi, print_fmt
    mov rsi, [remainderResult]
    xor rax, rax
    call printf

    xor rax, rax
    pop rbp

    leave
    ret

 

요약

  • rax, rbx는 주로 연산에 사용된다
  • rdi, rsi, rdx는 함수 호출 시 매개변수로 사용된다
  • 함수 호출 규약으로 인해, 함수 호출 전 rax를 0으로 초기화해야한다
  • 부동소수점을 printf 할 때에는 rax에 전달 부동소수점 인수 개수를 넣어야한다
  • 부동소수점을 계산할 때에는 xmm0, xmm1 등을 사용한다
  • div 연산시 몫은 rax에, 나머지는 rdx에 저장된다
728x90
반응형

'리버싱 > 백준' 카테고리의 다른 글

[백준] 반복문 풀이 with 어셈블리  (0) 2025.05.01
[백준] 조건문 풀이 with 어셈블리어  (0) 2025.04.30