본문 바로가기

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 파일명  --> 실행파일을 만든다.


ex1_2.asm

section .data

 msg db "star 10 ", 0x0A

 len equ $ -msg ;msg의 길이를 len이라는 변수가 가지는데

  ;equ는 상수란 의미이다. 쉽게 equ는 equal와 같으며

;$ -변수 은 변수의 길이를 구하기 위한 명령어라 생각하자

;즉 len = $ -msg 은 msg의 길이가 상수로 len에 대입된다.

 star times 10 db '*' ; times 10 -> 별표 10개개가 찍힌다.

 end db 0x0a

section .text

global _start


_start:

mov eax,4 ;4는 syscall 함수의 sys_write함수 등록 번호

mov ebx,1

mov ecx, msg

mov edx, len

int 0x80


mov eax,4 ;4는 syscall 함수의 sys_write함수 등록 번호

mov ebx,1

mov ecx, star

mov edx, 10

int 0x80


call _print         ;_print 함수를 호출한다.


mov eax,1 ;1은 syscall 함수의 sys_exit함수 등록 번호

int 0x80


_print:                 ;개행하기 위한 함수

mov eax,4 ;4는 syscall 함수의 sys_write함수 등록 번호

mov ebx,1

mov ecx, end

mov edx, 1

int 0x80

ret                         ;ret은 return의 이미로 _print함수를 호출한 번지로 이동한다.

;만약 ret가 없다면 호출한 해당 번지로 이동하지 않고 tag로 생각하여

;밑의 코드를 실행하게 된다. goto와 같다고 생각하면 된다.








'Programming Language > Assembly' 카테고리의 다른 글

[Assembly] 짝수 홀수 판별1  (0) 2016.12.04
[Assembly] 문자열 변환  (0) 2016.12.04
[Assembly] Hello World 출력하기  (0) 2016.12.04
[Assembly] 어셈블리 명령어  (0) 2016.12.04
[Assembly] syscall table for x86_64  (0) 2016.12.04