'asm'에 해당되는 글 2건

  1. 2009.09.17 [ASM] 어셈으로 구구단 출력하기
  2. 2009.01.20 Asm 으로 계산기 만들었던거....

음...2년전쯤에 짠거긴하지만...

도움될 분들이 있을까 해서 ㅎㄷㄷ


PAGE 60,80
TITLE  GUGUDAN
STACK SEGMENT PARA STACK 'stack';########################STACK START
STACK ENDS;###############################################STACK ENDS
CODE SEGMENT PARA 'code';#################################CODE START
 ASSUME DS:DATA,CS:CODE,SS:STACK
;----------------------------MAIN-----------------------------------
MAIN PROC FAR
DATASEGMENT_USE:  ;   데이타 세그먼트의 사용--DATASEGMENT_USE IN
 MOV AX,DATA
 MOV DS,AX
STACT_PROG:     ;   스텍 프롤로그 과정------STACT_PROG IN MAIN
 PUSH BP
 MOV SP,BP    
 SUB SP,20
 
DAN_SU_SETTING:   ;   수의 입력-----------DAN_SU_SETTING IN MAIN
 MOV AH,01h
 INT 21h
 
 CMP AL,'A'    ;   A이면 종료
 JE ENDCODE
 
 MOV DAN,AL    ;   입력받은 수를 단에 저장
 MOV BL,31h
 
 CALL DOWN     ;   개행하는 프로시져 호출
 MOV CX,9     ;   카운터 9로 초기화
 
GUGUDAN:;--------------------------------------------GUGUDAN IN MAIN
 MOV DL,DAN    ;   단을 출력
 MOV AH,02h
 INT 21h
 CALL SPACE    ;   개행 프로시져 호출
 MOV DL,'*'    ;   별을 출력
 MOV AH,02h
 INT 21h
 CALL SPACE
 
 MOV DL,BL     ;   수를 출력
 MOV AH,02h
 INT 21h
 CALL SPACE
  
  MOV DL,'='    ;   =을 출력
  MOV AH,02h
  INT 21h
 
 CALL SPACE
 
 CALL REMUL    ;   결과값 프로시져 호출
 CALL DOWN   
 
 ADD BL,1     ;   수를 1 증가
 LOOP GUGUDAN   ;   카운터 만큼 루프
 
 JMP DAN_SU_SETTING
ENDCODE:;--------------------------------------------ENDCODE IN MAIN
 MOV AH,4Ch
 INT 21h
MAIN ENDP
;------------------------------MAIN END----------------------------
;-------------------------------SPACE------------------------------
SPACE PROC NEAR   ;   한칸띄우는 프로시져
 MOV DL,' '
 MOV AH,02h
 INT 21h
 RET
SPACE ENDP
;----------------------------SPACE END-----------------------------
;------------------------------REMUL------------------------------- 
REMUL PROC NEAR
 MOV DX,0000h   ;   초기화
 PUSH DX      ;   마지막 pop를 알기위해 저장
 MOV DL,DAN    ;   단을 DL에 저장
 MOV AL,BL     ;   수를 AL에 저장
 SUB DL,30h    ;   정수화
 SUB AL,30h    ;   정수화
 MUL DL      ;   곱하기
ITOA: ;-----------------------------------------------ITOA IN REMUL
 DIV DIVSU     ;   10으로 AL을 나눔
 MOV DL,AH     ;   나머지를 DL로 이동
 ADD DL,30h    ;   정수형을 아스키화시킴
 MOV DH,00h    ;   상위 8비트 초기화
 MOV AH,00h    ;   상위 8비트 초기화
 PUSH DX      ;   스텍에 저장
 CMP AL,00h    ;   비교하여 더이상 나눌것이 있냐?
 JE PRINT_SU    ;   없으면 출력문으로
 JMP ITOA     ;   있으면 다시 ITOA 레이블로
 
PRINT_SU:;-----------------------------------------PRINT_SU IN REMUL
 POP DX;      ;   저장된것을 가져옴
 CMP DL,00h    ;   비교,더이상 출력할것이 있냐?
 JE ENDCODE    ;   없으면 종료
 
 MOV AH,02h    ;   있으면 출력
 INT 21h
 
 JMP PRINT_SU
ENDCODE:  ;---------------------------------------ENDCODE IN REMUL
 RET 
REMUL ENDP
;------------------------------REMUL END---------------------------
;--------------------------------DOWN------------------------------
DOWN PROC NEAR   ;   줄바꿈 프로시져
 MOV DL,0Ah
  MOV AH,02h
  INT 21h
  MOV DL,0Dh
  MOV AH,02h
  INT 21h
  RET
DOWN ENDP
;-------------------------------DOWN END---------------------------
CODE ENDS;################################################CODE ENDS
DATA SEGMENT PARA 'data';################################DATA START
DAN DB 1 DUP(?)   ;   단을 저장
DIVSU DB 10     ;   나누기위한 10 저장
DATA ENDS;################################################DATA ENDS
 END
Posted by Nvdark
,

어셈으로 계산기를 만들었던소스.

MASM으로 만들었습니다.

소스수정 전혀 안되있습니다. ㅋㅋㅋㅋ

보기가 살짝 불편하고 불필요한코드가 약간(?) 있습니다. ;; 귀찮아서 ㅡ_ㅡ;



이거 하면서 ATOI,ITOA 를 어떻게 하면좋을까하다가 전 보시는 봐와같이했구요;;

모 다른분들도 이렇게 하셨을꺼라 생각합니다. 이거짜면서 혼자 머리쥐어짜고있었어요 ;;


그리고 레지스터 크기상 일정크기이상은 계산이 안되더군요;;

예를들면 전 EAX를 쓴게 아니고 AX만을 사용하여서...계산범위의 한계가있습니다.

물론 저의 독단적인 생각이니 ...틀렸다고 모라하지마시길;;

Posted by Nvdark
,