[STUDY] 어셈블리어 - 5

2023. 2. 28. 00:31코딩/공부 [STUDY]

반응형

1. 과제

목표 > 8바이트 정수를 stdout을 이용해 10진수 정수로 출력하기

 

참고 코드 > 


2. 결과

 

section .text

global _start

_start:
    mov rdi, 3654154

    call func

    mov rax, 60
    xor rdi, rdi
    syscall

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

    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

습관인것 같은데 처음에 코드 만들땐 저 조건문 2개를 전부 func 레이블에 집어넣어서

jmp func로 해야하게 만들어버려서 조건을 반대로 수정해서 위 그림처럼 수정했다.

 

+ 음수는 안만들어도 되는건데 만들다가 포기 다음에 시간 남으면 해봐야지

반응형