任务1-自定义中断,用中断来算算术
(1)自定义79h号中断,在中断被调用时,可以将(ah)和(al)中的两个数按(bl)中提供的运算符('+'或'-')计算,其结果由(ah)返回。编程序实现该中断并将其安装到0:200H。例如,(ah)=5,(al)=3,(bl)='+'时,(ah)=8;(ah)=5,(al)=3,(bl)='-' 时,(ah)=2。
定义并安装中断例程的代码为(加入足量注释):
assume cs:code code segment start: ;将自定义的79h号中断的中断例程安装到0:200 mov ax,cs mov ds,ax mov ax,0 mov es,ax lea si, do_79h mov di,200h mov cx,offset do79h_end - offset do_79h cld rep movsb ;设置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)返回。 do_79h: push bx cmp bl,'+' je add_ab sub ah,al jmp return add_ab: add ah,al return: pop bx iret do79h_end:nop code ends end start
(2)运行下面的程序,利用自定义的79h中断解决问题
assume cs:code, ss:stack
stack segment stack
db 16 dup (0)
stack ends
code segment
start:
mov ah, 5
mov al, 3
mov bl, '+'
int 79h
;单步运行程序到此观察结果
mov ax,4c00h
int 21h
code ends
end start
测试中断正常调用,运行截图如下:
(3)给出下面的数据区定义,利用前面定义的中断79h,完成对10个“算式”的求解,其结果存放在?处。
assume ds:datasg,cs:code, 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 .repeat mov ah,[si] mov al,[si+2] mov bl,[si+1] int 79h mov [si+3],ah add si,4 .untilcxz mov ax,4c00h int 21h code ends end start
任务2-输数字,出字母
输入1-9的数字,以其作为序号,输出对应的字母。例如,输入1,输出a;而输入4,输出d
assume cs:code code segment alpha db 'abcdefghi' start: mov ah,1 int 21h ;External input. dec al ;Because a corresponds to 1, it is reduced by one. sub al,48 ;Into numbers. mov bl,al mov bh,0 mov ah,02h mov dl,0ah int 21h ;Newline output mov dl,cs:[bx] mov ah,2 int 21h ;Output dl. mov ah,4ch int 21h code ends end start
任务3-用中断输入并显示
利用BIOS系统功能调用,将键盘输入的小写字母转换成大写字母后输出显示,输入非小写字母时,什么也不显示,等待其他输入;输入‘$’字符时结束。
assume cs:code code segment start: mov ah,0 int 16h ;keyboard input. cmp al,'$' je exit cmp al,'a' jb start ;Unsigned less than jumps. cmp al,'z' ja start ;Unsigned greater than jumps. sub al,32 ;Changed to uppercase letters. mov dl,al mov ah,2 int 21h ;Screen output. jmp start exit: mov ah,4ch int 21h code ends end start
任务4-操作文件(选做)
将程序补充完整,将text指向的三行文本保存到文件中去。
assume cs:code, ds:data; ss:stack stack segment db 100H dup (?) stack ends data segment filename db 'a.txt',0 text db 'I am so happy!', 10,13 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功能(快查手册,看怎么用) mov cx,0 lea dx,filename ;ds:dx指定文件名字符串的地址 mov ah,3ch ;功能是创建文件 int 21h ;利用出口参数判断是否成功,若成功,则保存句柄(1个标识文件的16位数) jc stop ;创建失败cf=1退出 mov handle,ax ;句柄ax保存 ;向文件中写入文本——用21h中断的40h功能 mov bx,handle mov cx,offset handle-offset text ;写入字节数 lea dx,text ;ds:dx存放数据缓冲区地址 mov ah,40h ;功能向文件中写字节 int 21h ;利用出口参数判断是否成功,失败则退出 jc stop ;读入失败 ;关闭文件——用21h中断的3eh功能 mov bx,handle ;文件句柄 mov ah,3eh ;功能关闭文件 int 21h stop: mov ah,4ch int 21h code ends end start