贺利坚老师汇编实验报告7

任务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

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值