微机原理与接口技术作业,通过测试,分享一下
;2.编写一中断服务程序,中断类型号取76H,中断服务程序完成将AL和BL中存放的非压缩型BCD码相加,并将相加结果在屏幕上显示出来。
;先开辟存放两个非压缩性BCD码的DB类型的数据区 DATA,进入程序再读进来
DATASEG SEGMENT
DATA DB 06H,09H
OBUF DB 06H DUP (?) ;
DATASEG ENDS
STACKSEG SEGMENT stack
StatckSeg DW 40 DUP(?)
StackTop EQU LENGTH StatckSeg
STACKSEG ENDS
CODESEG SEGMENT
ASSUME CS : CODESEG, DS : DATASEG
START:
;macro template
;brief : load specified interrupt address
;note : in this version MACRO , interrupt num must pass by register
;date : 2013/12/03
;author: @brt
INTERRUPT_ADDR MACRO InterruptNum,InterruptProcName
PUSH DS
PUSH AX
PUSH BX
MOV AX, 00H
MOV DS, AX
MOV AX, 04H
MUL InterruptNum
MOV BX, AX
MOV WORD PTR DS:[BX] , OFFSET InterruptProcName
MOV WORD PTR DS:[BX+02H], SEG InterruptProcName
POP BX
POP AX
POP DS
ENDM
MAIN PROC FAR
MOV AX, STACKSEG
MOV SS, AX
MOV AX, StackTop ; copy stack pointer top SP
MOV SP, AX
PUSH DS
MOV AX, 00H
PUSH AX
MOV AX, DATASEG
MOV DS, AX
MOV CL, 76H
INTERRUPT_ADDR CL,INT_76H
INT 76H
CALL DISP_NUM
RET
MAIN ENDP
INT_76H PROC FAR
PUSH BX
PUSH SI
MOV SI, OFFSET DATA
MOV AL, BYTE PTR[SI]
INC SI
MOV BL, BYTE PTR[SI]
ADD AL, BL
MOV AH, 00H
POP SI
POP BX
IRET
INT_76H ENDP
;sub-process template
;brief : dispay the value of AX,AX = ((DX):(AX)) / 10; DX = ((DX):(AX)) % 10
;note : only display 16 bit width number,you can modify defined OBUF variable bit width according to your need
;date : 2013/11/26
;author: @brt
DISP_NUM PROC NEAR
MOV BX, OFFSET OBUF+6-1
MOV BYTE PTR [BX],'$'
MOV CX, 0AH ;
LOOP_NUM: ;just like do{....}while(ax != 0)
MOV DX, 00H
DIV CX
ADD DL, 30H ;number value convert to ASCII
DEC BX
MOV [BX], DL
OR AX, AX
JNZ LOOP_NUM ;check AX is 0
MOV DX, BX ;BX : start index of number
MOV AH, 09H
INT 21H
RET
DISP_NUM ENDP
CODESEG ENDS
END START