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

[백준] 반복문 풀이 with 어셈블리

by jwcs 2025. 5. 1.
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
반응형