System Hacking/Study Notes

어셈블리어 구구단 만들기

S!_Jmini 2020. 7. 1. 15:39

* 2019년 1학년 1학기 동아리 과제

 

 

결과값을 출력할 때 문자로 출력하다보니

 

2자리수의 결과값을 출력하는게 어려웠다.

 

 

무엇이든지 직접해야 와닿는 것같다.

 

 


21.12.16 항상 열심히 히자

 

 

### 컴파일 방법 ###
nasm -f elf64 파일명.s -o 파일명.o  
ld 파일명.o -o 파일명

* -s 옵션 넣으면 심볼 날립니다!!


 

# 결과물 사진

 

section 이름을 gugu로 했더니 .text 영역의 이름이 .gugu로 되었다 

 

 

그리고 2자리의 구구단 연산은 지원을 하지 않는다 ㅠㅠ

 

 

 

# source code

 

global _start

section .gugu
_start:

        ; read number
        xor rax, rax
        xor rdi, rdi
        mov rsi, input
        mov rdx, 1
        syscall

        ; print result 
        mov rcx, 9      ; repeat count
        mov rax, '1'
        print:
                push rax
                push rcx
                mov [num], al

                mov rax, 1      ; @ x ? = ?\n
                mov rdi, 1
                mov rsi, input
                mov rdx, 1
                syscall

                call printX     ; ? @ ? = ?\n

                mov rax, 1      ; ? x @ = ?\n
                mov rdi, 1
                mov rsi, num
                mov rdx, 1
                syscall

                call printequal ; ? x ? @ ?\n
                call printres   ; ? x ? = @\n

                mov rax, 1      ; ? x ? = ?@
                mov rdi, 1
                mov rsi, enter
                mov rdx, 1
                syscall

                pop rcx
                pop rax
                inc al
                loop print

        ; exit
        mov rax, 60
        xor rdi, rdi
        syscall

printX:
        mov rax, 1
        mov rdi, 1
        mov rsi, x
        mov rdx, 3
        syscall
        ret

printequal:
        mov rax, 1
        mov rdi, 1
        mov rsi, equal
        mov rdx, 3
        syscall
        ret

printenter:
        mov rax, 1
        mov rdi, 1
        mov rsi, enter
        mov rdx, 1
        syscall
        ret

printres:
    mov al, [input]
    sub al, '0'
    mov bl, [num]
    sub bl, '0'
    mul bl
    mov bl, 10
    div bl
    add al, '0'
    add ah, '0'
    cmp al, '0'
    je one

    mov [res+1], ah
    mov [res], al
    mov rax, 1
    mov rdi, 1
    mov rsi, res
    mov rdx, 2
    syscall
    ret

    one:
        mov [res], ah
        mov rax, 1
        mov rdi, 1
        mov rsi, res
        mov rdx, 1
        syscall
        ret

section .data

input: dw 0x00
x: dw ' X '
num: db '1'
equal: dw  ' = '
res: dw '1'
enter: dw 10