鱼C论坛

 找回密码
 立即注册
查看: 3273|回复: 0

[汇编作业] 作业实验16

[复制链接]
发表于 2017-2-22 12:37:35 | 显示全部楼层 |阅读模式

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

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

x
中断程序的编译安装都没问题,下面是中断处理程序:
  1. assume cs:code
  2. code segment

  3. start:mov ax,cs
  4.         mov ds,ax
  5.         mov si,offset s
  6.         mov ax,0
  7.         mov es,ax
  8.         mov di,200h
  9.         mov cx,offset send - offset s
  10.         cld
  11.         rep movsb
  12.        
  13.         cli
  14.         mov word ptr es:[7ch*4],200h
  15.         mov word ptr es:[7ch*4+2],0
  16.         sti
  17.         mov ax,4c00h
  18.         int 21h
  19.        
  20. s:jmp short set
  21.         table dw sub1-s+200h,sub2-s+200h,sub3-s+200h,sub4-s+200h
  22.        
  23. set:push bx

  24.         cmp ah,3           ;判断功能号是否大于3
  25.         ja sret
  26.         mov bl,ah
  27.         mov bh,0
  28.         add bx,bx          ;根据ah中的功能号计算对应子程序在table表中的偏移
  29.         call word ptr table[bx]
  30.        
  31. sret:pop bx
  32.         iret
  33.        
  34. sub1:push bx
  35.         push cx
  36.         push es
  37.         mov bx,0b800h
  38.         mov es,bx
  39.         mov bx,0
  40.         mov cx,2000
  41. sub1s:mov byte ptr es:[bx],' '
  42.         add bx,2
  43.         loop sub1s
  44.         pop es
  45.         pop cx
  46.         pop bx
  47.         ret
  48.        
  49. sub2:push bx
  50.         push cx
  51.         push es
  52.         mov bx,0b800h
  53.         mov es,bx
  54.         mov bx,1
  55.         mov cx,2000
  56. sub2s:and byte ptr es:[bx],11111000b
  57.         or es:[bx],al
  58.         add bx,2
  59.         loop sub2s
  60.         pop es
  61.         pop cx
  62.         pop bx
  63.         ret
  64.        
  65. sub3:push bx
  66.         push cx
  67.         push es
  68.         mov cl,4
  69.         shl al,cl
  70.         mov bx,0b800h
  71.         mov es,bx
  72.         mov bx,1
  73.         mov cx,2000
  74. sub3s:and byte ptr es:[bx],10001111b
  75.         or es:[bx],al
  76.         add bx,2
  77.         loop sub3s
  78.         pop es
  79.         pop cx
  80.         pop bx
  81.         ret
  82.        
  83. sub4:push cx
  84.         push si
  85.         push di
  86.         push es
  87.         push ds
  88.        
  89.         mov si,0b800h
  90.         mov es,si
  91.         mov ds,si
  92.         mov si,160               ;ds:si指向第n+1行
  93.         mov di,0
  94.         cld
  95.         mov cx,24
  96.        
  97. sub4s:push cx
  98.         mov cx,160
  99.         rep movsb             ;复制
  100.         pop cx
  101.         loop sub4s
  102.        
  103.         mov cx,80
  104.         mov si,0
  105. sub4s1:mov byte ptr [160*24+si],' '        ;最后一行清空
  106.         add si,2
  107.         loop sub4s1
  108.         pop ds
  109.         pop es
  110.         pop di
  111.         pop si
  112.         pop cx
  113.         ret
  114.        
  115. send:nop

  116. code ends
  117. end start
复制代码
其实代码就是小甲鱼提供的答案1.但调用该中断程序就出问题了!下面为问题截图和调用代码:

  1. assume cs:code,ds:data
  2. data segment
  3.         db 'I love masm!',0
  4. data ends
  5. code segment
  6. start:mov dh,8
  7.         mov dl,3
  8.         mov cl,24h
  9.         mov ax,data
  10.         mov ds,ax
  11.         mov si,0
  12.         call show_str
  13.         mov ah,1
  14.         mov al,6
  15.         int 7ch
  16.        
  17.         mov ax,4c00h
  18.         int 21h
  19.        
  20. show_str:
  21.         push bx
  22.         push ax
  23.         push di
  24.         push es
  25.         dec dh                ;当前行之前的行数
  26.     dec dl                ;从当前行开始的当前列之前的列数
  27.         mov al,0a0h           ;将160送入al,为下一步乘法运算准备
  28.         mul dh                ;乘法结果在ax中,这步是计算所在行的偏移
  29.     mov di,ax             ;将行偏移数送入di
  30.         mov ax,0b800h
  31.         mov es,ax             ;将段地址b800h送入es
  32.        
  33.         mov al,2              ;将2送入al中,为下一步乘法运算准备
  34.         mul dl                ;乘法结果在ax中,这一步是计算所在列的偏移
  35.         add di,ax             ;将列偏移加上之前保存在di的行偏之和送入di
  36.        
  37.         mov bl,cl
  38. s:  mov cl,[si]           ;将ds:si指向的字符数据送入cl
  39.         mov ch,0              ;ch置0
  40.         jcxz ok
  41.         mov al,[si]           ;将ds:si指向的字符数据送入al
  42.         mov ah,bl             ;将颜色信息送入ah
  43.         mov es:[di],ax        ;将字符及字符颜色等信息送入es:di指向的内存字单元,即显卡缓存
  44.         inc si
  45.         add di,2
  46.         jmp short s
  47. ok: pop es
  48.         pop di
  49.         pop ax
  50.         pop bx
  51.         ret
  52. code ends
  53. end start
复制代码
捕获1.PNG
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-4 09:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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