王爽汇编语言实验16 (个人笔记)

    技术2022-07-11  73

    实验要求:

    安装一个新的int7ch 中断例程,为显示输出提供如下功能子程序。 (1)清屏 (2)设置前景色 (3)设置背景色 (4)向上滚动一行

    入口参数说明 (1)用ah寄存器传递功能号:0表示清屏,1表示设置前景色,2表示设置背景色,3表示向上滚动一行 (2)对于1、2号功能,用al传递颜色值,al取值0-7

    思路:

    显存地址中偶数位为显示字符,奇数位为属性字节 前景色:2 1 0 位 背景色:6 5 4 位 闪烁: 7 位 高亮:3 位

    清屏:将显存偶数位数据变为‘ ’; 设置前景色背景色,先将对应位上的二进制数通过与运算置0,再通过al传入的值进行或运算 向上滚,将从第二行开始,将第二行数据用remov指令复制到第一行依次进行

    代码:

    assume cs:code code segment start: mov ax,cs mov ds,ax mov si,offset int7 mov di,200h mov cx,offset int7cend-offset int7c mov ax,0 mov es,ax cld rep movsb mov ax,0 mov es,ax mov word ptr es:[7ch*4],200h mov word ptr es:[7ch*4+2],0 mov ax,0202h 改变这里的ax值来检测 int 7ch mov ax,4c00h int 21h org 200h 伪指令org表示从偏移地址200h处开始执行代码,为了以后执行中断时,偏移地址保持一致 int7c: jmp short set table dw sub0,sub1,sub2,sub3 用到数据标号,不仅可以表示内存单元的地址,还表示内存单元的长度 这里用来存放各个标号的偏移地址 set: push bx cmp ah,3 ja sret mov bl,ah mov bh,0 add bx,bx 通过add操作得到数据标号的偏移地址 call word ptr table[bx] 默认段地址是CS sret: pop bx iret sub0: push bx push cx push es mov bx,0b800h mov es,bx mov bx,0 mov cx,2000 sub0s: mov byte ptr es:[bx],' ' add bx,2 loop sub0s pop es pop cx pop bx ret sub1: push bx push cx push es mov bx,0b800h mov es,bx mov bx,1 mov cx,2000 sub1s: and byte ptr es:[bx],11111000b or es:[bx],al 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 cl,4 shl al,cl mov cx,2000 sub2s: and byte ptr es:[bx],10001111b or es:[bx],al add bx,2 loop sub2s pop es pop cx pop bx ret sub3: push cx push si push di push es push ds mov si,0b800h mov es,si mov ds,si mov si,160 mov di,0 cld mov cx,24 sub3s: push cx mov cx,160 rep movsb add si,160 add di,160 pop cx loop sub3s mov cx,80 mov si,0 sub3s1: mov byte ptr [160*24+si],' ' add si,2 loop sub3s1 pop ds pop es pop di pop si pop cx ret int7cend:nop code ends end start

    截图展示:

    Processed: 0.014, SQL: 9