鱼C论坛

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

[汇编作业] 第13章检测实验及笔记

[复制链接]
发表于 2016-1-27 14:36:42 | 显示全部楼层 |阅读模式

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

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

x
两个简单问题,选做一个,记住复制代码和改写中断向量表的固定步骤

  1. ;中断7ch的中断例程
  2. ;功能:将0结尾字符串改为大写
  3. ;参数:ds:si指向串首
  4. ;返回值:无
  5. assume cs:code
  6. code segment
  7. start:
  8. ;复制代码
  9.         mov ax,cs
  10.         mov ds,ax
  11.         mov si,offset todo
  12.        
  13.         mov ax,0h
  14.         mov es,ax
  15.         mov di,200h
  16.        
  17.         mov cx,offset todoend - offset todo
  18.         cld
  19.         rep movsb
  20. ;改写中断向量表
  21.         mov ax,0
  22.         mov ds,ax
  23.         mov word ptr ds:[7ch*4],200h
  24.         mov word ptr ds:[7ch*4+2],0
  25.        
  26.         mov ax,4c00h
  27.         int 21h
  28. ;中断处理
  29.         todo:
  30.                 push cx
  31.                 mov ch,0
  32.                 s:
  33.                 mov cl,ds:[si]
  34.                 jcxz return
  35.                 and cl,11011111b
  36.                 mov ds:[si],cl
  37.                 inc si
  38.                 jmp s
  39.         return:
  40.                 pop cx
  41.                 iret
  42.         todoend:
  43.                 nop
  44. code ends
  45. end start
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-1-27 14:51:05 | 显示全部楼层
稍难一点的,难点在于中断处理程序如何改变父程序
  1. ;功能:用7ch中断例程完成loop指令的功能
  2. assume cs:code
  3. code segment
  4.         start:
  5.         ;复制
  6.         mov ax,cs
  7.         mov ds,ax
  8.         mov si,offset todo
  9.        
  10.         mov ax,0
  11.         mov es,ax
  12.         mov di,0200h
  13.        
  14.         mov cx,offset todoend - offset todo
  15.        
  16.         cld
  17.         rep movsb
  18.        
  19.         ;安装
  20.         mov ax,0
  21.         mov ds,ax
  22.         mov word ptr ds:[7ch*4],0200h
  23.         mov word ptr ds:[7ch*4+2],0h
  24.         mov ax,4c00h
  25.         int 21h
  26.                
  27.                 todo:
  28.                 ;loop的原理:1.(cx)=(cx)-1 2.如果(cx)<>0跳回,=0继续
  29.                 ;这段代码要做的:
  30.                 ;1.(cx)=(cx)-1
  31.                 sub cx,1
  32.                 ;2.判断
  33.                 ;2.1为零继续
  34.                 jcxz return
  35.                 ;2.2不为零跳回。如何找到调用父程序s标号的段和偏移?
  36.                 ;在int的时候,cs,ip入了栈,所以可以改写栈中数据,等中断结束回到父程序时,依据被改写的cs:ip实现跳回
  37.                 ;(不是从栈中将cs:ip取出来jmp!)
  38.                 ;当前ss:[sp]正是ip的值
  39.                 add [sp],bx;偏移改为指向s
  40.                 return:
  41.                         iret               
  42.                 todoend:nop
  43. code ends
  44. end start
复制代码


书上没有直接用[sp],而是用[bp]中转,更安全
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-28 10:24:53 | 显示全部楼层
本帖最后由 yundi 于 2016-1-28 12:54 编辑

BIOS,DOS中断

先不用中断做个练习
  1. ;在屏幕5行12列显示3个红底高亮闪烁绿色的'a'
  2. ;参数dh=行号,dl=列号,al=字符,cx=重复次数

  3. assume cs:code
  4. code segment
  5. start:
  6.         mov dh,5
  7.         mov dl,12
  8.         mov al,'a'
  9.         mov cx,3 ;参数赋值
  10.        
  11.         call showa;调子程序
  12.         mov ax,4c00h
  13.         int 21h
  14. showa:
  15.         push ax
  16.         mov ax,0b800h
  17.         mov ds,ax;段0b800h
  18.         mov bx,0
  19.         mov al,160
  20.         mul dh;160*dh
  21.         add bx,ax
  22.         mov al,2
  23.         mul dl;2*dl
  24.         add bx,ax;偏移160*行+2*列
  25.         pop ax;
  26. s:        mov byte ptr ds:[bx],al
  27.         mov byte ptr ds:[bx+1],11001010b
  28.         add bx,2
  29.         loop s
  30.         ret       
  31. code ends
  32. end start
复制代码


用上提供的中断例程,变得简单多了
  1. ;在屏幕5行12列显示3个红底高亮闪烁绿色的'a'
  2. assume cs:code
  3. code segment
  4. start:
  5.         ;定位光标
  6.         mov ah,2
  7.         mov bh,0
  8.         mov dh,5
  9.         mov dl,12
  10.         int 10h
  11.         ;显示
  12.         mov ah,9
  13.         mov al,'a'
  14.         mov bl,11001010b
  15.         mov bh,0
  16.         mov cx,3
  17.         int 10h
  18.        
  19.         mov ax,4c00h
  20.         int 21h

  21. code ends
  22. end start
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-12 17:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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