色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

簡單聊聊什么是段

程序員cxuan ? 來源:程序員cxuan ? 2023-02-20 09:31 ? 次閱讀

這是 x86 匯編連載系列第六篇文章,前五篇文章見文末。

一個小細節

從開始到現在我們接觸到了兩種匯編指令的編寫方式,一種是在 dosbox 上的 debug 模式下通過 debug -a 的方式來編寫,如下圖所示:

8a6df0ba-b0b2-11ed-bfe3-dac502259ad0.png

這種方式能讓你在 dosbox 中直接編寫匯編代碼,簡單直接,不需要寫偽指令,方便快捷。

還有一種方式需要我們在 dosbox 外部編寫匯編源文件,源文件中的代碼經由 MASM 匯編編譯、LINK 指令鏈接后一種,如下圖所示:

8a8aa462-b0b2-11ed-bfe3-dac502259ad0.png

乍一看這兩種方式編寫的匯編源代碼應該都能正確的執行,于是我們分別用兩種不同的方式寫下了

8aaca7e2-b0b2-11ed-bfe3-dac502259ad0.png

這幾條指令。這三條指令很簡單,我們的目的很明確,我們想把內存地址為 ds:[1], ds[2], ds[3] 的數據分別送入 al,bl,cl 寄存器。下面我們執行一下:

使用 debug 方式的截圖如下:

8ac43b78-b0b2-11ed-bfe3-dac502259ad0.png

如圖所示,在使用 debug 方式中,"[ ]" 內的指令會被直接當做內存地址進行 mov。

使用 masm 編譯器方式的截圖如下:

8adea3c8-b0b2-11ed-bfe3-dac502259ad0.png

如圖所示,當我們使用 MASM 進行編譯和鏈接后,[ ] 號中的 1 會被直接編譯為數值 01,而不是 [1] 這個內存地址。這個是編譯規定,大家要記住這個細節。

也就是說,誠如 [idata] 這種形式,debug 和 masm 匯編器對其有不同的解釋,debug 認為 [1] 中的就是一個內存地址,而 masm 認為 [1] 就是一個 idata 立即數。

話又說回來了,如果我們想在匯編源文件中表示內存地址,該怎么辦呢?

這就需要借助一個寄存器了 --- bx。

比如下面這段匯編代碼

8b01f364-b0b2-11ed-bfe3-dac502259ad0.png

首先將 ds 寄存器設置為 2000 ,也就是 ds = 2000h,然后把 0 放入 bx 中,最后的 mov al,[bx] 就會默認從內存地址ds:[0] 處提取數據進行移動。

這樣當然是可以的,不過仍然比較繁瑣,我們不想要每次 mov 內存數據還要經過 bx 中轉,我們想要像 debug 那樣直接 mov ,該怎么做呢?其實也比較簡單,直接顯示指出段寄存器:[內存偏移]即可。

看下面這段匯編代碼:

8b1cc1c6-b0b2-11ed-bfe3-dac502259ad0.png

如果你想要通過 MASM 的方式來取得 ds:[0] 處內存地址的話,就需要顯示指定段寄存器,如果沒有顯示指定的話,默認按照 01 數值來處理。

所以我們可以總結一下上面所探討的內容(基于 MASM 匯編編譯器下)

mov al,[0] :將數值 0 送入 al 寄存器中,(al) = 0。

mov al,ds:[0]:(al) = ((ds) * 16 + 0) , 將內存單元中的數據送入 al 中,段地址為 ds。

mov al,[bx]:(al) = ((ds) * 16 + bx) , 將內存單元的數據送入 al 中,段地址為 ds。

mov al,ds:[bx] :和 mov al,[bx] 含義相同

還可以更為精簡的總結一點:

MASM 匯編編譯器會將 [idata] 編譯為 idata,若想訪問內存地址,則必須顯示指定段地址或者使用 bx 進行中轉。

上面這些內容在本人其他文章中已經涉及到了,不過講的不太細致,這篇文章算是細致的講了下。

段前綴

上面的內容多次提到了一個名詞就是 段,段所表示的其實也是一段內存空間,不過這種劃分的方式是由 CPU 來決定的,內存并不會分為多個段。段的劃分是主要為了 CPU 能夠更方便的尋址,要想尋找段內的每個地址和數據,都需要有兩個概念:段基址和段內偏移。

在匯編語言中,一般通過 [bx] 來給出偏移地址,它的段基礎在 ds 中,ds 是默認的段寄存器。

不過,只有一個 ds 段顯然是無法應對復雜程序的尋址方式的,所以還可能會有多個段,如下所示:

8b37e7f8-b0b2-11ed-bfe3-dac502259ad0.png

上面列舉了四種不同的段寄存器和尋址方式。

第一條指令把段基址為 ds,偏移地址為 bx 的內存地址的內容送入 ax ,長度為 2 個字節單元,也就是一個字,16 位。

第二條指令把段基址為 cs,偏移地址為 bx 的內存地址的內容送入 ax ,長度為 2 個字節單元,一個字,16 位。

第三條指令把段基址為 ss,偏移地址為 bx 的內存地址的內容送入 ax ,長度為 2 個字節單元,一個字,16 位。

第四條指令把段基址為 es,偏移地址為 bx 的內存地址的內容送入 ax ,長度為 2 個字節單元,一個字,16 位。

由于 ds、cs、ss、es 都是顯示指出的,所以 ds、cs、ss、es 又被稱為段前綴。

一段安全的存儲空間

我們寫出的程序經過編譯連接后,會由操作系統分配內存空間,我們并不知道哪些內存空間是有用的,哪些內存空間是保留的,哪些內存空間是可以使用的,由于有些內存空間存儲著重要的系統數據或代碼,所以我們最好不要隨意的向內存空間寫入數據,這是很危險的,比如下面這幾條指令:

8b4daac0-b0b2-11ed-bfe3-dac502259ad0.png

之前為了方便,我們沒有判斷 1000:[0] 這個內存空間有沒有存放重要代碼或數據就將數據寫入其中,這種做法是錯誤的,如果 1000:[0] 處剛好存放著文件系統的起始代碼,那么 mov ds:[0],al 就會將其改寫,引發系統崩潰。

再看一段程序:

8b67ed54-b0b2-11ed-bfe3-dac502259ad0.png

我們編寫好代碼后,進行編譯鏈接,debug 這段代碼:

8b80817a-b0b2-11ed-bfe3-dac502259ad0.png

當我們執行完 mov ds:[26h],ax 后,說什么也執行不下去了。

并不是我不想執行了,而是系統不讓我執行了,因為系統死機了。。。。。。大家可以試試。

所以,在不清楚這段內存空間是干什么的時候,最不好要隨意向內存空間寫入數據。由于內存空間是由操作系統直接分配的,所以要想向一段內存空間寫入數據的話,要使用操作系統給我們分配的內存空間。

那么話又說回來了,操作系統給我們分配了哪些空間可以安全的寫入數據呢?

在一般的 PC 機,DOS 方式下,DOS 和其他合法程序一般都不會使用0:200 ~ 0:2ff(00200h ~ 002ffh)這段 256 個字節的空間,可以認為這段內存區域是安全的。

不過為了謹慎起見,我們寫入的時候,最好使用 debug -d 來看一下這段內存區域有沒有存儲數據。

段前綴的使用

考慮一個問題,如何將內存 ffff:0 ~ ffff:b 單元中的數據復制到 0:200 ~ 0:20b 單元中?

需要考慮以下幾點:

0:200 ~ 0:20b 其實就是 200:0 ~ 200:b ,這就是對同一段內存空間的兩種不同的描述。

上面是兩段不同的內存空間,所以需要兩個段基址,通過一個寄存器 dl 來進行中轉,把 ffff:0 ~ ffff:b 地址空間的數據復制到 dl 中,然后把 dl 中的數據再復制到 0:200 ~ 0:20b 中。

一共復制 (b - 0) + 1 = 12 次。

開碼!

8ba2a192-b0b2-11ed-bfe3-dac502259ad0.png

從上面代碼可以看到,我們顯示使用了兩種段前綴 ds 和 es ,這就是一個段前綴的使用案例。

我們分別將 0ffffh 和 200h 賦給了 ds 和 es 寄存器,然后設置 cx 循環次數為 12 次,s 是一個偽指令,表示循環的開始處,每個循環中都會把 0ffff:[bx] 中的數據賦值給 dl ,因為這是一個內存地址,所以使用 8 位寄存器就可以接收,然后將 dl 中的數據賦值給 200:[bx] 處,再執行循環。

審核編輯 :李倩

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5336

    瀏覽量

    120238
  • 代碼
    +關注

    關注

    30

    文章

    4780

    瀏覽量

    68530
  • 編譯器
    +關注

    關注

    1

    文章

    1624

    瀏覽量

    49108

原文標題:簡單聊聊什么是段

文章出處:【微信號:cxuangoodjob,微信公眾號:程序員cxuan】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    簡單聊聊什么是功率因數

    在交流系統中,電源提供正弦電壓波形,負載則主導電流波形。在加熱器或白熾燈泡等最簡單的“阻性”負載中,電流波形與電壓波形形狀一致,并且相位(時間軸)也保持一致。
    發表于 07-14 16:55 ?1094次閱讀
    <b class='flag-5'>簡單</b>的<b class='flag-5'>聊聊</b>什么是功率因數

    高通產品的進來聊聊

    高通產品的進來聊聊,共享一下資源.
    發表于 01-03 14:32

    為什么加入程序code會反而減小呢?

    今天在調試程序的過程中發現個挺有趣的問題:請大神們過來討論一下,我就不選最佳了,讓系統自己選。畢竟是跟大神們聊聊天而已。為什么加入程序code會反而減小呢?能說下真實理解么
    發表于 06-16 09:03

    聊聊CMSIS

    這次我們來聊聊CMSIS。之前在Kile環境下創建STM32工程的時候,對有些文件的加入總不是很了解,書上或網上建立工程的教程對于這些文件的加入也是一筆帶過,或者直接不說。對于類似名叫
    發表于 08-24 07:50

    聊聊對按鍵掃描軟件結構的理解

    按鍵掃描,我想應該是比較簡單的單片機應用了,但是有時候看起來簡單的東西反而不好寫。本文拿大部分人覺得簡單的按鍵掃描聊聊我工作至今對于軟件結構的理解。嗯,對的,是結構,不是架構,暫時不敢
    發表于 12-02 06:27

    聊聊基于STM32F103的紅外循跡避障小車的Proteus仿真

    紅外循跡及紅外避障實現較簡單,無論是51單片機還是STM32單片機,其例程隨處可見。但是完全可以運行的Proteus仿真,開源的并不多,更不要說基于STM32單片機的仿真。下面跟大家聊聊基于STM32F103的紅外循跡避障小車的Proteus仿真。
    發表于 01-05 06:46

    聊聊復位電路

    時鐘電路我第一篇博客已經說講過了,今天我們來聊聊復位電路。當然,復位電路博大精深,并...
    發表于 01-17 07:50

    聊聊存儲器的相關知識

    虛擬地址物理地址等眾多地址及MMU相關知識先聊聊存儲器STM32單片機存儲器關于編譯器生成的文件數據在存儲器上的存儲結構物理地址、虛擬地址、線性地址和邏輯地址物理地址虛擬地址邏輯地址線性地址這些地址
    發表于 02-11 07:51

    碼LCD驅動簡單原理是什么

    時鐘的冒號“:”,這樣如果使用IO口直接掃描顯示,則會減小PCB面積,降低成本。但是,本方案不合適驅動太多的(占用IO太多),也不合適非常低功耗的場合。碼LCD驅動簡單原理:如圖1所示。LCD是一種...
    發表于 02-18 07:54

    聊聊光敏傳感器最簡單的使用

    描述的可能也有不清楚的地方,有問題的小伙伴可以私聊我,一起學習共同進步。今天發現了一個很有意思的傳感器——光敏傳感器,它可以判斷光線的亮暗,當然亮暗是個相對的說法,它可以自己設定閾值,今天來聊聊
    發表于 02-24 07:50

    簡單聊聊伺服電機啟動電流的問題

      現在EPU和EMA應用越來越廣泛,作為液壓領域的從業者,對電機有個基本的了解是有必要的。  今天簡單聊聊伺服電機啟動電流的問題。  1 電機啟動電流相比于正常工作電流是大是小?為什么?  2
    發表于 03-16 17:38

    一文了解多個的相關程序

    上回我們簡單認識了一下什么是前綴和一安全的空間是哪里,但是程序中不會僅有一個,復雜程
    的頭像 發表于 03-08 14:28 ?600次閱讀

    簡單聊聊MCAL的最小工程

    英飛凌的芯片在汽車電子里用得可謂是頗多,最近剛好在摸TC3系列的CAN模塊,來簡單聊聊MCAL的最小工程。
    的頭像 發表于 03-21 09:25 ?2615次閱讀

    聊聊Redis的使用案例

    今天我們來聊聊 Redis 的使用案例。
    的頭像 發表于 12-13 14:13 ?507次閱讀

    聊聊半導體產品的8大封裝工藝

    今天我們聊聊半導體產品的封裝工藝,一提到“封裝”,大家不難就會想到“包裝”,但是,封裝可不能簡單的就認為等同于包裝的哦
    的頭像 發表于 02-23 14:42 ?3202次閱讀
    <b class='flag-5'>聊聊</b>半導體產品的8大封裝工藝
    主站蜘蛛池模板: 亚洲免费无码中文在线| 色综合久久中文色婷婷| 蜜桃AV色欲A片精品一区| 麻豆婷婷狠狠色18禁久久| 蜜桃人妻无码AV天堂三区| 欧美白人极品性喷潮| 视频一区视频二区ae86| 学生小泬无遮挡女HD| 一个色综合久久| 18岁男人女人插孔| 被黑人做的白浆直流| 贵妇局长的蕾丝乳罩| 国产在线精品亚洲视频在线| 久久99热在线观看7| 男的插曲女的下面免费APP| 日韩内射美女人妻一区二区三区| 无码国产成人午夜在线观看不卡| 亚洲三级在线视频| 99久久国产综合色| 国产AV白丝爆浆在线播放| 黄页网站免费视频大全9| 美女内射视频WWW网站午夜| 日日噜噜噜噜夜夜爽亚洲精品| 亚洲高清国产拍精品动图| 2020国产成人免费视频| 古风H啪肉NP文| 久久国产亚洲电影天堂| 青青草原在线新免费| 亚洲免费观看| WRITEAS塞红酒瓶| 国产在线精品亚洲视频在线| 欧美18精品久久久无码午夜福利 | 日本阿v在线资源无码免费| 亚洲 日韩 欧美 另类 蜜桃| 2021国产精品国产精华| 国产盗摄一区二区三区| 啦啦啦视频在线观看WWW| 视频一区亚洲中文字幕| 最懂男人心论坛| 国产美女一区二区| 男人J桶进男人屁股过程|