728x90
반응형
2739번
문제: N을 입력받은 뒤, 구구단 N단을 출력하는 프로그램을 작성하시오. 출력 형식에 맞춰서 출력하면 된다.
문제 링크:https://www.acmicpc.net/problem/2739
풀이:
global main
extern scanf
extern printf
section .data
print_fmt: db '%d * %d = %d', 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 rsi, [num]
xor rax, rax
call scanf
;--- loop ---
mov rbx, 0
.loop:
inc rbx
mov rdi, print_fmt
mov rsi, [num]
mov rcx, [num]
imul rcx, rbx
mov rdx, rbx
xor rax, rax
call printf
cmp rbx, 9
jl .loop
xor rax, rax
leave
ret
- caller-saved와 callee-saved에 대해 알아야 한다.
- caller-saved
- 호출자가 직접 레지스터 값을 보존해야 한다
- push/pop을 이용하면 보존할 수 있다.
- rax, rdi, rsi, rdx, rcx, r8~r11이 속한다.
- callee-saved
- 호출받는 함수에서 레지스터 값을 보존해준다. (ex. printf)
- rbx, rbp, r12 ~ 14, rsp가 이에 속한다.
global main
extern scanf
extern printf
section .data
print_fmt: db '%d * %d = %d', 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 rsi, [num]
xor rax, rax
call scanf
;--- loop ---
mov rdx, 0
.loop:
inc rdx
mov rdi, print_fmt
mov rsi, [num]
mov rcx, [num]
imul rcx, rdx
mov rdx, rdx
xor rax, rax
push rdx
call printf
pop rdx
cmp rdx, 9
jl .loop
xor rax, rax
leave
ret
이와 같이 push / pop을 통해 값을 보존하여 사용할 수 있다.
728x90
반응형
'리버싱 > 백준' 카테고리의 다른 글
[백준] 조건문 풀이 with 어셈블리어 (0) | 2025.04.30 |
---|---|
[백준] 입출력과 사칙연산 풀이 with 어셈블리어 (0) | 2025.04.29 |