前沿拓展:
win7打印
打印機(jī)是計(jì)算機(jī)的`輸出來(lái)自設(shè)備之一,用于將計(jì)算機(jī)處理結(jié)果打印在相關(guān)介質(zhì)上。下面就是我整理的win7打印機(jī)怎么掃描,一起圖適凱介來(lái)看一下吧。 方法/步驟 桌面-計(jì)算機(jī)-管理 點(diǎn)擊最下邊的令粒硫風(fēng)以翻龍革益則“服務(wù)和應(yīng)用程序” 點(diǎn)擊“服務(wù)” 找到Windows Image Acquation (WIA),確保狀態(tài)為“已啟動(dòng)”,啟動(dòng)類型為“自動(dòng)” 這是WIA的設(shè)置成功后的頁(yè)面,如果能設(shè)置成這樣就可掃描了。如果設(shè)置不成功,請(qǐng)看下一光研屬訓(xùn)蘇論布軸步。 檢查依存關(guān)系,確保這兩項(xiàng)(實(shí)際上是3個(gè))服務(wù)已啟動(dòng)。只有這兩項(xiàng)服務(wù)都啟動(dòng),WIA設(shè)置才能成功,返回“服務(wù)”頁(yè)面,點(diǎn)擊這兩項(xiàng)(3個(gè))設(shè)置為已啟動(dòng)如下列3幅圖所示 設(shè)置好后,去打財(cái)印機(jī)上驗(yàn)證是否右擊可看見(jiàn)開(kāi)始掃描按鈕。 方法:開(kāi)始-設(shè)備和打印機(jī) 右擊打印機(jī)應(yīng)該可以看到開(kāi)始掃描。啟動(dòng)打印機(jī)洲聯(lián)是投督廣極了生,掃描成功。但是你在打印機(jī)上按啟動(dòng)鍵掃描,又可能有麻煩了,桌面上提示無(wú)法自動(dòng)掃描,該如何解決呢? 開(kāi)始-windows傳真和掃描 點(diǎn)問(wèn)號(hào)(幫助)-安裝掃描儀 使用掃描儀和相機(jī)安裝向?qū)А? 啟動(dòng)掃描儀和照相機(jī)安裝的方法 單擊打開(kāi)照相機(jī)和掃描儀 添加掃描儀設(shè)備 沙松 歡迎使用掃描儀和照相機(jī)安裝向?qū)?下一步 下一步 完成?,F(xiàn)在就可以從打印機(jī)上掃描了。
之前咱們介紹顯卡上那么多的寄存器終于發(fā)揮用處了,我們看看前文中介紹的表CRT Controller Data Registers中索引為0Eh的 Cursor Location High Register寄存器和索引為0Fh的Cursor Location Low Register寄存器,這兩個(gè)寄存器都是8位長(zhǎng)度。分別用來(lái)存儲(chǔ)光標(biāo)坐標(biāo)的低8位和高8位地址。
訪問(wèn)CRT controller寄存器組的寄存器,需要先往端口地址為0x3D4的Address Register寄存器中寫(xiě)入寄存器的索引,再?gòu)亩丝诘刂窞?x3D5的Data Register寄存器讀、寫(xiě)數(shù)據(jù)。
接著解釋之前的代碼(本文是連載,沒(méi)看過(guò)前面,估計(jì)本節(jié)是蒙逼的)
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個(gè)字符寫(xiě)入光標(biāo)所在處
9 ;——————————————————————-
10 global put_char
11 put_char:
12 pushad ;備份32位寄存器環(huán)境
13 ;需要保證gs中為正確的視頻段選擇子,
;為保險(xiǎn)起見(jiàn),每次打印時(shí)都為gs賦值
14 mov ax, SELECTOR_VIDEO ; 不能直接把立即數(shù)送入段寄存器
15 mov gs, ax
16
17 ;;;;;;;;; 獲取當(dāng)前光標(biāo)位置 ;;;;;;;;;
18 ;先獲得高8位
19 mov dx, 0x03d4 ;索引寄存器
20 mov al, 0x0e ;用于提供光標(biāo)位置的高8位
21 out dx, al
22 mov dx, 0x03d5 ;通過(guò)讀寫(xiě)數(shù)據(jù)端口0x3d5來(lái)獲得或設(shè)置光標(biāo)位置
23 in al, dx ;得到了光標(biāo)位置的高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 ;將光標(biāo)存入bx
34 mov bx, ax
35 ;下面這行是在棧中獲取待打印的字符
36 mov ecx, [esp + 36] ;pushad壓入4×8=32字節(jié),
;加上主調(diào)函數(shù)4字節(jié)的返回地址,故esp+36字節(jié)
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行用來(lái)獲取光標(biāo)值,先在第19~21行設(shè)置待**作的寄存器索引,我們先獲取的是坐標(biāo)的高8位,所以要將索引0x0e寫(xiě)入Address Register寄存器,其端口為0x03d4。
確定了要**作的寄存器是Cursor Location High Register后,我們?cè)诘?2~24行通過(guò)Data Register寄存器,其端口是0x3d5,將坐標(biāo)讀入到al寄存器,由于al中是坐標(biāo)的高8位,所以第24行將其存儲(chǔ)在ah寄存器。也許您心存疑惑,既然要把坐標(biāo)的高8位存到寄存器ah中,為什么不把in指令中的al換成ah,變成in ah, dx?還多搗騰一次干嗎?真的抱歉,對(duì)于in指令,如果源**作是8位寄存器,目的**作數(shù)必須是al,如果源**作數(shù)是16位寄存器,目的**作數(shù)必須是ax。
第26~32行用同樣的方法獲取到坐標(biāo)的低8位,至此,寄存器ax中是光標(biāo)完整的16位坐標(biāo)值。
第35行是將光標(biāo)值從ax寄存器中**到bx,這么做的原因是習(xí)慣用寄存器bx做基址尋址,還記得嗎,在16位實(shí)模式下基址寄存器必須是bx或bp,變址必須是寄存器si或di。在32位保護(hù)模式下沒(méi)必要這么做了,基址和變址寄存器可以是全部的32位的通用寄存器,就是剛才用pushad指令壓入的那8個(gè),忘了往上翻翻。以后的處理都要基于bx寄存器了,在此知道bx現(xiàn)在已經(jīng)是光標(biāo)坐標(biāo)值就行了,它是下一個(gè)可打印字符的位置。
第36行是獲取棧中壓入的字符的ascii碼,也就是待打印的字符,這是1字節(jié)的數(shù)據(jù)。棧中除了調(diào)用put_char函數(shù)的返回地址占4字節(jié)外,還有最開(kāi)始的pushad指令壓入的8個(gè)32位的通用寄存器共32字節(jié)的數(shù)據(jù),所以待打印的字符在棧頂偏移36字節(jié)的位置。
之后的第36~44行開(kāi)始判斷參數(shù)是什么字符,咱們這里只把回車符CR(carriage_return)、換行符LF(line_feed)和退格鍵backspace當(dāng)做不可見(jiàn)字符,按照其實(shí)際控制意義來(lái)處理,其它字符暫時(shí)一律認(rèn)為是可見(jiàn)字符?;剀嚪腶scii碼是0xd,換行符的ascii碼是0xa,我們這里的處理是,不管參數(shù)是回車符,還是換行符,一律按我們平時(shí)所理解的回車換行符(CRLF)處理(linux中就把換行符處理成回車+換行),即這兩個(gè)動(dòng)作的合成:光標(biāo)回撤到行首+換到下一行。
本文是連續(xù)劇哦,所以得看過(guò)之前的文章才行。下班。
【再續(xù)】
拓展知識(shí):
原創(chuàng)文章,作者:九賢生活小編,如若轉(zhuǎn)載,請(qǐng)注明出處:http://xiesong.cn/134263.html