《汇编语言(第3版)》王爽 第十六章实验
2016-12-27 20:30
190 查看
本次实验遇到一个问题,就是缺少一条伪指令org XX后,程序跑飞
网上看了一下,总结一下就是使用org XX这个伪指令后就是告诉编译器接下来的偏移地址是XX,而不是从0开始。
网上看了一下,总结一下就是使用org XX这个伪指令后就是告诉编译器接下来的偏移地址是XX,而不是从0开始。
;编写包含多个子程序的中断例程 ;功能包括:清屏,设置前景色,设置背景色,向上滚动一行 ;思路:前三个问题不大,第四个的思路是从第二行开始,把每一行的字符复制到上一行 ;可利用movsb指令 assume cs:code,ss:stack stack segment db 32 dup (0) stack ends code segment start: ;中断安装程序,安装在0:204处,200h处保存原先中断地址 mov ax,stack mov ss,ax mov sp,32 push cs pop ds mov ax,0 mov es,ax mov si,offset int7ch mov di,204h mov cx,offset int7chend - offset int7ch cld rep movsb push es:[7ch*4] pop es:[200h] push es:[7ch*4+2] pop es:[202h] cli mov word ptr es:[7ch*4],204h mov word ptr es:[7ch*4+2],0 sti mov ax,4c00h int 21h org 204h ;这是伪指令,作用是告诉编译器下面的程序偏移地址从204h开始。 int7ch: jmp short set table dw sub1,sub2,sub3,sub4 ;该表用来保存子程序的地址 set: push bx cmp ah,3 ja sret mov bl,ah mov bh,0 add bx,bx call word ptr table[bx] sret: pop bx iret sub1: ;该子程序功能:清屏 push bx push es push cx mov bx,0b800h mov es,bx mov bx,0 mov cx,2000 sub1s: mov byte ptr es:[bx],' ' add bx,2 loop sub1s pop cx pop es pop bx ret sub2: ;该子程序功能设置:前景色 push bx push es push cx mov bx,0b800h mov es,bx mov bx,1 mov cx,2000 sub2s: add byte ptr es:[bx],11111000b or es:[bx],al add bx,2 loop sub2s pop cx pop es pop bx ret sub3: ;改变背景色子程序 push cx push bx push es mov cl,4 ;背景色在567位,所以al要先移位 shl al,cl mov bx,0b800h mov es,bx mov bx,1 mov cx,2000 sub3s: add byte ptr es:[bx],10001111b or es:[bx],al add bx,2 loop sub3s pop es pop bx pop cx ret sub4: ;向上滚动一行。 push bx push es push si push di push cx mov bx,0b800h mov es,bx mov ds,bx mov si,160 mov di,0 mov cx,24 cld sub4s: push cx mov cx,160 rep movsb ;注意movsb指令中cx=160就是整行字符总数 pop cx ;因此不用二重循环,单循环24次即可 loop sub4s ;此外在因为160个字节复制完成后,si,di已经自加 ;所以在此循环中我们不用再加增量,每次循环在上 ;次基础上再加 mov cx,80 mov si,0 ;因为整体上移一行后,最后一行为空, sub4s1: mov byte ptr es:[160*24+si],' ' ;所以25行为空 add si,2 loop sub4s1 pop cx pop di pop si pop es pop bx ret int7chend: nop code ends end start
;调试程序,测试新的7ch中断例程 assume cs:code,ss:stack stack segment db 128 dup (0) stack ends code segment start: mov ax,stack mov ss,ax mov sp,128 mov ah,1 ;测试前景色 mov al,4 int 7ch call delay mov ah,2 ;测试背景色 mov al,2 int 7ch call delay mov ah,3 ;测试滚动一行 mov al,2 int 7ch call delay mov ah,0 ;测试清屏,注意7ch程序仅仅去除字符,背景色不变 mov al,0 int 7ch call delay mov ax,4c00h int 21h delay: push dx ;延时函数,总共循环100000h次 push ax mov dx,10h mov ax,0 s: sub ax,1 sbb dx,0 cmp ax,0 jne s cmp dx,0 jne s pop ax pop dx ret code ends end start
相关文章推荐
- 王爽《汇编语言》(第3版) 实验七
- 《汇编语言(第3版)》王爽 第十七章实验
- 《汇编语言(第3版)》王爽 第十三章实验
- 《汇编语言(第3版)》王爽 第十二章实验
- 《汇编语言(第3版)》王爽 第十五章实验
- 《汇编语言(第3版)》王爽 第十四章实验
- 《汇编语言(第3版)》王爽 第十章实验
- 《汇编语言(第3版)》王爽 第十一章实验
- 《汇编语言(第3版)》王爽 课程设计2
- 王爽《汇编语言》第8章 实验7 不使用栈的解法
- 王爽 《汇编语言》 实验14 利用CMOS RAM 显示时间
- 王爽《汇编语言》实验9:显示字符 解答
- 《汇编语言》(第三版)王爽第八章实验7个人方法记录
- 王爽《汇编语言》实验15——安装新的INT 9中断例程
- 汇编语言(王爽)实验4
- 汇编语言(王爽)--实验5:编写,调试具有多个段的程序
- 王爽《汇编语言》实验12:编写0号中断的处理程序 解答
- 王爽《汇编语言》学习笔记----实验1
- 王爽《汇编语言》实验10:编写子程序show_str
- 王爽《汇编语言》第十一章 实验十一 题目解答