文章目录
自定义中断,用中断来算算术
自定义79h号中断,在中断被调用时,可以将(ah)和(al)中的两个数按(bl)中提供的运算符(’+‘或’-’)计算,其结果由(ah)返回。编程序实现该中断并将其安装到0:200H。例如,(ah)=5,(al)=3,(bl)=’+‘时,(ah)=8;(ah)=5,(al)=3,(bl)=’-’ 时,(ah)=2。
定义并安装中断例程的代码为(加入足量注释):
assume cs:code, ss:stack
stack segment stack
db 16 dup(0)
stack ends
code segment
start:
;-----------------------------
; 1.安装中断例程
; 2.设置中断向量表
;-----------------------------
;将自定义的79h号中断的中断例程安装到 0:200
mov ax,cs
mov ds,ax
lea si,do79h
mov ax,0
mov es,ax
mov di,200h
mov cx,offset do79h_end - offset do79h
cld
rep movsb ;指令movsb 源ds:si, 目标es:di
;设置79h号中断的中断向量表
mov word ptr es:[79h*4],200h
mov word ptr es:[79h*4+2],0
mov ax,4c00h
int 21h
;--------------------------------------------------
; 自定义的79h号中断的中断例程:
; 入口参数:ah, al, bl
; 出口参数:ah
; 功能:按(bl)中提供的运算符('+'或'-')计算ah和al
;--------------------------------------------------
do79h:
cmp bl,'+'
je add2
sub ah,al ;减法
jmp over
add2:
add ah,al ;加法
over:
iret
do79h_end:
nop
code ends
end start
给出下面的数据区定义,利用前面定义的中断79h,完成对10个“算式”的求解,其结果存放在?处。
datasg segment
db 8, '+', 9, ?
db 9, '-', 1, ?
db 2, '+', 3, ?
db 7, '-', 5, ?
db 4, '-', 2, ?
db 8, '+', 1, ?
db 5, '+', 6, ?
db 13,'-', 7, ?
db 8, '+', 4, ?
db 8, '-', 2, ?
datasg ends
调用中断解决问题的程序为(加入足量注释):
assume cs:code, ds:datasg, ss:stack
datasg segment
db 8, '+', 9, ?
db 9, '-', 1, ?
db 2, '+', 3, ?
db 7, '-', 5, ?
db 4, '-', 2, ?
db 8, '+', 1, ?
db 5, '+', 6, ?
db 13,'-', 7, ?
db 8, '+', 4, ?
db 8, '-', 2, ?
datasg ends
stack segment stack
db 16 dup (0)
stack ends
code segment
start:
mov ax, datasg
mov ds, ax
mov ax, stack
mov ss, ax
mov sp, 16h
mov cx, 10
mov si, 0
s: mov ah, [si] ;取第一个操作数
mov al, [si+2] ;取第二个操作数
mov bl, [si+1] ;取操作符
int 79h ;调用79h号中断
mov [si+3], ah ;保存答案
add si, 4 ;指向下一个算式
loop s
mov ax,4c00h
int 21h
code ends
end start
输数字,出字母
输入1-9的数字,以其作为序号,输出对应的字母。例如,输入1,输出a;而输入4,输出d
assume cs:code, ds:datasg
code segment
char db 'abcdefghi' ;1~9
start:
mov ah, 01h ;INT21H 01h--从标准输入设备输入字符并回显
int 21h ;出口参数:AL=输入字符的 ASCII 码
dec al
sub al, 48 ;ASCII码值转数字
mov ah, 0
mov bx, offset char ;字符偏移地址
add bx, ax
mov dl,cs:[bx]
mov ah,02h ;INT21H 02--字符输出
int 21h ;入口参数:AH=02h, DL=待输出字符的 ASCII 码
mov ax, 4c00h
int 21h
code ends
end start
操作文件
将程序补充完整,将text指向的三行文本保存到文件中去。
assume cs:code, ds:data, ss:stack
stack segment stack
db 100H dup (?)
stack ends
data segment
filename db 'aa.txt', 0
text db 'I am so happy!', 10, 13 ;10,13的ASCII值是回车和换行
db 'I can write message to a file!', 10, 13
db 'oh, so sweat.'
handle dw ?
data ends
code segment
start:
mov ax, data
mov ds, ax
;创建文件--用21h中断的3ch功能(快查手册,看怎么用)
lea dx, filename ;DS:DX指定文件名字符串的地址
mov cx, 0 ;文件属性
mov ah, 3ch ;创建新文件
int 21h
;利用出口参数判断是否成功,若成功,则保存句柄到handle(1个标识文件的16位数)
jc stop ;CF=1 创建失败 退出
mov handle, ax ;保存文件句柄
;向文件中写入文本--用21h中断的40h功能
mov bx, handle ;文件句柄
mov cx, offset handle - offset text ;字节数
lea dx, text ;存放数据的缓冲区地址
mov ah, 40h
int 21h
;利用出口参数判断是否成功,失败则退出
jc stop
;关闭文件--用21h中断的3eh功能
mov bx, handle ;文件句柄
mov ah, 3fh
int 21h
stop:
mov ah, 4ch
int 21h
code ends
end start