我是一個非常新的彙編編碼器,其中大部分對我而言仍然是陌生的。我的代碼如下基本彙編代碼崩潰DOS模擬器
0100: mov ah, 09
0102: mov dx, 010A
0105: int 21h
0107: int 20h
010A: db "Hello World!$"
運行這段代碼在我的DOS模擬器(DOSBox中)導致模擬器窗口產生的「Hello World!」消息並繼續凍結並最終導致「程序沒有響應」錯誤。
我是一個非常新的彙編編碼器,其中大部分對我而言仍然是陌生的。我的代碼如下基本彙編代碼崩潰DOS模擬器
0100: mov ah, 09
0102: mov dx, 010A
0105: int 21h
0107: int 20h
010A: db "Hello World!$"
運行這段代碼在我的DOS模擬器(DOSBox中)導致模擬器窗口產生的「Hello World!」消息並繼續凍結並最終導致「程序沒有響應」錯誤。
它凍結,因爲你沒有正確退出你的應用程序。嘗試改爲:
mov ah, 4C00h;
int 21;
應該這樣做。 至於說明這裏發生了什麼,我們必須抓住INT 20和INT 21的參考。正如你所看到的,它們都是爲了終止應用程序,但是INT 20是傳統的做法,後來被21,4c取代。兩者之間的主要區別在於INT 20只是終止了進程,而INT 21,4C也返回了適當的返回代碼(這是所有現代應用程序所期望的)。
就構造本身而言,通過向註冊表AH移動「4C00h」(您應該能夠脫離「4Ch」),我們告訴INT 21我們感興趣的功能。因爲不像INT 20,它只有一個目的,INT 21 has a long list of them,並通過在註冊表中設置適當的值,INT 21知道它的期望。
謝謝Puciek,這工作完美!你能解釋int 20h(我被告知終止你的程序)和mov ah,4C00之間的區別嗎? – user2581242 2014-11-03 15:44:55
@ user2581242我已經擴展了答案。 – 2014-11-03 15:54:43
@ user2581242:除Puciek的回答外,請查看http://support.microsoft.com/kb/72848/en-us。對於'INT 20h',CS指向一個**正確的** PSP是很重要的,例如,不能由'DEBUG.EXE'保證。 – rkhb 2014-11-03 16:32:09
在我的dosbox中正常工作。也許試試'mov ax,4C00h; int 21h'而不是'int 20h'退出。 – Jester 2014-11-03 15:33:13