[STUDY] 어셈블리어 - 6

2023. 2. 28. 20:08코딩/공부 [STUDY]

반응형

1. 과제

목표 > 어셈블리어 - 5 에서 만든 함수를 이용하여 구구단 곱셈 2단 출력하기

조건 > 개행으로 한 글자씩 나눠서 출력해야한다.

 


2. 결과

익숙해져서 생각만큼 크게 어려워지진 않았지만 아직 미숙한 부분이 존재하는 듯.

section .text

global _start

_start:
    call mult

    mov rax, 60
    xor rdi, rdi
    syscall

mult:
    push rbp
    mov rbp, rsp
    sub rsp, 16
    mov rbx, 1

.inmult:
    mov rdi, 2
    mov qword[rbp-8], rbx
    imul rdi, rbx
    call func
    mov qword[rbp-16], rdi
    mov rbx, qword[rbp-8]

    mov rax, 1
    mov rdi, 1
    mov rsi, empty     ; rdx is remain %10 + '0' 
    mov rdx, 1
    syscall

    cmp rbx, 10
    je .end

    add rbx, 1
    jmp .inmult

.end:
    add rsp, 16
    mov rbp, rsp
    pop rbp
    ret

func:
    push rbp 
    mov rbp, rsp

    sub rsp, 8 

    mov qword [rbp-8], rdi
    mov rsi, rdi        ; for putChar('-');

    cmp qword [rbp-8], 0
    jae  .check                ; putchar('-');
    
    neg qword [rbp-8]

.check:
    cmp qword [rbp-8], 10
    jb final

    xor rdx, rdx        ; rdx is remain value
    mov rax, qword [rbp-8]
    mov rbx, 10
    idiv rbx
    mov rdi, rax       ; x/10
    call func

final:
    xor rdx, rdx
    mov rax, qword [rbp-8]
    mov rbx, 10
    idiv rbx
    add rdx, 48         ; add the + ('0')
    mov qword [rbp-8], rdx

    cmp rsi, 0
    jb .putchar    

    mov rax, 1
    mov rdi, 1
    lea rsi, [rbp-8]       ; rdx is remain %10 + '0' 
    mov rdx, 1
    syscall


    jmp ret

    add rsp, 8
    pop rbp
    ret

.putchar:
    neg rdx
    mov qword [rbp-8], rdx
    mov rax, 1
    mov rdi, 1
    lea rsi, [rbp-8]        ; rdx is remain %10 + '0' but, putchar('-');
    mov rdx, 1
    syscall

    jmp ret

ret:
    add rsp, 8
    pop rbp
    ret

section .data
    empty: db 10
반응형