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 |