본문 바로가기

Programming Language/Assembly

[Assembly] 어셈블리 Test11

실행환경

- cpu : 인텔계열(64bit)

- 컴파일러 : nasm

- 리눅스 : ubuntu 16.04 LTS


설치방법

sudo apt-get install nasm


컴파일

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

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



문제 : 출력예에 맞는 4칙연산을 완성

ex)

   My Calculator

   1. 더하기

   2. 빼기

   3. 곱하기 

   4. 나누기 

   선택하세요  1 

   

   첫번째 수 : 5

   두번째 수 : 7

   두 수의 합  = 12


test11.asm

section .data


msg db 'My Calculator',0x0A


lmsg equ $ -msg


a db '1. 더하기',0x0A


la equ $ -a


s db '2. 빼기',0x0A


ls equ $ -s


m db '3. 곱하기',0x0A


lm equ $ -m


d db '4. 나누기',0x0A


ld equ $ -d


sel db '선택하세요 '


lsel equ $ -sel




fir db '첫번째 수 : '


lfir equ $ -fir


sec db '두번째 수 : '


lsec equ $ -sec


sum db '두 수의 합 = '


lsum equ $ -sum


min db '두 수의 차 = '


lmin equ $ -min


gob db '두 수의 곱 = '


lgob equ $ -gob


na db '두 수의 나눔 = '


lna equ $ -na




ent db 0x0A




section .bss


sw resb 2


n1 resb 1


n2 resb 1


res resb 2


t resb 1




section .text


global _start




%macro write 2


mov eax,4


mov ebx,1


mov ecx,%1


mov edx,%2


int 0x80


%endmacro




%macro read 2


mov eax,3


mov ebx,1


mov ecx,%1


mov edx,%2


int 0x80


%endmacro




_start:


write msg,lmsg


write a,la


write s,ls


write m,lm


write d,ld


write sel,lsel


read sw,2



write ent,1




write fir,lfir


read n1,1


read t,1


write sec,lsec


read n2,1


read t,1




mov al,[n1]


sub al,'0'


mov bl,[n2]


sub bl,'0'


mov cl,[sw]




cmp cl,'1'


je _add




cmp cl,'2'


je _sub




cmp cl,'3'


je _mul




cmp cl,'4'


je _div



jmp _start




_add:


add al,bl




call _print




write sum,lsum


write res,2



jmp _exit




_sub:


sub al,bl



call _print




write min,lmin


write res,2




jmp _exit




_mul:


mul bl




call _print




write gob,lgob


write res,2




jmp _exit




_div:


div bl




mov bl,10


mul bl


call _print




write na,lna


write res,2




jmp _exit




_print:


mov bl,10


div bl




add al,'0'


add ah,'0'


mov [res],al


mov [res+1],ah




ret



_exit:


write ent,1


mov eax,1


int 0x80






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

[Assembly] 어셈블리 Test13  (0) 2016.12.05
[Assembly] 어셈블리 Test12  (0) 2016.12.05
[Assembly] 어셈블리 Test10  (0) 2016.12.05
[Assembly] 어셈블리 Test9  (0) 2016.12.05
[Assembly] 파일입출력  (0) 2016.12.05