1~ 입력받은 수(2byte)까지의 3의 배수를 구하고 그 수를 출력, 합을 출력

 

%include "io64.inc"

 

section .text

global CMAIN

CMAIN:

mov rbp, rsp; for correct debugging

GET_DEC 2, input

 

L_loop:

add [for_index],word 1 ; 반복 인덱스값 증가

 

;인덱스값이 3의 배수인지 판별하려고 3으로나눠봄

mov eax, [for_index]

;dx에 전반부 ax에 후반부로 나눠야 계산이됨 - 실제 저장된건 리틀엔디안 스타일이기에 값으로는 반대

mov edx, eax

shr edx, 16

 

and eax, 0x0000ffff

 

mov bx, 3

div bx ; 값은 ax에 몫, dx에 나머지가 저장됨

 

cmp dx, 0 ; 나머지가 0인지 판별하려고함

jne L_after_save ;0이 아니라면 데이터배열에 저장하지않음

 

;데이터배열에 저장

mov eax, 0

mov ax, [data_index]

mov bx, [for_index]

mov [data + eax * 2], bx

inc ax

mov [data_index], ax

 

L_after_save:

mov bx, [for_index]

cmp bx, [input]

jne L_loop; for_index가 입력된 값과 같을때까지 반복

 

; 저장된 값 출력

PRINT_STRING str_print_start

mov eax, 0

L_print_loop:

;3의 배수값 출력 + 합구하기

mov dx, [data + eax * 2]

add [total], dx

PRINT_DEC 2, dx

PRINT_STRING str_comma_space

 

inc ax

 

mov bx, [data_index]

cmp ax, bx

jne L_print_loop

 

NEWLINE

;저장된 개수

PRINT_STRING str_count

PRINT_DEC 2, [data_index]

NEWLINE

;합

PRINT_STRING str_total

PRINT_DEC 2, [total]

NEWLINE

 

xor rax, rax

ret

 

section .bss

data resw 100

input resw 1

section .data

data_index dw 0

for_index dw 0

total dw 0

;msg

str_print_start db '3의 배수 : ',0x00

str_comma_space db ', ',0x00

str_count db '3의 배수 갯수 : ',0x00

str_total db '총합 : ',0x00

 

2byte수를 한 개 입력 받아(10진수) 이 숫자를 2진수로 출력하라

막혔음... 

c로 하면 간단한데 어디서 문제가 생긴지 모르겠다.

 

 

 

 

'NASM' 카테고리의 다른 글

10일차.  (0) 2020.06.24
8일차.  (0) 2020.06.21
7일차.  (0) 2020.06.20
6일차.  (0) 2020.06.19
5일차.  (0) 2020.06.18

+ Recent posts