실행환경
- 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
'Programming Language > Assembly' 카테고리의 다른 글
[Assembly] 어셈블리 Test1 (0) | 2016.12.04 |
---|---|
[Assembly] 매크로를 이용한 구구단 출력 (0) | 2016.12.04 |
[Assembly] 재귀함수 구현 (0) | 2016.12.04 |
[Assembly] 최대값 구하기 (0) | 2016.12.04 |
[Assembly] 매크로 사용해보기 (0) | 2016.12.04 |