16位代码段与32位代码段的区别
生活随笔
收集整理的這篇文章主要介紹了
16位代码段与32位代码段的区别
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
16位代碼段與32位代碼段的區別:
16位代碼段與32位代碼段的區別如下:
16位代碼段最長只能為64k,段內偏移量為16位,默認的指令地址及操作地址為16位;
?32位代碼段最長可以4G,段內偏移量為32位,默認的指令地址及操作地址為32位。
是否能夠使用 ? eax, ? edx ? 等寄存器與是否使用16位代碼段及32位代碼段無關。16位代碼段、32位代碼段都可以使用 ? eax, ? edx ? 等寄存器。
如果要使用 ? eax, ? edx ? 等32位寄存器,必須在代碼中指定 ? .386, ? .386p, ? .486, ? .486p ? 等指示符。
在DOS實模式下,只能使用16位代碼段。
在MASM中,如果把 ? .386, ? .386p, ? .486, ? .486p ? 等指示符放在 ? .model ? 之前,那么所有的段(數據段、代碼段)默認為32位; 如果把 ? .386, ? .386p, ? .486, ? .486p ? 等指示符放在 ? .model ? 之后,那么所有的段(數據段、代碼段)默認為16位。
可以在定義段時,用 ? USE16 ? 或 ? USE32 ? 明確指定是使用16位的段(數據段、代碼段)還是32位的段(數據段、代碼段)。
部分參考資料:
http://www.arl.wustl.edu/~lockwood/class/cs306/books/artofasm/Chapter_8/CH08-3.html#HEADING3-42
首先要明確兩個概念:寄存器的位數和段的位數是兩個不同的概念。
寄存器的位數這個很容易理解~段的位數卻有點麻煩。
我們知道,8086的CPU的寄存器是16位的,80386以上的CPU是32位的;這在匯編語言中的體現就是.386p等偽指令。
如果你使用了.386p偽指令,那么匯編的編譯程序才會將你的指令編譯為80386認識的機器指令,匯編語言默認的是使用.8086偽指令,很明顯,這個時候匯編編譯程序只是將你的匯編程序編譯為8086認識的機器語言,這個時候當然也不可以用EAX等寄存器了,不然編譯程序會出現錯誤提示。如果你要使用EAX等寄存器,就要這個之前加上.386或者之上的偽指令。
簡單的來說,寄存器的位數是.386等偽指令決定的,和其他無關。
而段的位數卻是由段定義說明中的use16和use32這兩個中的其中一個決定的。其實,匯編編譯程序在將USE16或者USE16編譯成機器語言的時候,就是段描述符中的第6個字節的第6位(我們一般稱為D位),如果是USE16,就將該為設為0,如果是USE32,就設置為1
16位的代碼段和32位的代碼段很明顯的一個區別就是段大小的限制:一個是64k,一個是4G。細節上卻有很多差別,比如對于一個Push ? 10h這樣一個指令,如果段是16位的,sp=sp-2,如果段是32位
的,就是sp=sp-4,當然,如果如果你是PUSH ? EAX的話,無論段是16位還是32位,都是SP=SP-4。
還有很多細節,這里就不多說了。
16位代碼段與32位代碼段的區別如下:
16位代碼段最長只能為64k,段內偏移量為16位,默認的指令地址及操作地址為16位;
?32位代碼段最長可以4G,段內偏移量為32位,默認的指令地址及操作地址為32位。
是否能夠使用 ? eax, ? edx ? 等寄存器與是否使用16位代碼段及32位代碼段無關。16位代碼段、32位代碼段都可以使用 ? eax, ? edx ? 等寄存器。
如果要使用 ? eax, ? edx ? 等32位寄存器,必須在代碼中指定 ? .386, ? .386p, ? .486, ? .486p ? 等指示符。
在DOS實模式下,只能使用16位代碼段。
在MASM中,如果把 ? .386, ? .386p, ? .486, ? .486p ? 等指示符放在 ? .model ? 之前,那么所有的段(數據段、代碼段)默認為32位; 如果把 ? .386, ? .386p, ? .486, ? .486p ? 等指示符放在 ? .model ? 之后,那么所有的段(數據段、代碼段)默認為16位。
可以在定義段時,用 ? USE16 ? 或 ? USE32 ? 明確指定是使用16位的段(數據段、代碼段)還是32位的段(數據段、代碼段)。
部分參考資料:
http://www.arl.wustl.edu/~lockwood/class/cs306/books/artofasm/Chapter_8/CH08-3.html#HEADING3-42
首先要明確兩個概念:寄存器的位數和段的位數是兩個不同的概念。
寄存器的位數這個很容易理解~段的位數卻有點麻煩。
我們知道,8086的CPU的寄存器是16位的,80386以上的CPU是32位的;這在匯編語言中的體現就是.386p等偽指令。
如果你使用了.386p偽指令,那么匯編的編譯程序才會將你的指令編譯為80386認識的機器指令,匯編語言默認的是使用.8086偽指令,很明顯,這個時候匯編編譯程序只是將你的匯編程序編譯為8086認識的機器語言,這個時候當然也不可以用EAX等寄存器了,不然編譯程序會出現錯誤提示。如果你要使用EAX等寄存器,就要這個之前加上.386或者之上的偽指令。
簡單的來說,寄存器的位數是.386等偽指令決定的,和其他無關。
而段的位數卻是由段定義說明中的use16和use32這兩個中的其中一個決定的。其實,匯編編譯程序在將USE16或者USE16編譯成機器語言的時候,就是段描述符中的第6個字節的第6位(我們一般稱為D位),如果是USE16,就將該為設為0,如果是USE32,就設置為1
16位的代碼段和32位的代碼段很明顯的一個區別就是段大小的限制:一個是64k,一個是4G。細節上卻有很多差別,比如對于一個Push ? 10h這樣一個指令,如果段是16位的,sp=sp-2,如果段是32位
的,就是sp=sp-4,當然,如果如果你是PUSH ? EAX的話,無論段是16位還是32位,都是SP=SP-4。
還有很多細節,這里就不多說了。
總結
以上是生活随笔為你收集整理的16位代码段与32位代码段的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 递归解决汉诺塔问题
- 下一篇: Ubnutu虚拟机怎么修改开机密码?(在