본문 바로가기
어셈블리어 공부용/x86 어셈블리어(ASSEMBLY)

emu8086으로 어셈블리어 연습하기 [로또번호용 난수 6자리 뽑기]

by Redoutable 2019. 8. 15.
반응형
.MODEL SMALL
.CODE
ORG 100h           ;100h번지부터 코드시작.
;----------------------------------------------
PROG:
  
    CALL MAIN ; 난수를 만들고 출력하는 역활을 담당.
    CALL ENND ; 프로그램을 종료하는 역활.
;----------------------------------------------

BLANK DB '   $'    ; 공백출력을 위한것.

;----------------------------------------------    
MAIN PROC NEAR     ; 메인 프로시저 시작
    
    MOV CX,06      ; 6개의 수를 뽑는다.

AGAIN:
    PUSH CX        ; CX레지스터 데이터를 스택에 저장한다 (바로 위에서 수록한 데이터 보호를 위함.)
                            
DRAW:              ; DRAW 라벨
    MOV AH,02Ch    ; 기능번호 2Ch번 수록. 시스템 시간을 가져온다.
    INT 21h        ; 실행
   
    MOV AX,0       ; AX레지스터를 청소해준다.
        
    MOV AL,DL      ; DL레지스터(100분의 1초)에 있는 데이터를 AL레지스터로 옮긴다.
    CMP AL,45      ; 우선 45보다 큰 수인지 비교한다.
    JG DRAW        ; 큰 수라면 다시 뽑는다.
    CMP AL,0       ; 0인지 아닌지 비교해본다.
    JE DRAW        ; 0이라면 다시 뽑는다.
    
    MOV CX,0       ; 10진수 변환준비를한다. CX레지스터에 변환이 한 번 이루어 질때마다 여기에 1씩 더하기위해 청소.
HEX:    
    MOV DX,0       ; 10진수 변환준비를 위하여 DX레지스터를 청소해준다. 
    MOV BX,10      ; 10을 곱하기위하여 BX레지스터에 10을 수록한다.
    
    DIV BX         ; AX레지스터를 10으로 나눈다.
    INC CX         ; CX레지스터에 +1 한다. 아래 출력부분에서 쓰일것이다.
    PUSH DX        ; DX레지스터(나눗셈후 나머지)를 스택에 저장한다.
    CMP AX,0       ; AX레지스터(몫)가 0인지 확인하고.
    JNE HEX        ; 0이 아니라면 다시 HEX라벨로 돌려보내서 진수변환을 계속한다.

DISP:           
    POP DX         ; 스택에 있는 값을 DX레지스터로 꺼내온다. (스택은 선입후출이다. 넣은순서 거꾸로 나온다.)
    ADD DL,'0'     ; 아스키변환을 위하여 0(30h)을 더한다.
    MOV AH,02      ; 2번 기능번호. DL레지스터에 수록되어있는 한 글자를 출력한다.
    INT 21h        ; 실행
    LOOP DISP      ; CX레지스터 값이 여기서 쓰인다. CX레지스터가 0이 될때까지 DISP를 반복한다.
    
    LEA DX,BLANK   ; BLANK 데이터영역 주소를 수록한다. (공백)
    MOV AH,09      ; 9번 기능번호. DX레지스터가 가르키는 주소의 문자열을 출력하는 기능이다.
    INT 21h        ; 실행
    
    MOV CX,9       ; 더미루프(시간지연)를 위하여 아무값이나 정해서 CX 레지스터에 넣는다.
DLOOP:             ; 루프가 실행되면 자기자신을 실행할 것이다.
    LOOP DLOOP     ; 시간지연을 주어서 수가 좀 더 다양하게 나오도록 유도한다.
    
    POP CX         ; 마지막으로 스택에 보관해 두었던, 출력할 숫자의 갯수를 정한 수를 꺼내온다.
    LOOP AGAIN     ; 맨 위로 보내어 5개의 수를 출력할 때 까지 반복한다.
        
    RET            ; 출력이 끝나면 메인루틴으로 복귀한다.
    
MAIN ENDP
;----------------------------------------------
ENND PROC NEAR
     HLT           ; 프로그램 중단명령.
ENND ENDP
;----------------------------------------------
END PROG

 

 

 

이 프로그램은 로또번호를 만들어줍니다. (1게임)

시스템 시간의 초 뒤에 붙는 백분의 1초를 가지고 난수를 만드는데

수를 마구잡이로 잡아서 0을 제외한 45 이하의 수만 출력하는 프로그램입니다.

하지만 고급언어로 작성한 것 보다 수가 만들어지는게 영 매끄럽지가 않네요.

실행시켜보면 중복해서 수를 뽑는 경우도 있고...

 

그렇지만, 분명히 좋은 다른 방법이 있을겁니다.

반응형

댓글