반응형
.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 이하의 수만 출력하는 프로그램입니다.
하지만 고급언어로 작성한 것 보다 수가 만들어지는게 영 매끄럽지가 않네요.
실행시켜보면 중복해서 수를 뽑는 경우도 있고...
그렇지만, 분명히 좋은 다른 방법이 있을겁니다.
반응형
'어셈블리어 공부용 > x86 어셈블리어(ASSEMBLY)' 카테고리의 다른 글
어셈블리어 INT 21h 정리 (0) | 2019.08.17 |
---|---|
윈도우 10에서 도스박스로 도스디버거(DOS DEBUG) 실행하기 (0) | 2019.08.16 |
emu8086으로 어셈블리어 연습 [16진수를 10진수로 변환 후 출력하기] (0) | 2019.08.15 |
emu8086을 이용한 어셈블리어 연습 [16진수를 입력하여 16진수로 저장하기] (0) | 2019.08.15 |
emu8086으로 어셈블리어 연습 [10진수를 입력받아 16진수로 저장하기.] (0) | 2019.08.15 |
댓글