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

[백준] 조건문 풀이 with 어셈블리어

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

1330번

문제: 두 정수 A와 B가 주어졌을 때, A와 B를 비교하는 프로그램을 작성하시오.

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

 

풀이

global main
extern scanf
extern printf

section .data
    print_fmt: db '%s', 10, 0
    scan_fmt: db '%d %d', 0
    msg_less: db '<', 0
    msg_eq: db '==', 0
    msg_gt: db '>', 0


section .bss
    num1: resq 1
    num2: resq 1

section .text

main:
    push rbp
    mov rbp, rsp

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

    ;--- cmp ---
    mov eax, [num1]
    cmp eax, [num2]
    je .equal
    jl .less
    jmp .greater
    
.equal:
    mov rdi, print_fmt
    mov rsi, msg_eq
    xor rax, rax
    call printf
    jmp .done

.greater:
    mov rdi, print_fmt
    mov rsi, msg_gt
    xor rax, rax
    call printf
    jmp .done

.less:
    mov rdi, print_fmt
    mov rsi, msg_less
    xor rax, rax
    call printf
    jmp .done

.done:
    xor rax, rax
    leave
    ret

 

  • `.label`과 같은 형식으로 레이블을 만들 수 있다.
  • je는 두 수가 같아서 ZF가 1이면 된다.
  • jl은 eax보다 num1이 크면 된다.
  • resq 1(8바이트)으로 받아서 rax를 사용하고 싶다면 scan_fmt에서 %d 대신 %ld를 사용해야한다.

 

9498번

문제: 시험 점수를 입력받아 90 ~ 100점은 A, 80 ~ 89점은 B, 70 ~ 79점은 C, 60 ~ 69점은 D, 나머지 점수는 F를 출력하는 프로그램을 작성하시오.

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

 

풀이:

global main
extern scanf
extern printf

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

section .bss
    num: resd 1

section .text

main:
    push rbp
    mov rbp, rsp

    ;--- scan ---
    mov rdi, scan_fmt
    lea esi, [num]
    xor rax, rax
    call scanf

    ;--- cmp ---
    mov eax, [num]
    cmp eax, 90
    jge .grade_A
    cmp eax, 80
    jge .grade_B
    cmp eax, 70
    jge .grade_C
    cmp eax, 60
    jge .grade_D
    jmp .grade_F

.grade_A:
    mov rdi, print_fmt
    mov rsi, 'A'
    xor rax, rax
    call printf
    jmp .done

.grade_B:
    mov rdi, print_fmt
    mov rsi, 'B'
    xor rax, rax
    call printf
    jmp .done

.grade_C:
    mov rdi, print_fmt
    mov rsi, 'C'
    xor rax, rax
    call printf
    jmp .done

.grade_D:
    mov rdi, print_fmt
    mov rsi, 'D'
    xor rax, rax
    call printf
    jmp .done

.grade_F:
    mov rdi, print_fmt
    mov rsi, 'F'
    xor rax, rax
    call printf
    jmp .done

.done:
    xor rax, rax
    leave
    ret
728x90
반응형