鱼C论坛

 找回密码
 立即注册
查看: 2438|回复: 2

[汇编作业] 实验 16 编写包含多个功能子程序的中断例程

[复制链接]
发表于 2019-4-12 01:46:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 奥普瓯江 于 2019-4-12 01:46 编辑

安装一个新的int 7ch中断例程, 为显示输出提供如下功能子程序。
(1)清屏;
(2)设置前景色
(3)设置背景色
        入口参数说明如下。
        (1)用ah寄存器传递功能号:0表示清屏,1表示设置前景色, 2表示设置背景色,3表示向上滚动一行;
        (2)对于2、3号功能,用al传送颜色值,(al) {0, 1, 2, 3, 4, 5, 6, 7}。



这个是我自己编写的,如果用直接定址表会出现定位不准,因为int 7ch是经过编译后再装载到0000:0200内存中的在内存中他不会在此从新定义储存的地址所以容易出错

  1. assume cs:code

  2. code segment
  3. start:
  4.                 mov ax, cs
  5.                 mov ds, ax
  6.                 mov si, offset input
  7.                
  8.                 mov ax, 0h
  9.                 mov es, ax
  10.                 mov di, 0200h
  11.                
  12.                 mov cx, offset end_1 - offset input
  13.                
  14.                 cld
  15.                 rep movsb
  16.                
  17.                 cli
  18.                 mov word ptr es:[7ch * 4 ], 0200h
  19.                 mov word ptr es:[7ch * 4 + 2], 0h
  20.                 sti
  21.                
  22.                 mov ax, 4c00h
  23.                 int 21h
  24.                
  25. input:
  26.                 jmp short input_1
  27.                 db 'ni shu ru de xin xi you wu', 0
  28. input_1:
  29.                 push ax
  30.                 push bx
  31.                 push ds
  32.                 push es
  33.                 push cx
  34.                 push di
  35. option_1:

  36.                 mov bh, ah
  37.                 mov bl, al
  38.                
  39.                 mov ax, 0b800h
  40.                 mov es, ax
  41.                 mov di, 0
  42.                 mov si, 0
  43.                 mov cx, 2000
  44.                
  45.                 cmp bh, 0
  46.                 jna        item5
  47.                
  48.                 cmp bh, 4
  49.                 ja item5
  50.                
  51.                 cmp bh, 1
  52.                 je item1
  53.                
  54.                 cmp bh, 2
  55.                 je item2
  56.                
  57.                 cmp bh, 3
  58.                 je item3
  59.                
  60.                 cmp bh, 4
  61.                 je item4
  62. end_ok:
  63.                 pop di
  64.                 pop cx
  65.                 pop es
  66.                 pop ds
  67.                 pop bx
  68.                 pop ax
  69.                 iret
  70. ;清屏
  71. item1:
  72.                 mov byte ptr es:[di], ' '
  73.                 add di, 2
  74.                 loop item1
  75.                
  76.                 mov ah, 2  ;调整光标位置
  77.                 mov bh, 0  ;光标所在第几页 一共有6页
  78.                 mov dh, 0  ;光标所在第几行 一页有25行
  79.                 mov dl, 0  ;每页有160个字节80个字每个字包含一个数据字节一个属性字节
  80.                 int 10h           ;十号中断
  81.                 jmp short end_ok
  82.                
  83.                
  84. ;设置前景色
  85. item2:
  86.                 mov byte ptr es:[di + 1], bl
  87.                 add di, 2
  88.                 loop item2
  89.                
  90.                 jmp short end_ok
  91.                
  92. ;设置背景色
  93. item3:
  94.                 mov byte ptr es:[di + 1], bl
  95.                 add di, 2
  96.                 loop item3
  97.                
  98.                 jmp short end_ok
  99. ;向上滚动一行
  100. item4:
  101.                 mov ds, ax
  102.                 mov si, 160
  103.                
  104.                 cld
  105.                 rep movsw
  106.                
  107.                 mov cx, 160
  108. good:
  109.                 mov di, 4000 - 160
  110.                 mov byte ptr es:[di], ' '
  111.                 add di, 2
  112.                 loop good
  113.                
  114.                 jmp short end_ok
  115. ;错误信息提示
  116. item5:       
  117.                 mov al, byte ptr cs:[si + 202h]
  118.                 cmp al, 0
  119.                 je item5_2
  120.                 mov byte ptr es:[di + 1620], al
  121.                 mov byte ptr es:[di + 1620 + 1], bl
  122.                 inc si
  123.                 add di, 2
  124.                
  125.                 jmp short item5
  126. item5_2:
  127.                 jmp  end_ok
  128. end_1:
  129.                 nop

  130. code ends
  131. end start
  132.                
复制代码


下面是我用《直接定址表》的思路编写的这个程序我这个程序是从1开始输出到4,但是这种方法可能到别的程序中会不好用因为我是直接找的地址在一个一个把他们加到相应的数据段中
  1. assume cs:code

  2. code segment
  3. start:
  4.                 mov ax, cs
  5.                 mov ds, ax
  6.                 mov si, offset input
  7.                
  8.                 mov ax, 0h
  9.                 mov es, ax
  10.                 mov di, 0200h
  11.                
  12.                 mov cx, offset end_1 - offset input
  13.                
  14.                 cld
  15.                 rep movsb
  16.                
  17.                 cli
  18.                 mov word ptr es:[7ch * 4 ], 0200h
  19.                 mov word ptr es:[7ch * 4 + 2], 0h
  20.                 sti
  21.                
  22.                 mov ax, 4c00h
  23.                 int 21h
  24.                
  25. input:
  26.                 jmp short option_1
  27.                 dw item1 + 01d6h , item2 + 01d6h, item3 + 01d6h, item4 + 01e1h, 0  ;该地址是我用debug找到他在编译的时候相应的地址,加上相应的数据等于他在0000:0200中储存的地址再用call跳转过去
  28.                 ;在masm编译中item标记本身也是有数据的item1=005f、item2=0073、item3=007e、item4=0089
  29.                 ;item1中的数据005fh+01d6h就等于第一个标记的偏移地址0000:0235
  30. option_1:       
  31.                 push ax
  32.                 push bx
  33.                 push ds
  34.                 push es
  35.                 push cx
  36.                 push di

  37.                 mov ah, 2
  38.                 mul ah
  39.                 mov ah, 0
  40.                 sub al, 2
  41.                
  42.                 mov bl, al
  43.                 mov bh, 0
  44.                
  45.                 mov ax, 0b800h
  46.                 mov es, ax
  47.                 mov di, 0
  48.                 mov cx, 2000
  49.                
  50.                 call word ptr cs:[bx + 202h]
  51.                
  52.                 pop di
  53.                 pop cx
  54.                 pop es
  55.                 pop ds
  56.                 pop bx
  57.                 pop ax
  58.                 iret
  59.                
  60. ;清屏
  61. item1:    ;在我的系统中他的地址是0000:0235
  62.                 mov byte ptr es:[di], ' '
  63.                 add di, 2
  64.                 loop item1
  65.                
  66.                 mov ah, 2  ;调整光标位置
  67.                 mov bh, 0  ;光标所在第几页 一共有6页
  68.                 mov dh, 0  ;光标所在第几行 一页有25行
  69.                 mov dl, 0  ;每页有160个字节80个字每个字包含一个数据字节一个属性字节
  70.                 int 10h           ;十号中断
  71.                 ret
  72. ;设置前景色
  73. item2:    ;他的地址0000:0249
  74.                 mov byte ptr es:[di + 1], 2
  75.                 add di, 2
  76.                 loop item2
  77.                 ret
  78.                
  79. ;设置背景色
  80. item3:                ;他的地址0000:0254
  81.                 mov byte ptr es:[di + 1], 01100000b
  82.                 add di, 2
  83.                 loop item3
  84.                 ret
  85. ;向上滚动一行
  86. item4:                        ;他的地址0000:026a
  87.                 mov ds, ax
  88.                 mov si, 160
  89.                
  90.                 cld
  91.                 rep movsw
  92.                
  93.                 mov cx, 160
  94. good:
  95.                 mov di, 4000 - 160
  96.                 mov byte ptr es:[di], ' '
  97.                 add di, 2
  98.                 loop good
  99.                 ret
  100. end_1:
  101.                 nop

  102. code ends
  103. end start
  104.                
复制代码


下面的代码是我用视频中的思路写出的程序该程序执行不了会产生错误具体原因我会在下面说明
  1. assume cs:code

  2. code segment
  3. start:
  4.                 mov ax, cs
  5.                 mov ds, ax
  6.                 mov si, offset input
  7.                
  8.                 mov ax, 0h
  9.                 mov es, ax
  10.                 mov di, 0200h
  11.                
  12.                 mov cx, offset end_1 - offset input
  13.                
  14.                 cld
  15.                 rep movsb
  16.                
  17.                 cli
  18.                 mov word ptr es:[7ch * 4 ], 0200h
  19.                 mov word ptr es:[7ch * 4 + 2], 0h
  20.                 sti
  21.                
  22.                 mov ax, 4c00h
  23.                 int 21h
  24.                
  25. input:
  26.                 jmp short option_1
  27.                 data dw item1, tem2, item3, item4, 0  
  28.                 ;这里会出现一个很大的问题就是这里所记录的地址信息是06.asm经过masm编译的但是我们现在把他储存在了0000:0200这个数据段之后所以现在item1中储存的地址信息应是以
  29.                 ;段地址为0000偏移地址为0200之后的地址,但是他已经被储存在了内存中不会再次经过编译所以执行的时候跳转的地址会出现错误具体原因我会在下面给出解释
  30. option_1:       
  31.                 push ax
  32.                 push bx
  33.                 push ds
  34.                 push es
  35.                 push cx
  36.                 push di

  37.                 mov ah, 2
  38.                 mul ah
  39.                 mov ah, 0
  40.                 sub al, 2
  41.                
  42.                 mov bl, al
  43.                 mov bh, 0
  44.                
  45.                 mov ax, 0b800h
  46.                 mov es, ax
  47.                 mov di, 0
  48.                 mov cx, 2000
  49.                
  50.                 call word ptr data[bx]
  51.                
  52.                 pop di
  53.                 pop cx
  54.                 pop es
  55.                 pop ds
  56.                 pop bx
  57.                 pop ax
  58.                 iret
  59.                
  60. ;清屏
  61. item1:
  62.                 mov byte ptr es:[di], ' '
  63.                 add di, 2
  64.                 loop item1
  65.                
  66.                 mov ah, 2  ;调整光标位置
  67.                 mov bh, 0  ;光标所在第几页 一共有6页
  68.                 mov dh, 0  ;光标所在第几行 一页有25行
  69.                 mov dl, 0  ;每页有160个字节80个字每个字包含一个数据字节一个属性字节
  70.                 int 10h           ;十号中断
  71.                 ret
  72. ;设置前景色
  73. item2:   
  74.                 mov byte ptr es:[di + 1], 2
  75.                 add di, 2
  76.                 loop item2
  77.                 ret
  78.                
  79. ;设置背景色
  80. item3:               
  81.                 mov byte ptr es:[di + 1], 01100000b
  82.                 add di, 2
  83.                 loop item3
  84.                 ret
  85. ;向上滚动一行
  86. item4:               
  87.                 mov ds, ax
  88.                 mov si, 160
  89.                
  90.                 cld
  91.                 rep movsw
  92.                
  93.                 mov cx, 160
  94. good:
  95.                 mov di, 4000 - 160
  96.                 mov byte ptr es:[di], ' '
  97.                 add di, 2
  98.                 loop good
  99.                 ret
  100. end_1:
  101.                 nop

  102. code ends
  103. end start
  104.                
复制代码


《使用直接定址表遇到的问题》
这篇文章里介绍了为什么失败的原因
https://blog.csdn.net/grantxx/ar ... utm_source=jiancool

评分

参与人数 1荣誉 +2 鱼币 +3 贡献 +3 收起 理由
小甲鱼 + 2 + 3 + 3 无条件支持楼主!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-4-12 03:53:59 | 显示全部楼层
很棒!看得出非常认真!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-12 11:42:48 | 显示全部楼层
小甲鱼 发表于 2019-4-12 03:53
很棒!看得出非常认真!

谢谢,建立该网站,继续努力,争取每天都有进步
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-10 00:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表