본문 바로가기

Programming Language/Assembly

[Assembly] 구구단 출력

실행환경

- cpu : 인텔계열(64bit)

- 컴파일러 : nasm

- 리눅스 : ubuntu 16.04 LTS


설치방법

sudo apt-get install nasm


컴파일

- nasm -f elf64 파일명.asm -o 파일명.o  --> 목적파일을 만든다.

- ld 파일명.o -o 파일명  --> 실행파일을 만든다.



row_loop.asm

;반복문인 loop를 배운다

section .data

end db 0x0A

star db '*'

len1 equ $ -star

equl db '='

len2 equ $ -equl

space db 0x09

len3 equ $ -space


section .bss

num1 resb 1

num2 resb 1

res resb 1


section .text

global _start


_start:

;loop에서는 먼저 몇번 돌지를 반복문 들어가기 전에 정해준다

;loop에서는 처음 몇번 돌지 선택을 ecx만 사용해야 한다.

;pop push같은 경우 데이터를 적재 해놓고 쓰는 것이기 때문에 

;os비트에 맞추어야 된다. -> 64비트는 앞글자가 r, 32비트는 앞글자가 e

mov rcx, 9 ;3번 반복하겠다, 반복 횟수

mov rax, '1' ;반복할 값, 데이터

L1:

mov [num1], rax ;내 데이터가 날아가지 않게 저장하는 부분이다

push rcx ;반복횟수 정보가 날아가지 않게 저장하는 부분이다

mov rcx, 9

mov rbx, '1'

L2:

push rcx

mov [num2], rbx

call num2_print

call star_print

call num1_print

call equl_print

call res_print

call spaceprint

mov rbx, [num2]

inc rbx


pop rcx

loop L2


call endprint

mov rax, [num1]

inc rax

pop rcx

loop L1

mov rax, 1

int 0x80


num1_print:

mov eax, 4

mov ebx, 1

mov ecx, num1

mov edx, 1

int 0x80

ret


num2_print:

mov eax, 4

mov ebx, 1

mov ecx, num2

mov edx, 1

int 0x80

ret


star_print:

mov eax, 4

mov ebx, 1

mov ecx, star

mov edx, len1

int 0x80

ret


equl_print:

mov eax, 4

mov ebx, 1

mov ecx, equl

mov edx, len2

int 0x80

ret


res_print:

mov al, [num2]

sub al, '0'

mov bl, [num1]

sub bl, '0'

mul bl

mov bl, 10

div bl

add al, '0'

add ah, '0'


cmp al, '0'

je _mov

mov [res], al

mov [res+1], ah


mov eax, 4

mov ebx, 1

mov ecx, res

mov edx, 2

int 0x80

ret


_mov:

mov [res], ah


mov eax, 4

mov ebx, 1

mov ecx, res

mov edx, 2

int 0x80

ret


spaceprint:

mov eax, 4

mov ebx, 1

mov ecx, space

mov edx, len3

int 0x80

ret


endprint:

mov eax, 4

mov ebx, 1

mov ecx, end

mov edx, 1

int 0x80

ret