汇编实验(中断及应用)

自定义中断,用中断来算算术

自定义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

输数字,出字母

输入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

汇编实验中断2

猜你喜欢

转载自blog.csdn.net/weixin_44169557/article/details/106853437