前沿拓展:
win7打印
打印机是计算机的`输出来自设备之一,用于将计算机处理结果打印在相关介质上。下面就是我整理的win7打印机怎么扫描,一起图适凯介来看一下吧。 方法/步骤 桌面-计算机-管理 点击最下边的令粒硫风以翻龙革益则“服务和应用程序” 点击“服务” 找到Windows Image Acquation (WIA),确保状态为“已启动”,启动类型为“自动” 这是WIA的设置成功后的页面,如果能设置成这样就可扫描了。如果设置不成功,请看下一光研属训苏论布轴步。 检查依存关系,确保这两项(实际上是3个)服务已启动。只有这两项服务都启动,WIA设置才能成功,返回“服务”页面,点击这两项(3个)设置为已启动如下列3幅图所示 设置好后,去打财印机上验证是否右击可看见开始扫描按钮。 方法:开始-设备和打印机 右击打印机应该可以看到开始扫描。启动打印机洲联是投督广极了生,扫描成功。但是你在打印机上按启动键扫描,又可能有麻烦了,桌面上提示无法自动扫描,该如何解决呢? 开始-windows传真和扫描 点问号(帮助)-安装扫描仪 使用扫描仪和相机安装向导。 启动扫描仪和照相机安装的方法 单击打开照相机和扫描仪 添加扫描仪设备 沙松 欢迎使用扫描仪和照相机安装向导-下一步 下一步 完成。现在就可以从打印机上扫描了。
之前咱们介绍显卡上那么多的寄存器终于发挥用处了,我们看看前文中介绍的表CRT Controller Data Registers中索引为0Eh的 Cursor Location High Register寄存器和索引为0Fh的Cursor Location Low Register寄存器,这两个寄存器都是8位长度。分别用来存储光标坐标的低8位和高8位地址。
访问CRT controller寄存器组的寄存器,需要先往端口地址为0x3D4的Address Register寄存器中写入寄存器的索引,再从端口地址为0x3D5的Data Register寄存器读、写数据。
接着解释之前的代码(本文是连载,没看过前面,估计本节是蒙逼的)
1 TI_GDT equ 0
2 RPL0 equ 0
3 SELECTOR_VIDEO equ (0x0003<<3) + TI_GDT + RPL0
4
5 [bits 32]
6 section .text
7 ;———————— put_char —————————–
8 ;功能描述:把栈中的1个字符写入光标所在处
9 ;——————————————————————-
10 global put_char
11 put_char:
12 pushad ;备份32位寄存器环境
13 ;需要保证gs中为正确的视频段选择子,
;为保险起见,每次打印时都为gs赋值
14 mov ax, SELECTOR_VIDEO ; 不能直接把立即数送入段寄存器
15 mov gs, ax
16
17 ;;;;;;;;; 获取当前光标位置 ;;;;;;;;;
18 ;先获得高8位
19 mov dx, 0x03d4 ;索引寄存器
20 mov al, 0x0e ;用于提供光标位置的高8位
21 out dx, al
22 mov dx, 0x03d5 ;通过读写数据端口0x3d5来获得或设置光标位置
23 in al, dx ;得到了光标位置的高8位
24 mov ah, al
25
26 ;再获取低8位
27 mov dx, 0x03d4
28 mov al, 0x0f
29 out dx, al
30 mov dx, 0x03d5
31 in al, dx
32
33 ;将光标存入bx
34 mov bx, ax
35 ;下面这行是在栈中获取待打印的字符
36 mov ecx, [esp + 36] ;pushad压入4×8=32字节,
;加上主调函数4字节的返回地址,故esp+36字节
37 cmp cl, 0xd ;CR是0x0d,LF是0x0a
38 jz .is_carriage_return
39 cmp cl, 0xa
40 jz .is_line_feed
41
42 cmp cl, 0x8 ;BS(backspace)的asc码是8
43 jz .is_backspace
44 jmp .put_other
在代码第17~31行用来获取光标值,先在第19~21行设置待**作的寄存器索引,我们先获取的是坐标的高8位,所以要将索引0x0e写入Address Register寄存器,其端口为0x03d4。
确定了要**作的寄存器是Cursor Location High Register后,我们在第22~24行通过Data Register寄存器,其端口是0x3d5,将坐标读入到al寄存器,由于al中是坐标的高8位,所以第24行将其存储在ah寄存器。也许您心存疑惑,既然要把坐标的高8位存到寄存器ah中,为什么不把in指令中的al换成ah,变成in ah, dx?还多捣腾一次干吗?真的抱歉,对于in指令,如果源**作是8位寄存器,目的**作数必须是al,如果源**作数是16位寄存器,目的**作数必须是ax。
第26~32行用同样的方法获取到坐标的低8位,至此,寄存器ax中是光标完整的16位坐标值。
第35行是将光标值从ax寄存器中**到bx,这么做的原因是习惯用寄存器bx做基址寻址,还记得吗,在16位实模式下基址寄存器必须是bx或bp,变址必须是寄存器si或di。在32位保护模式下没必要这么做了,基址和变址寄存器可以是全部的32位的通用寄存器,就是刚才用pushad指令压入的那8个,忘了往上翻翻。以后的处理都要基于bx寄存器了,在此知道bx现在已经是光标坐标值就行了,它是下一个可打印字符的位置。
第36行是获取栈中压入的字符的ascii码,也就是待打印的字符,这是1字节的数据。栈中除了调用put_char函数的返回地址占4字节外,还有最开始的pushad指令压入的8个32位的通用寄存器共32字节的数据,所以待打印的字符在栈顶偏移36字节的位置。
之后的第36~44行开始判断参数是什么字符,咱们这里只把回车符CR(carriage_return)、换行符LF(line_feed)和退格键backspace当做不可见字符,按照其实际控制意义来处理,其它字符暂时一律认为是可见字符。回车符的ascii码是0xd,换行符的ascii码是0xa,我们这里的处理是,不管参数是回车符,还是换行符,一律按我们平时所理解的回车换行符(CRLF)处理(linux中就把换行符处理成回车+换行),即这两个动作的合成:光标回撤到行首+换到下一行。
本文是连续剧哦,所以得看过之前的文章才行。下班。
【再续】
拓展知识:
原创文章,作者:九贤生活小编,如若转载,请注明出处:http://www.wangguangwei.com/134263.html