본문 바로가기

Programming Language/Assembly

[Assembly] 어셈블리 Test19

실행환경

- cpu : 인텔계열(64bit)

- 컴파일러 : nasm

- 리눅스 : ubuntu 16.04 LTS


설치방법

sudo apt-get install nasm


컴파일

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

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


문제 : 1부터 100까지의 수 중 짝수의 합과 홀수의 합, 그리고 3의 배수의 합


test19.asm

section .data


e db 'even sum : '


le equ $ -e


o db 'odd sum : '


lo equ $ -o


t db '3 sum : '


lt equ $ -t




ent db 0x0A




section .bss


esum resb 4


osum resb 4


tsum resb 4


tmp 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:


mov al,1


mov bl,0


mov [esum],bl


mov [osum],bl


mov [tsum],bl



_lp:


cmp al,31


je _print




mov [tmp],al




mov bl,2


div bl




cmp ah,1


je _odd



_even:


mov al,[tmp]


mov bl,[esum]


add al,bl


mov [esum],al


mov ah,0




jmp _three




_odd:


mov al,[tmp]


mov bl,[osum]


add al,bl


mov [osum],al


mov ah,0



jmp _three




_three:


mov al,[tmp]


mov bl,3


div bl




mov cl,ah


push rcx


mov eax,1


pop rcx




cmp cl,0


je _tok




jmp _ntok




_tok:


mov al,[tmp]


mov bl,[tsum]


add al,bl


mov [tsum],al




_ntok:


mov al,[tmp]


inc al


jmp _lp




_print:


add al,0


mov bl,100


mov al,[esum]


div bl




add al,'0'


mov [esum],al




mov al,ah


mov ah,0


mov bl,10


div bl




add al,'0'


add ah,'0'


mov [esum+1],al


mov [esum+2],ah



mov ah,0


mov bl,100


mov al,[osum]


div bl




add al,'0'


mov [osum],al




mov al,ah


mov ah,0


mov bl,10


div bl




add al,'0'


add ah,'0'


mov [osum+1],al


mov [osum+2],ah



mov ah,0


mov bl,100


mov al,[tsum]


div bl




add al,'0'


mov [tsum],al




mov al,ah


mov ah,0


mov bl,10


div bl




add al,'0'


add ah,'0'


mov [tsum+1],al


mov [tsum+2],ah



write e,le


write esum,3


write ent,1


write o,lo


write osum,3


write ent,1


write t,lt


write tsum,3


write ent,1




_exit:


mov eax,1


int 0x80


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

[Assembly] 어셈블리 Test21  (0) 2016.12.05
[Assembly] 어셈블리 Test20  (0) 2016.12.05
[Assembly] 어셈블리 Test18  (0) 2016.12.05
[Assembly] 어셈블리 Test17  (0) 2016.12.05
[Assembly] 어셈블리 Test16  (0) 2016.12.05