단 을 입력 받 아 구구단 을 출력 해 봅시다 . ABS . ASM 파일 SOURCE STSEG SEGMENT ; STACK SEGMENT 시작 DW 128 DUP ( ? ) STSEG ENDS DTSEG SEGMENT ; DATA SEGMENT 시작 SMSG 1 DB ' 20060000 ', 0 DH , 0 AH , '$' ; DEFINE SMSG 1 SMSG 2 DB ' 홍길동 ', 0 DH , 0 AH , '$' ; DEFINE SMSG 2 SMSG 3 DB ' 구구단 몇 단 을 출력 할까요 ? ( 2 - 9 ) ', 0 DH , 0 AH , '$'; DEFINE SMSG 3 SMSG 4 DB 0 DH , 0 AH , '$' ; DEFINE SMSG 4 DTSEG ENDS SEND _ MSG MACRO ADDR ; 문자열 출력 매크로 32 BITLEA DX , ADDRMOV AH , 9 INT 21 HENDM DISP _ CHAR MACRO DATA ; 문자열 출력 매크로 16 BITMOV DL , DATAMOV AH , 2 INT 21 HENDM CRLF MACRO ; ENTER 매크로 DISP _ CHAR 0 DHDISP _ CHAR 0 AHENDM CDSEG SEGMENT ; CODE SEGMENT 시작 MAIN PROC FARASSUME CS : CDSEG , DS : DTSEG , SS : STSEGMOV AX , DTSEGMOV DS , AXSEND _ MSG SMSG 1 ; 문자열 나열 ( 20060000 ) SEND _ MSG SMSG 2 ; 문자열 나열 ( 홍길동 ) SEND _ MSG SMSG 3 ; 문자열 나열 ( 구구단 몇 단 을 출력 할까요 ? ( 2 - 9 ) SEND _ MSG SMSG 4 ; 문자열 나열 ( 다음 칸 ) MOV AH , 1 INT 21 H ; 숫자 입력 받 기 SUB AH , AH ; 원 AL 값 보존 을 위해 AH 값 CLEARSUB AL , 30 H ; 입력 된 아스키 값 을 그 에 해당 하 는 이진수 로 변환 PUSH AX ; AX STACK 에 저장 MOV CX , 9 ; COUNTER 9 CRLF ; 엔터 ( <- 내 가 입력 한 값 이랑 결과 값 구분 을 위해 ) POP AX ; 원 AX 값 불러오 기 ( CRLF 매크로 에서 AH 값 이 변경 되 기 때문 에 ) AGAIN : PUSH AX ; 원 AX 값 을 STACK 에 저장 <- LOOP 시작 부분 ( <- LOOP 처음 에서 원 AX 값 을 가져오 기 위해 ) PUSH AX ; 원 AX 값 을 STACK 에 저장 ( <- AX 아스키 값 출력 후 원 AX 값 가져오 기 위해 ) INC BL ; BL 1 증가 ADD AL , 30 H ; AL 의 아스키 값 으로 변환 ADD BL , 30 H ; BL 의 아스키 값 으로 변환 DISP _ CHAR AL ; AL 출력 DISP _ CHAR '*';' * ' 출력 DISP _ CHAR BL ; BL 출력 DISP _ CHAR '=';' = ' 출력 POP AX ; 원 AX 값 가져오 기 SUB BL , 30 H ; 아스키 값 을 그 에 해당 하 는 이진수 로 변환 MUL BL ; BL 과 AL 곱하 여 AX 에 저장 AAM ; AL 값 의 각 DIGIT 분리 하 여 AH 와 AL 에 각각 저장 ADD AH , 30 H ; AH 의 아스키 값 으로 변환 ADD AL , 30 H ; AL 의 아스키 값 으로 변환 PUSH AX ; DIGIT 분리 값 을 STACK 에 저장 ( <- DISP _ CHAR 매크로 에서 AH 값 을 변환 시키 므로 ) DISP _ CHAR AH ; AH 출력 POP AX ; 원 DIGIT 분리 값 을 가져오 기 DISP _ CHAR AL ; AL 출력 CRLF ; 엔터 DEC CX ; CX 1 감소 POP AX ; 원 AX 값 가져오 기 JNZ AGAIN ; CX 가 0 이 아니 면 AGAIN 으로 점프 MOV AH , 4 CHINT 21 H ; 종료 MAIN ENDPCDSEG ENDSEND MAIN