[HELP] Về viết chương trình dùng hợp ngữ máy tính

Thảo luận trong 'Lập trình & Đồ hoạ' bắt đầu bởi bi_kute199, 12/12/08.

  1. bi_kute199

    bi_kute199 Dragon Quest

    Tham gia ngày:
    13/4/08
    Bài viết:
    1,275
    Nơi ở:
    Vozforums
    Mình học ngành CNTT,chìu ay ông thầy bắt làm viết 1 chương trình làm hiện ngày giờ,thời gian của hệ thống máy tính bằng ngôn ngữ Exemlơ ( chã bít viết đúng ko) ai biết thì có thể help mình ko ::(
     
  2. backstaber

    backstaber Mario & Luigi

    Tham gia ngày:
    24/11/06
    Bài viết:
    846
    Nơi ở:
    dev/null
    Mã:
    Clock
    
    CGROUP	 GROUP VECTOR,CODESEG
    VECTOR	 SEGMENT AT 0H
    	 DB    6CH DUP(?)	    ;FILLER
    TIME_LO  DW    ?		    ;DOS TIME
    TIME_HI  DW    ?		    ;DOS TIME
    VEC_IP	 DW			    ;CLOCK UPDATE VECTOR IP
    VEC_CS	 DW			    ;CLOCK UPDATE VECTOR CS
    VECTOR	 ENDS
    
    CODESEG  SEGMENT PARA
    	 ASSUME CS:CODESEG,DS:CGROUP
    	 ORG   100H
    CLK	 PROC  FAR
    	 JMP   SETUP		    ;ATTACH TO DOS
    INTRPT	 LABEL DWORD
    INT_IP	 DW    0		    ;OLD UPDATE VECTOR IP
    INT_CS	 DW    0		    ;OLD UPDATE VECROR CS
    TICKS	 DW    0		    ;TICK COUNTER
    SCR_OFF  DB    0,0		    ;SCREEN OFFSET IN BUFFER
    CRT_PORT DW    0		    ;SCREEN STATUS PORT
    flag	 db    0
    TIME	 DB    8 DUP(':',0BH)       ;TIME SAVE AREA
    CLK_INT  LABEL NEAR
    	 PUSH  AX		    ;SAVE REGISTERS
    	 PUSH  CX
    	 PUSH  DI
    	 PUSH  SI
    	 PUSH  DS
    	 PUSH  ES
    	 PUSHF			    ; AND FLAGS
    	 CALL  CS:[INTRPT]	    ;DO OLD UPDATE INTERRUPT
    	 MOV   CX,0040H 	    ;GET SEGMENT OF DOS TABLE
    	 MOV   DS,CX		    ;PUT IN DS
    	 MOV   CX,CS:TICKS	    ;GET TICK COUNT
    	 INC   CX		    ;INCREMENT IT
    	 CMP   CX,20	    ;01F4H	       ;HAS A MINUTE GONE BY?
    	 JB    NO_MINUTE	    ;NO, MOVE ON
    	 CALL  UPDATE		    ;YES, UPDATE CLOCK AND
    	 MOV   CX,0		    ; RESET TICK COUNTER
    NO_MINUTE:
    	 MOV   CS:TICKS,CX	    ;SAVE UPDATED TICK COUNT
    	 MOV   CX,0B000H	    ;GET VIDEO SEGMENT
    	 MOV   ES,CX		    ;PUT IN ES
    	 MOV   DX,CS:CRT_PORT	    ;GET CRT STATUS PORT ADDR
    	 MOV   DI,WORD PTR CS:SCR_OFF  ;GET SCREEN BUFFER OFFSET
    	 LEA   SI,CS:TIME	    ;GET DOS TIME
    	 MOV   CX,16		    ;SET UP TO MOVE 10 BYTES
    	 CLI			    ;DISABLE OTHER INTERRUPTS
    WAIT1:	 IN    AL,DX		    ;READ CRT STATUS
    	 TEST  AL,1		    ;CHECK FOR VERTICAL RETRACE
    	 JNZ   WAIT1		    ;WAIT FOR RETRACE LOW
    	 MOV   AH,CS:[SI]	    ;GET FIRST BYTE TO MOVE
    WAIT2:	 IN    AL,DX		    ;GET CRT STATUS
    	 TEST  AL,1		    ;CHECK FOR VERTICAL RETRACE
    	 JZ    WAIT2		    ;WAIT FOR RETRACE HIGH
    	 MOV   ES:[DI],AH	    ;MOVE BYTE TO SCREEN
    	 INC   DI		    ;INCREMENT INDEX
    	 INC   SI
    	 LOOP  WAIT1		    ;MOVE NEXT BYTE
    	 STI			    ;ENABLE INTERRUPTS
    	 POP   ES		    ;RESTORE REGISTERS
    	 POP   DS
    	 POP   SI
    	 POP   DI
    	 POP   CX
    	 POP   AX
    	 IRET			    ;RETURN FROM INTERRUPT
    CLK	 ENDP
    UPDATE	 PROC  NEAR
    	 PUSH  AX		    ;SAVE REGISTERS
    	 PUSH  BX
    	 PUSH  CX
    	 PUSH  DX
    	 PUSH  DS
    	 MOV   AX,0040H 	    ;GET ADDRESS OF DOS TABLE
    	 MOV   DS,AX		    ;PUT IN DS
    	 MOV   AX,TIME_HI	    ;GET HIGH BYTE OF DOS TIME
    	 mov   flag,0		    ;am flag
    HOUR:	 CMP   AX,0CH		    ;CONVERT TO HOURS
    	 JLE   H1
    	 mov   flag,1		    ;set to pm
    	 SUB   AX,0CH
    	 JMP   HOUR
    H1:	 AAM			    ;CONVERT TO ASCII
    	 ADD   AX,3030H
    	 LEA   BX,CS:TIME	    ;GET ADDRESS OF TIME AREA
    	 MOV   CS:[BX],AH	    ;SAVE HOURS FIRST DIGIT
    	 MOV   CS:[BX+2],AL	    ;SAVE HOURS SECOND DIGIT
    	 MOV   AX,TIME_LO	    ;GET DOS TIME LOW BYTE
    	 MOV   CX,8H		    ;CONVERT TO MINUTES
    	 SHR   AX,CL
    	 MOV   DX,3CH
    	 MUL   DL
    	 SHR   AX,CL
    	 AAM			    ;CONVERT TO ASCII
    	 ADD   AX,3030H
    	 MOV   CS:[BX+6],AH	    ;SAVE MINUTES FIRST DIGIT
    	 MOV   CS:[BX+8],AL	    ;SAVE MINUTES SECOND DIGIT
    	 mov   byte ptr cs:[bx+12],'a'
    	 cmp   flag,0		    ;is it am?
    	 jz    goahead
    	 mov   byte ptr cs:[bx+12],'p'
    goahead:
    	 mov   byte ptr cs:[bx+14],'m'
    	 POP   DS		    ;RESTORE REGISTERS
    	 POP   DX
    	 POP   CX
    	 POP   BX
    	 POP   AX
    	 RET
    UPDATE	 ENDP
    SETUP:	 MOV   AX,0		    ;GET ADDRESS OF VECTOR TABLE
    	 MOV   DS,AX		    ;PUT IN DS
    	 CLI			    ;DISABLE FURTHER INTERRUPTS
    	 MOV   AX,[VEC_IP]	    ;GET ADDRESS OF OLD UPDATE IP
    	 MOV   CS:[INT_IP],AX	    ;SAVE IT
    	 MOV   AX,[VEC_CS]	    ;GET ADDRESS OF OLD UPDATE CS
    	 MOV   CS:[INT_CS],AX	    ;SAVE IT
    	 MOV   VEC_IP,OFFSET CLK_INT ;PUT ADDRESS OF CLK IN VECTOR IP
    	 MOV   VEC_CS,CS	    ;PUT CS OF CLK IN VECTOR CS
    	 STI			    ;ENABLE INTERRUPTS
    	 MOV   AH,0FH		    ;READ VIDEO STATUS
    	 INT   10H
    	 SUB   AH,8		    ;SUBTRACT 8 CHAR TIME FROM NCOLS
    	 SHL   AH,1		    ;MULTIPLY BY 2 FOR ATTRIBUTE
    	 MOV   CS:SCR_OFF,AH	    ;SAVE SCREEN TIME LOCATION
    	 MOV   WORD PTR CS:CRT_PORT,03BAH  ;SAVE MONO STATUS PORT ADDR
    	 TEST  AL,4		    ;CHECK FOR COLOR MONITOR
    	 JNZ   MONO		    ;IF MONO, MOVE ON
    	 ADD   WORD PTR CS:SCR_OFF,8000H   ;ADD COLOR OFFSET TO TIME OFFSET
    	 MOV   WORD PTR CS:CRT_PORT,03DAH  ;SAVE COLOR STATUS PORT ADDR
    MONO:	 CALL  UPDATE		    ;DO FIRST UPDATE & PRINT TIME
    	 MOV   DX,OFFSET SETUP	    ;GET END ADDRESS OF NEW INTERRUPT
    	 INT   27H		    ;TERMINATE AND REMAIN RESIDENT
    	 DB    117 DUP(0)	    ;FILLER
    CODESEG  ENDS
    	 END   CLK
    
    thử cái đó xem. tóm dc ở trang: http://www.assembly.happycodings.com/code24.html
    chắc bác biết biên dịch chứ :-S
     
  3. bi_kute199

    bi_kute199 Dragon Quest

    Tham gia ngày:
    13/4/08
    Bài viết:
    1,275
    Nơi ở:
    Vozforums
    ai help mình với hi hic hic hic hic hic
     

Chia sẻ trang này