亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? dos下實現重新啟動或者關機的小程序 .txt

?? 會變語言實現的一些程序
?? TXT
字號:
DOS下實現重新啟動或者關機的小程序 
    作者:阿豆腐 于2008-6-16上傳   

--------------------------------------------------------------------------------

    近日,在DOS下測試某個硬件設備,需要執行DOS下的重新啟動。上網搜索,大多是Windows下面的那個shutdown。

經過苦苦探尋,終于找到DOS下的這樣工具。其中附帶了源程序,下面我就對他的程序做一點簡單的分析。原程序名為

shut12.zip,其中提供了源程序。不過他的源程序是 MAGIC ASSEMBLER 編譯器編譯的,和Masm的語法有很大差別,

我動手將它改造為Masm的格式:

;*****************************************************************************
;*DOS下重新啟動/關機的代碼。也是一個簡單的處理輸入參數的例子 SOLD.ASM        *
;*****************************************************************************
.model Tiny
.data
WinErr    db 'This program cannot be run under Windows.',0ah,0dh,'$'
Txt       db 'ShutDown v1.2 www.blacklight.wxs.org',0ah,0dh,'$'
SyntaxTxt db 'Syntax: SHUTDOWN [S(hutdown)|R(estart)]',0ah,0dh,'$'
Question  db 'S(hutdown), R(estart), or C(ancel)? $'
NoATX     db 'Could not shutdown! No ATX maybe?$',0ah,0dh
KeyOff db 'S'
KeyRes db 'R'
KeyCan db 'C'
KeyEsc db 27
CrLf db 0ah,0d,'$'
FlushMsg1 db 'Flushing SMARTDRV buffers...$'
FlushMsg2 db 'done',0ah,0dh,'$'

.code
Syntax: mov ah,9h
        mov dx,offset SyntaxTxt
        int 21h
        jmp Exit

NoPars: mov ah,9h ;Show question
        mov dx,offset(Question)
        int 21h

DoAsk:  xor ah,ah ;Ask for key
        int 16h

        cmp al,KeyEsc ;Check if 'Esc'-key pressed
        je DoCan
        and al,0DFh ;convert AL to uppercase

        cmp al,KeyOff ;Check if 'S'-key pressed
        je DoOff

        cmp al,KeyRes ;Check if 'R'-key pressed
        je DoRes

        cmp al,KeyCan ;Check if 'C'-key pressed
        je DoCan

        jmp DoAsk ;Invalid key pressed, ask again...

        ShowKey: mov ah,2h ;Show the pressed key
        mov dl,al
        int 21h
        mov ah,9h ;Show CrLf
        mov dx,offset(CrLf)
        int 21h
        ret ;return

.startup
        mov ax,160ah ;check for Windows
        int 2fh
        cmp ax,0000
        jne NoWin
        mov dx,offset(WinErr) ;print error message
        mov ah,9h
        int 21h
        jmp Exit
NoWin: 
        mov ah,9h ;Show program name
        mov dx,offset(Txt)
        int 21h

        mov si,81h
        mov al,[si]
        cmp al,0Dh ;Check if any parameters given
        jz NoPars

        mov si,81h ;get parameters

ParLoop: lodsb
        cmp al,0d ;if end reached with no result
        je Syntax ; show syntax
        and al,0DFh ;convert AL to uppercase
        cmp al,KeyOff ;check for S parameter
        je DoOffW
        cmp al,KeyRes ;check for R parameter
        je DoResW
        jmp ParLoop ;not recognized,goto next char.

DoRes:  call ShowKey
DoResW: call FlushSD
        db 0EAh
        dw 00000
        dw 0FFFFh ; jmpf ffff:0000 this instruction will reboot the computer
DoOff:  call ShowKey
DoOffW: jmp ATXOff

DoCan: call ShowKey
Exit:
.exit ;exit to DOS


ATXOff: call FlushSD ;flush smartdrive cache
        mov ax,5301h ;Function 5301h: APM ?Connect real-mode interface
        xor bx,bx ;Device ID: 0000h (=system BIOS)
        int 15h ;Call interrupt: 15h

        mov ax,530eh ;Function 530Eh: APM ?Driver version
        mov cx,0102h ;Driver version: APM v1.2
        int 15h ;Call interrupt: 15h

        mov ax,5307h ;Function 5307h: APM ?Set system power state
        mov bl,01h ;Device ID: 0001h (=All devices)
        mov cx,0003h ;Power State: 0003h (=Off)
        int 15h ;Call interrupt: 15h

        ;if the program is still running here, there was an error...
        mov ah,9h
        mov dx,offset(NoATX)
        int 21h

        jmp Exit

FlushSD:

        mov ah,9h
        mov dx,offset(FlushMsg1)
        int 21h
        mov ax,4A10h ;flush smartdrv/pccache buffers
        mov bx,1h
        int 1Ah
        mov ah,9h
        mov dx,offset(FlushMsg2)
        int 21h
        ret
end


   編譯也很順利,唯獨運行就出錯。仔細研究靜態代碼無果,轉用Turbo Debugger調試,

發現 jz NoPars 這條指令對應的機器碼很奇怪,反編譯的結果竟然是

jne 0121 和 jmp 000A 兩條指令,莫非是TD的bug。再換用最老實的debug,結果仍然如此。

這時候就開始懷疑是編譯器本身的問題了,使用 ml /Fl 查看生成的.lst文件:

011A BE 0081               mov si,81h
011D 8A 04                 mov al,[si]
011F 3C 0D                 cmp al,0Dh ;Check if any parameters given
0121 75 03 E9 FEE4        jz NoPars

    真的是生成了這樣的代碼,難道真的是Masm的bug么?

    先冷靜下來,繼續跟蹤代碼,這個跳轉會導致程序運行到一片“亂七八糟”的地方。

而那個位置實際上應該是我們.code下面的代碼,再仔細查看生成的.com文件中,竟然

沒有.code下面代碼對應的機器碼,就是說編譯過程中,那一段程序沒有生成機器碼。

再進一步分析,com文件是沒有文件頭的,運行期前面256個是dos生成的... ...莫非是

程序結構上的問題,我們上面的程序入口并非在代碼段開始處。于是,修改程序如下,

修改處用紅色標記

;*****************************************************************************
;*DOS下重新啟動/關機的代碼。也是一個簡單的處理輸入參數的例子 SNEW.ASM        *
;*****************************************************************************
.model Tiny
.data
WinErr    db 'This program cannot be run under Windows.',0ah,0dh,'$'
Txt       db 'ShutDown v1.2 www.blacklight.wxs.org',0ah,0dh,'$'
SyntaxTxt db 'Syntax: SHUTDOWN [S(hutdown)|R(estart)]',0ah,0dh,'$'
Question  db 'S(hutdown), R(estart), or C(ancel)? $'
NoATX     db 'Could not shutdown! No ATX maybe?$',0ah,0dh
KeyOff db 'S'
KeyRes db 'R'
KeyCan db 'C'
KeyEsc db 27
CrLf db 0ah,0d,'$'
FlushMsg1 db 'Flushing SMARTDRV buffers...$'
FlushMsg2 db 'done',0ah,0dh,'$'

.code

.startup

        jmp realstart 
Syntax: mov ah,9h
        mov dx,offset SyntaxTxt
        int 21h
        jmp Exit

NoPars: mov ah,9h ;Show question
        mov dx,offset(Question)
        int 21h

DoAsk:  xor ah,ah ;Ask for key
        int 16h

        cmp al,KeyEsc ;Check if 'Esc'-key pressed
        je DoCan
        and al,0DFh ;convert AL to uppercase

        cmp al,KeyOff ;Check if 'S'-key pressed
        je DoOff

        cmp al,KeyRes ;Check if 'R'-key pressed
        je DoRes

        cmp al,KeyCan ;Check if 'C'-key pressed
        je DoCan

        jmp DoAsk ;Invalid key pressed, ask again...

        ShowKey: mov ah,2h ;Show the pressed key
        mov dl,al
        int 21h
        mov ah,9h ;Show CrLf
        mov dx,offset(CrLf)
        int 21h
        ret ;return

realstart:
        mov ax,160ah ;check for Windows
        int 2fh
        cmp ax,0000
        jne NoWin
        mov dx,offset(WinErr) ;print error message
        mov ah,9h
        int 21h
        jmp Exit
NoWin: 
        mov ah,9h ;Show program name
        mov dx,offset(Txt)
        int 21h

        mov si,81h
        mov al,[si]
        cmp al,0Dh ;Check if any parameters given
        jz NoPars

        mov si,81h ;get parameters

ParLoop: lodsb
        cmp al,0d ;if end reached with no result
        je Syntax ; show syntax
        and al,0DFh ;convert AL to uppercase
        cmp al,KeyOff ;check for S parameter
        je DoOffW
        cmp al,KeyRes ;check for R parameter
        je DoResW
        jmp ParLoop ;not recognized,goto next char.

DoRes:  call ShowKey
DoResW: call FlushSD
        db 0EAh
        dw 00000
        dw 0FFFFh ; jmpf ffff:0000 this instruction will reboot the computer
DoOff:  call ShowKey
DoOffW: jmp ATXOff

DoCan: call ShowKey
Exit:
.exit ;exit to DOS


ATXOff: call FlushSD ;flush smartdrive cache
        mov ax,5301h ;Function 5301h: APM ?Connect real-mode interface
        xor bx,bx ;Device ID: 0000h (=system BIOS)
        int 15h ;Call interrupt: 15h

        mov ax,530eh ;Function 530Eh: APM ?Driver version
        mov cx,0102h ;Driver version: APM v1.2
        int 15h ;Call interrupt: 15h

        mov ax,5307h ;Function 5307h: APM ?Set system power state
        mov bl,01h ;Device ID: 0001h (=All devices)
        mov cx,0003h ;Power State: 0003h (=Off)
        int 15h ;Call interrupt: 15h

        ;if the program is still running here, there was an error...
        mov ah,9h
        mov dx,offset(NoATX)
        int 21h

        jmp Exit

FlushSD:

        mov ah,9h
        mov dx,offset(FlushMsg1)
        int 21h
        mov ax,4A10h ;flush smartdrv/pccache buffers
        mov bx,1h
        int 1Ah
        mov ah,9h
        mov dx,offset(FlushMsg2)
        int 21h
        ret
end

   可以看到,我們的修改只是將程序的入口放到了代碼段的起始。編譯運行,沒有報錯,感覺很好。

我們再來比較生成com文件的大小:snew.com 449 字節 vs  sold.com 389 字節 。明顯長了一截~

不見了的代碼又重新出現... ...查看jz NoPars 的機器代碼是   74 A8 正確,因此,整個問題得以解決。

    總結一下:對于com文件,它沒有文件頭,因此不可以將代碼的入口設置在程序中,否則編譯過程中

會丟失入口之前的代碼,并且程序會將一些跳轉誤認為是段間的跳轉,從而導致許許多多稀奇古怪的問題。

另外,程序提到了smartdrv,這個是dos下的一個硬盤緩沖驅動,加上它之后硬盤的讀寫會先緩沖到內存中,

從而達到加速的目的,也因為如此,在shutdown/reset的時候要記得“請它先”完成讀寫動作。另外,APM

是dos下的電源管理方面的服務,是BIOS提供的。具體的解釋可以在BIOS中斷大全中找到。



--------------------------------------------------------------------------------
<<<上一篇  歡迎訪問AoGo匯編小站:http://www.aogosoft.com 下一篇>>>  

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99国产欧美久久久精品| 91小视频在线免费看| 夜夜嗨av一区二区三区| 国产精品免费久久久久| 国产精品入口麻豆九色| wwwwww.欧美系列| 久久精品水蜜桃av综合天堂| 久久综合久久综合九色| 国产日韩三级在线| 亚洲女同一区二区| 亚洲香肠在线观看| 日韩电影在线观看一区| 激情五月婷婷综合网| 国产成人在线观看| 欧洲一区二区av| 欧美一区二区三区四区高清 | 成人午夜免费电影| 成人理论电影网| 欧美日韩专区在线| 日韩欧美在线一区二区三区| 久久久777精品电影网影网 | 色噜噜狠狠色综合欧洲selulu| 97se亚洲国产综合自在线不卡 | 日韩视频在线你懂得| 26uuu久久天堂性欧美| 国产精品久久久久一区二区三区共| 日韩码欧中文字| 日本亚洲三级在线| 99久久精品免费看国产| 欧美日韩亚洲另类| 中文子幕无线码一区tr| 一区二区三区欧美亚洲| 韩国成人福利片在线播放| 99国产麻豆精品| 精品美女被调教视频大全网站| 中文字幕+乱码+中文字幕一区| 五月婷婷综合激情| 成人精品视频一区二区三区| 欧美久久一二区| 国产精品婷婷午夜在线观看| 日韩专区中文字幕一区二区| 国产精品亚洲午夜一区二区三区 | 91麻豆精品国产91久久久久| 中文字幕欧美日韩一区| 日韩中文字幕亚洲一区二区va在线 | 奇米精品一区二区三区在线观看一 | 另类调教123区| 91久久精品日日躁夜夜躁欧美| 日韩免费观看高清完整版 | 欧美日本免费一区二区三区| 国产欧美一区二区三区在线老狼 | 国产精品一区二区久久不卡 | 久久久久99精品一区| 婷婷国产在线综合| 色婷婷久久久综合中文字幕| 国产三级精品视频| 麻豆成人综合网| 欧美精品一级二级| 一区二区三区精品| 91视频在线看| 中文字幕欧美一区| 国产99一区视频免费| 日韩美一区二区三区| 奇米一区二区三区av| 欧美日韩精品一区二区在线播放| 亚洲日本乱码在线观看| 国产麻豆精品95视频| 欧美成人女星排行榜| 日本美女一区二区三区| 69久久夜色精品国产69蝌蚪网| 一个色综合网站| 在线一区二区观看| 亚洲精品中文在线观看| 一本到不卡免费一区二区| 国产精品免费看片| 色综合久久综合| 一区二区成人在线视频| 色吧成人激情小说| 亚洲国产精品天堂| 欧美一三区三区四区免费在线看 | 欧美色图12p| 亚洲午夜一二三区视频| 欧美日韩在线亚洲一区蜜芽| 一个色综合网站| 91精品国产综合久久精品| 免费的成人av| 久久久www成人免费无遮挡大片| 狠狠色狠狠色综合| 日本一区二区不卡视频| 色综合天天做天天爱| 午夜精品久久久久久久| 精品入口麻豆88视频| 国产福利一区二区三区| 亚洲欧美日韩综合aⅴ视频| 欧美视频完全免费看| 日本不卡不码高清免费观看| 欧美电视剧免费观看| 国产91精品免费| 亚洲一区av在线| 欧美成人猛片aaaaaaa| 成人的网站免费观看| 亚洲成国产人片在线观看| 欧美一级欧美三级| 99久久久精品| 麻豆中文一区二区| ...xxx性欧美| 欧美一区二区三区的| 成人中文字幕合集| 丝瓜av网站精品一区二区| 欧美sm美女调教| 欧美性三三影院| 风间由美一区二区av101| 性久久久久久久| 国产欧美日韩在线视频| 91超碰这里只有精品国产| 懂色av一区二区在线播放| 午夜天堂影视香蕉久久| 久久精品欧美日韩| 欧美高清性hdvideosex| 北条麻妃国产九九精品视频| 日韩电影一区二区三区四区| 亚洲欧美综合在线精品| 久久久综合视频| 日韩午夜中文字幕| 欧美日韩在线观看一区二区| 国产成人在线观看| 国产在线一区二区综合免费视频| 亚洲国产成人av网| 亚洲人午夜精品天堂一二香蕉| 精品久久久久久综合日本欧美| 色欧美乱欧美15图片| 不卡视频一二三| 极品美女销魂一区二区三区免费| 亚洲一区二区在线观看视频| 中文一区二区完整视频在线观看| 日韩精品最新网址| 欧美日韩亚洲综合在线| 色婷婷亚洲综合| 色乱码一区二区三区88| 菠萝蜜视频在线观看一区| 粉嫩aⅴ一区二区三区四区五区| 久久av老司机精品网站导航| 日韩成人精品在线| 午夜精品一区二区三区电影天堂| 亚洲精品免费播放| 亚洲视频一区二区免费在线观看| 国产精品网站在线播放| 日本一区二区三区四区| 国产日韩欧美一区二区三区乱码| 精品免费国产二区三区| 日韩久久久精品| 久久―日本道色综合久久| 久久久综合九色合综国产精品| 欧美本精品男人aⅴ天堂| 日韩一区二区三区av| 欧美一卡二卡三卡四卡| 精品国产免费一区二区三区四区| 欧美一三区三区四区免费在线看 | 亚洲欧美日韩电影| 亚洲女同ⅹxx女同tv| 一区二区三区高清| 亚洲成人黄色小说| 日韩av电影天堂| 激情综合色丁香一区二区| 九九热在线视频观看这里只有精品| 久久精品国产亚洲高清剧情介绍 | 欧美日韩色综合| 91精品国模一区二区三区| 欧美一区二区三区精品| 久久久综合视频| 亚洲女同一区二区| 免费黄网站欧美| 夫妻av一区二区| 欧美三级资源在线| 精品国免费一区二区三区| 国产精品视频yy9299一区| 亚洲美女区一区| 毛片av一区二区| 99久久精品国产一区| 欧美精品在线一区二区三区| 精品国产青草久久久久福利| 一区在线播放视频| 性感美女久久精品| 盗摄精品av一区二区三区| 91久久国产最好的精华液| 精品国精品自拍自在线| 亚洲老妇xxxxxx| 国内成人自拍视频| 欧美日韩一级视频| 国产欧美日韩综合精品一区二区| 亚洲卡通动漫在线| 国产精品一区不卡| 欧美美女直播网站| 国产精品久久影院| 麻豆91在线播放| 在线中文字幕一区二区| 国产欧美一区二区精品婷婷 | 色欧美乱欧美15图片| 久久综合久色欧美综合狠狠| 亚洲午夜一二三区视频|