鱼C论坛

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

[汇编作业] 实验16

[复制链接]
发表于 2023-3-3 00:17:03 | 显示全部楼层 |阅读模式

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

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

x
使用call指令直接调用标号不需要计算偏移量
assume cs:code

code segment
    start:     mov  ax,0
               mov  es,ax
               mov  di,200H

               mov  ax,cs
               mov  ds,ax
               mov  si,offset setscreen

               mov  cx,offset int7ch_end-offset setscreen
               cld
               rep  movsb

               mov  word ptr es:[7ch*4],200h
               mov  word ptr es:[7ch*4+2],0h

               mov  ax,4c00h
               int  21h

    ; 功能: 调用指定的子程序
    ; 参数: (ah)=功能号(0-3)
    ;      (al)=颜色值(0-7)
    setscreen: cmp  ah,0
               je   do1
               cmp  ah,1
               je   do2
               cmp  ah,2
               je   do3
               cmp  ah,3
               je   do4
               jmp  short sret

    do1:       call sub1
               jmp  short sret
    do2:       call sub2
               jmp  short sret
    do3:       call sub3
               jmp  short sret
    do4:       call sub4

    sret:      iret

    ; 清屏
    sub1:      push bx
               push cx
               push es
               mov  bx,0b800h
               mov  es,bx
               mov  bx,0
               mov  cx,2000
    sub1s:     mov  byte ptr es:[bx],' '
               add  bx,2
               loop sub1s
               pop  es
               pop  cx
               pop  bx
               ret

    ; 设置前景色
    sub2:      push bx
               push cx
               push es

               mov  bx,0b800h
               mov  es,bx
               mov  bx,1
               mov  cx,2000
    sub2s:     and  byte ptr es:[bx],11111000b               ; 前景色置0
               or   es:[bx],al                               ; 放入颜色值
               add  bx,2
               loop sub2s

               pop  es
               pop  cx
               pop  bx
               ret

    ; 设置背景色
    sub3:      push bx
               push cx
               push es
               mov  cl,4
               shl  al,cl
               mov  bx,0b800h
               mov  es,bx
               mov  bx,1
               mov  cx,2000
    sub3s:     and  byte ptr es:[bx],10001111b               ; 背景色置0
               or   es:[bx],al                               ; 放入背景色值
               add  bx,2
               loop sub3s
               pop  es
               pop  cx
               pop  bx
               ret

    ; 向上滚动一行
    sub4:      push cx
               push si
               push di
               push es
               push ds

               mov  si,0b800h
               mov  es,si
               mov  ds,si
               mov  si,160                                   ; ds:si指向n+1行
               mov  di,0                                     ; es:di指向n行
               cld
               mov  cx,24

    sub4s:     push cx
               mov  cx,160
               rep  movsb                                    ; n+1行覆盖到n行上
               pop  cx
               loop sub4s

               mov  cx,80
               mov  si,0
    sub4s1:    mov  byte ptr [160*24+si],' '                 ; 最后一行清空
               add  si,2
               loop sub4s1

               pop  ds
               pop  es
               pop  di
               pop  si
               pop  cx
               ret
    int7ch_end:nop
code ends

end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 04:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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