[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
반응형
'코딩 > 공부 [STUDY]' 카테고리의 다른 글
[STUDY] 유클리드 호제법 (0) | 2023.04.17 |
---|---|
[STUDY] 동적계획법 (dynamic programming) (0) | 2023.04.16 |
[STUDY] 어셈블리어 - 5 (0) | 2023.02.28 |
[STUDY] 어셈블리어 - 4 (0) | 2023.02.25 |
[STUDY] 어셈블리어 - 3 (rip,rsp,rbp,스택프레임) (1) | 2023.02.23 |