code ends end start
四. 实验结果(包括必要的截图) 第一题:
第二题:
第三题:
五. 实验体会
1.汇编没有易用的IO模块,在处理IO时应采用缓存方法。
2.函数可以通过栈传参数,但在调用函数前后要维持堆栈平衡。
实验四 宏与中断程序设计
一. 实验目的
1、汇编语言宏程序设计;
2、掌握中断服务子程序的编写。
二. 实验内容
1、编写一个宏,求三个数的最小数,原型为:MIN3 x,y,z,min 2、挂接1CH中断,正计时60秒后退出。要求屏幕显示0-59的秒数。 3、VC++中编写内联汇编,将字节数组的每个元素高低四位互换。 char dbyte[] = {0x34,0x45,0x56,0x67,0xaf};
三. 实验过程和程序 第一题:
MIN3 macro x, y, z, min local L1, L2 第二题:
INTNO EQU 1CH
DATA SEGMENT
OLDISR DW ?,? ; 记录原来的中断向量 TIMER DB 100
COUNTER DW 60 ; 60秒 ISDONE DB 0
; 标记,1 表示结束
push ax mov ax, x cmp ax, y jb L1 mov ax, y jb L2 mov ax, z pop ax
L1: cmp ax, z
L2: mov min, ax endm
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA START:
;WAIT HERE WAITHERE: CMP ISDONE,1 JNZ WAITHERE
EXIT: ;RESTORE
; 恢复中断向量表 CLI MOV AX,DATA MOV DS,AX MOV AX,0 MOV ES,AX ;PROTECT
; 保存 1CH 原有的中断向量 CLI
MOV AX, ES:[INTNO*4] MOV OLDISR[0],AX MOV AX,ES:[INTNO*4+2] MOV OLDISR[2], AX STI
;SET NEW ISR
; 挂接自己的中断过程 CLI
MOV WORD PTR ES:[INTNO*4], OFFSET ISR MOV WORD PTR ES:[INTNO*4+2],SEG ISR STI
MOV AX,OLDISR[0] MOV ES:[INTNO*4],AX MOV AX,OLDISR[2] MOV ES:[INTNO*4+2],AX STI
; 程序结束 MOV AX,4C00H INT 21H
ISR PROC FAR PUSH DX PUSH AX
MOV AX,DATA MOV DS,AX STI ; 便于中断嵌套 ;COUNT HERE INC TIMER
AGAIN:
CMP TIMER, 1000/55 ;18 JB DONE MOV TIMER,0 ;carriage MOV AH,2 MOV DL,13 INT 21H ;print time mov dx, COUNTER mov ax, 60 sub ax, dx
; MOV AX,COUNTER