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
반응형
'리버싱 > 백준' 카테고리의 다른 글
[백준] 반복문 풀이 with 어셈블리 (0) | 2025.05.01 |
---|---|
[백준] 입출력과 사칙연산 풀이 with 어셈블리어 (0) | 2025.04.29 |