(2011.11.01)汇编_王爽_第09章_学习小结
本章内容:
1. 转移指令——同时修改CS和IP的指令的统称。
2. 段内转移——只修改IP
——短转移——IP修改范围为 -128至127.
——近转移——IP修改范围为 -32768 至 32767
3. 段间转移——同时修改CS和IP
4. offset功能是取得标号的偏移地址。
5. jmp无条件转移指令,可以只修改IP,也可以同时修改CS和IP
6. jmp short 标号[IP] jmp near 标号[IP] jmp far 标号[CS:IP] jmp 16位的reg[IP]
7. jmp word ptr 内存单元地址(段内转移) jmp dword ptr 内存单元地址(段间转移)
8. jcxz 标号(如果(cx) = 0, 转移到标号处执行。)
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
; 程序名称:实验9_根据材料编程_在屏幕中间显示不同颜色的字符串.asm ; 程序功能:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串'Welcome to masm' ; 程序材料: ; 在内存中,有一个 80 * 25 彩色字符模式显示缓冲区,B8000H - BFFFFH 共 32KB 的空间。 ; 需记忆:向这个地址空间写入数据,写入的内容将立即出现在显示器上。 ; 显示器可以显示25行,每行80个字符,每个字符可有256种属性(背景色,前景色,闪烁,高亮等组合信息) ; 一行共有80个字符,占160个字节。 ; 一个字符在内存中占两个字节,(偶地址)低位存放字符的ASCII码,(奇地址)高位存放字符的属性。 ; 例: ; 在B8000H至B8F9FH为第一屏(25行,9+F=25-1),其中,偏移地址 000 - 09F 对应显示器上的第一行,(9F = 10 * 16 - 1) ; 属字节的格式: ; 7 6 5 4 3 2 1 0 ; BL R G B I R G B ; 当它们的位数为1的时候会被激活:BL(7):闪烁,(654)背景,I(3)高亮,(210)前景色,R(4,2)红色,G(5,1)绿色,B(6,0)绿色. ; 注意: ; 闪烁的效果必须在全屏DOS方式下才能看到。 ; 程序分析: ; 简单地说,编写该程序的方法就是将字符放到B8000H - BFFFFH的空间就可以了。 ; 那么,这里可以使用mov 指令,还有loop指令。 assume cs:code, ds:data ; 开始定义数据段,也就是题目要求的字符 data segment db 'welcome to masm!' data ends ; 开始定义代码段,并且设定程序执行的入口 code segment start: mov ax, data ; 找到字符串的起点 mov ds, ax mov al, 8 ; 设定段地址 mov ah, 12 mov es, ax mov bx, 31 ; 设定字符偏移地址的起点,列 add bx, 384 ; 行 mov si, 0 ; 一行有80个字符,要显示的有15个字符 mov di, 0 ; 要将字符放到中间,先设定中点为40,然后向两间展开 ; 也就是说,左边是40 - 7 = 33, 33 - 1 = 31 ; 减1原因,由零开始 mov cx, 15 ; 循环十五次 ; 先将 'welcome to masm!' 这十五个字符放入到屏幕中间 putcharin: mov al, ds:[si] ; 放入字符 mov es:[bx+di], al inc di ; 开始设置字体颜色,但由于每个字符串的颜色不同,所以这里需要设置几个循环跳点 cmp si, 7 jae near ptr c7 ; >=7时,跳到C7 c0: mov al, 01000000B ; 绿色 jmp near ptr endloop c7: cmp si, 11 jae near ptr c11 mov al, 00100100B ; 绿底红色 jmp near ptr endloop c11: mov al, 01110001B ; 白底蓝色 endloop: mov es:[bx + di], al inc si inc di loop putcharin mov ax, 4c00h int 21h code ends end start