" />

欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

匯編語(yǔ)言學(xué)習(xí)手把手的Debug教程

 更新時(shí)間:2021年11月23日 17:13:27   作者:程序員cxuan  
這篇文章主要為大家分介紹了匯編語(yǔ)言學(xué)習(xí)的Debug教程內(nèi)容,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

關(guān)于匯編的第一篇文章:
愛(ài)了愛(ài)了,這篇寄存器講的有點(diǎn)意思

Hello大家好,我是程序員cxuan!我們上篇文章了解了一下基本的寄存器,這篇文章我們來(lái)進(jìn)行實(shí)際操作一下。

原文鏈接:https://mp.weixin.qq.com/s/PQzuKtSiHwZleTosvop68A

我們以后將會(huì)用到很多 Debug 命令,這里我們先來(lái)熟悉一下它們。

Debug 是什么

Debug 是 Windows / Dos 操作系統(tǒng)提供的一種功能。使用 Debug 能讓我們方便查看 CPU 各種寄存器的值、內(nèi)存情況,方便我們調(diào)試指令、跟蹤程序的運(yùn)行過(guò)程。

接下來(lái)我們會(huì)用到很多 debug 命令,但是使用這些命令的前提是,你需要在電腦上安裝一下 debug,Windows/Mac 都可以安裝,獲取鏈接我已經(jīng)給你找出來(lái)了。阿,忘記說(shuō)了,我們這里使用的是 Dos box來(lái)模擬匯編的操作環(huán)境。

傳送門(mén)(Mac 和 Windows 都是):https://www.dosbox.com/download.php?main=1

image-20211017223618159

下載完成后打開(kāi) DosBox ,打開(kāi)之后是這樣的。

image-20211017223818599

此時(shí)我們輸入 debug 命令應(yīng)該提示的是

image-20211017223853097

因?yàn)槲覀冞€沒(méi)有進(jìn)行連接和掛載,此時(shí)我們執(zhí)行

mount c D:\debug

執(zhí)行這條命令時(shí),你需要現(xiàn)在 D 盤(pán)下創(chuàng)建一個(gè) debug 文件夾,然后我們掛載到 debug 下面。

并且執(zhí)行 C: 切換到 C 盤(pán)路徑下。

image-20211017224242053

此時(shí)我們就可以執(zhí)行 debug 命令了。

image-20211017224458748

這里需要注意一點(diǎn),我在 Windows 10 系統(tǒng)下搭建 Debug 環(huán)境時(shí),在掛載完成后輸入 debug ,還是提示 Illegal command:debug ,此時(shí)你需要再下載一個(gè) debug.exe ,貼心的我也把下載地址給你了。

下載地址:http://www.dbjr.com.cn/softs/467705.html?

需要下載里面的 debug.exe,然后把它放在你掛載的路徑下,這里我掛載的路徑時(shí) D 盤(pán)下的 debug 文件夾。

放置完成之后,再輸入 debug 就可以了。

因?yàn)槊看未蜷_(kāi) Dosbox 都會(huì)執(zhí)行上面這些命令,真的好煩,那怎么辦呢?一個(gè)簡(jiǎn)單的辦法是在 Dosbox 安裝路徑下找到

image-20211017225250971

打開(kāi)之后,在末尾鍵入

image-20211017225326436

就 OK 了,下次直接打開(kāi) Dosbox ,會(huì)默認(rèn)執(zhí)行這三條命令,至此,就是我搭建 Dosbox 遇到的所有問(wèn)題了。

Debug 實(shí)戰(zhàn)

玩兒匯編得學(xué)會(huì)用 Debug ,Debug 是一種調(diào)試程序,通過(guò) Debug 能讓我們能夠看到內(nèi)存值,跟蹤堆棧情況,看到寄存器所暫存的內(nèi)容等,同時(shí)也能夠更好地幫助我們理解匯編代碼,所以學(xué)會(huì) Debug ,非常重要,這是一種不可或缺的動(dòng)手能力。

下面我們會(huì)用到幾種 Debug 命令,這里先簡(jiǎn)單介紹下。

image-20211117222634775

Debug 命令有很多,不過(guò)常用的一般就上面這幾個(gè)。

好了,現(xiàn)在我們直接進(jìn)入正題,開(kāi)始在 Dosbox 上正式進(jìn)行 Debug 操作,首先打開(kāi) Dosbox。

嗯。。。。。。這個(gè)界面我們打開(kāi)很多次了。

那我寫(xiě)個(gè)命令呢? 好吧,沒(méi)演示過(guò),下面就來(lái)了!

Debug -r

親,用 Debug -r 就可以查看和修改 CPU 寄存器內(nèi)容了呢。

查看寄存器內(nèi)容。

image-20211117225112134

這里需要注意一下 -r 大小寫(xiě)的問(wèn)題,Debug -r 是查看寄存器內(nèi)容。而 -R 則是無(wú)效指令。

上圖列出來(lái)了很多寄存器,你可能覺(jué)得無(wú)從下手,不要亂,我們先從最基本的開(kāi)始入手,也就是 CS 和 IP,CS(Code Segment)是代碼段寄存器,一般也被稱為段基址,可以認(rèn)為是程序訪問(wèn)的入口,CPU 需要從 CS 中找到從哪個(gè)位置開(kāi)始取指執(zhí)行,但是我們還不知道要取哪一段,這時(shí)候 IP 的作用就體現(xiàn)出來(lái)了,IP(Instruction Pointer)就是指令指針寄存器,也叫做偏移地址,它會(huì)告訴我們從段基址開(kāi)始,取哪一段的地址。

可以使用段基址:偏移地址來(lái)確定內(nèi)存中的指定地址。

這里我們只是簡(jiǎn)單聊一下這兩個(gè)寄存器的概念,要了解這兩個(gè)寄存器的具體作用,可以看筆者之前的文章

傳送門(mén):匯編語(yǔ)言入門(mén)匯編指令及寄存器詳解教程

使用 -r 也能夠修改寄存器的內(nèi)容,如下所示

image-20211119182455417

-r 一般的格式是 -r 寄存器,然后系統(tǒng)會(huì)進(jìn)行冒號(hào)提示,后面就是你要修改的內(nèi)容。

Debug -d

使用 -d 指令可以查看內(nèi)存中的內(nèi)容。

image-20211119183448427

輸出的內(nèi)存值默認(rèn)是按照 CS:IP 的地址開(kāi)始的,由于 CS 的值默認(rèn)是 073F,而 IP 默認(rèn)是 0100,所以 -d 的內(nèi)存值是 073F:0100 。

-d 的格式很多,下面只介紹一下常用的幾種格式。

形似 -d 1000:0 這種 -d 段基址 偏移地址的格式可以產(chǎn)生如下輸出。

image-20211119184935344

如上圖所示,Debug 會(huì)列出指定內(nèi)存單元中的的內(nèi)容。上圖中的每一個(gè) 00 都表示 8 位,如果是 4A,那么這八位展開(kāi)來(lái)說(shuō)就是 0010 1011 。每一行有 16 個(gè) 8 位,所以構(gòu)成了 128 位內(nèi)存地址。

為什么都是 00 呢,因?yàn)閮?nèi)存單元的值沒(méi)有被改寫(xiě),說(shuō)白了就是這塊內(nèi)存區(qū)域沒(méi)有存值,如何改寫(xiě)我們后面回收。

每一行的中間都有一個(gè) -,這個(gè)是為了便于我們閱讀來(lái)設(shè)置的,- 號(hào)前后都有 8 個(gè)內(nèi)存單元,這樣便于查看。

右側(cè)幾個(gè) … 表示每個(gè)內(nèi)存單元可顯示的 ASCII 碼字符,因?yàn)閮?nèi)存沒(méi)有值,所以也沒(méi)有對(duì)應(yīng)的 ASCII 碼。我們可以數(shù)一下,每行有 16 個(gè) . ,這表示每一個(gè) 00 都對(duì)應(yīng)了一個(gè) ASCII 碼。

我們可以使用 -d 1000:9 這種 -d 段基址:起始偏移地址 格式來(lái)顯示從 1000 的第幾位開(kāi)始。

image-20211119194232683

Debug 從 1000:9 開(kāi)始,一直到 1000:88,一共是 128 個(gè)字節(jié),第一行中的 1000:0 ~ 1000:8 中的內(nèi)容沒(méi)有顯示。

還可以使用 -d 1000:0 9 這種 -d 段基址:起始偏移地址 結(jié)尾偏移地址的格式來(lái)輸出。

image-20211119194856418

還可以是使用 -d 偏移地址來(lái)在不指定段基址的情況下,查看內(nèi)存值。

image-20211119201832383

Debug -e

上面說(shuō)的都是查看內(nèi)存中指定位置或者區(qū)域的值,下面我們要來(lái)改寫(xiě)一下內(nèi)存值。

使用 -e 可以改寫(xiě)內(nèi)存值,比如我們想要改寫(xiě) 1000:0 ~ 1000:f 中的內(nèi)容,可以使用 -e 1000:0 0 1 2 3 4 5 6 7 8 9 0 a b c d e f 這種方式,如下圖所示。

image-20211119201236510

這里需要注意下,在進(jìn)行 -e 改寫(xiě)的時(shí)候,每個(gè)值中間都有一個(gè)空格,如果沒(méi)有空格的話,會(huì)當(dāng)做一個(gè)內(nèi)存值來(lái)看待。

然后用 -d 1000:0 看到我們剛改寫(xiě)的內(nèi)存值。

還可以使用提問(wèn)的方式來(lái)逐個(gè)修改從某一地址開(kāi)始的內(nèi)存單元的內(nèi)容。

還是用 1000:100 來(lái)舉例子,輸出 -e 1000:100 后按下回車(chē)鍵。

image-20211119205201568

如上圖所示,可以看到我們先輸入了一次 -e 1000:100 這個(gè)指令,然后按下了回車(chē)鍵。

注意,如果這里你按下了回車(chē)鍵,就相當(dāng)于整個(gè) -e 改寫(xiě)的過(guò)程已經(jīng)完成。

如果你想要繼續(xù)改寫(xiě)后面內(nèi)存中的值,你需要按下空格鍵。

我們改寫(xiě)了 1000:100 之后的內(nèi)存值,然后使用 -d 1000:100 查看我們改寫(xiě)的內(nèi)容是否生效。

-e 命令還可以支持寫(xiě)入字符,比如我們可以向 1000:0 這個(gè)位置開(kāi)始寫(xiě)入數(shù)值和字符,-e 1000:0 1 ‘a(chǎn)' 2 ‘b' e ‘c' 。

image-20211119210708341

如上圖所示,當(dāng)我們向內(nèi)存寫(xiě)入字符 ‘a(chǎn)' ‘b' ‘c' 的時(shí)候,會(huì)自動(dòng)轉(zhuǎn)換為 ASCII 碼進(jìn)行存儲(chǔ),在最右側(cè)可以找到剛剛寫(xiě)入的字符。

Debug -u

如何向內(nèi)存中寫(xiě)入一段機(jī)器碼呢?比如我們想要在內(nèi)存中寫(xiě)入一段機(jī)器碼。

image-20211119220152007

我們可以使用 -e 來(lái)進(jìn)行寫(xiě)入,向內(nèi)存中寫(xiě)入 b8 01 00 b9 02 00 01 c8 這個(gè)機(jī)器碼,如下所示

image-20211119224014093

我們使用 -e 寫(xiě)入之后,使用 -d 查看內(nèi)存值,可以發(fā)現(xiàn)我們剛剛寫(xiě)入的值,但是卻看不到機(jī)器碼,所以機(jī)器碼該如何看呢?

別急,還有個(gè) -u 命令,這個(gè)就是看機(jī)器碼的,如下圖所示,我們使用 -u 命令顯示我們寫(xiě)入的機(jī)器碼。

image-20211119224851565

可以看到 1000:0000 ~ 1000:0006 這個(gè)內(nèi)存地址使我們寫(xiě)入的機(jī)器碼,-u 這個(gè)命令就是將內(nèi)存單元的內(nèi)容翻譯為匯編指令并顯示。

-u 輸出的結(jié)果分為三部分顯示:

  • 最左側(cè)是每一條機(jī)器指令的地址;
  • 中間是機(jī)器指令;
  • 最右側(cè)是機(jī)器指令執(zhí)行的匯編指令。

1000:0 處存放的是寫(xiě)入的機(jī)器碼 B8 01 00 組成的機(jī)器指令,對(duì)應(yīng)的匯編指令是 MOV AX,0001。

1000:0003 處存放的是寫(xiě)入的機(jī)器碼 B9 02 00 組成的機(jī)器指令,對(duì)應(yīng)的匯編指令是 MOV CX,0002。

1000:0006 處存放的是寫(xiě)入的機(jī)器碼 C1 C8 所組成的機(jī)器指令,對(duì)應(yīng)的匯編指令是 add ax,cx。

Debug -t

上面介紹的一系列指令包括我們上面提到的 Debug -e 機(jī)器碼都是向內(nèi)存中進(jìn)行寫(xiě)入,那么如何執(zhí)行這些指令呢?

我們可以使用 Debug -t 來(lái)執(zhí)行寫(xiě)入的指令。使用 Debug -t 可以執(zhí)行由 CS:IP 指向的指令。

既然是 -t 能夠執(zhí)行從 CS:IP 指向的命令,所以我們有必要將 CS:IP 指向 1000:0(因?yàn)槲覀兦懊鎸⒅噶顚?xiě)在了 1000:0 處)。

首先我們需要執(zhí)行 -r cs 1000 ,-r ip 0 把 CS:IP 賦值為 1000:0。

然后執(zhí)行 -t 指令,下圖是已經(jīng)執(zhí)行過(guò)的指令截圖。

image-20211120060826534

可以看到,執(zhí)行完 -t 指令之后,MOV AX,0001 這條指令被執(zhí)行,當(dāng)前 AX 寄存器的內(nèi)容變?yōu)榱?0001,這條匯編指令的意思就是把 0001 移動(dòng)到 AX 寄存器中。

繼續(xù)執(zhí)行 -t 之后,我們可以看到寄存器的變化。

image-20211120061105506

Debug -a

畢竟機(jī)器指令不是那么好懂,寫(xiě)入很不方便,所以有沒(méi)有辦法能夠支持我們直接寫(xiě)入?yún)R編指令呢?還真有,Debug 提供了 -a 這種方式來(lái)實(shí)現(xiàn)匯編指令的寫(xiě)入。如下圖所示

image-20211120230320647

可以看到,我們使用了 -a 命令來(lái)對(duì) 1000:0 進(jìn)行寫(xiě)入,分別輸入 mov ax,1 mov bx,2 mov cx,3 add ax,bx add ax,cx add ax,ax 指令,然后按回車(chē)進(jìn)行確定執(zhí)行。

我們使用 -d 1000:0 f 可以看到從偏移地址 0 處開(kāi)始的第 f 個(gè)內(nèi)存指令(因?yàn)樽畲髮?xiě)入的地址只是 f)。

image-20211120231016386

上圖中的 1000:000F 為什么有值呢,因?yàn)槲覀兩厦嬉呀?jīng)執(zhí)行過(guò)這個(gè)寫(xiě)入了。

另外,使用 -a 可以從一個(gè)預(yù)設(shè)的地址處開(kāi)始輸入指令。

總結(jié)

今天和大家聊了一下 Debug 的基本用法,主要包括

-r 查看、修改寄存器中的內(nèi)容

-d 查看內(nèi)存中的指令

-e 修改內(nèi)存中的內(nèi)容

-u 可以將內(nèi)存中的內(nèi)容解釋為機(jī)器指令和對(duì)應(yīng)的匯編指令

-t 執(zhí)行 CS:IP 處的指令

-a 以匯編得形式向內(nèi)存寫(xiě)入內(nèi)容

匯編指令的選項(xiàng)有很多,上面介紹的這些屬于經(jīng)常用到的指令,這些指令要能夠熟練使用。

以上就是匯編語(yǔ)言學(xué)習(xí)手把手的Debug教程的詳細(xì)內(nèi)容,更多關(guān)于匯編語(yǔ)言Debug教程的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 匯編 JMP使用詳解

    匯編 JMP使用詳解

    這篇文章主要介紹了匯編 JMP使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • ARM匯編解決階乘及大小寫(xiě)轉(zhuǎn)換的問(wèn)題

    ARM匯編解決階乘及大小寫(xiě)轉(zhuǎn)換的問(wèn)題

    這篇文章主要介紹了ARM匯編解決階乘及大小寫(xiě)轉(zhuǎn)換,包括ARM匯編大小寫(xiě)轉(zhuǎn)換以及存入內(nèi)存的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-11-11
  • 純匯編實(shí)現(xiàn)打飛機(jī)小游戲的示例代碼

    純匯編實(shí)現(xiàn)打飛機(jī)小游戲的示例代碼

    這篇文章主要介紹了純匯編實(shí)現(xiàn)打飛機(jī)小游戲的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 在vs2017中編寫(xiě)匯編的實(shí)現(xiàn)(圖文)

    在vs2017中編寫(xiě)匯編的實(shí)現(xiàn)(圖文)

    這篇文章主要介紹了在vs2017中編寫(xiě)匯編的實(shí)現(xiàn)(圖文),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • 匯編語(yǔ)言功能用循環(huán)累加實(shí)現(xiàn)乘法

    匯編語(yǔ)言功能用循環(huán)累加實(shí)現(xiàn)乘法

    這篇文章主要為大家介紹了匯編語(yǔ)言實(shí)現(xiàn)功能,使用用循環(huán)累加來(lái)實(shí)現(xiàn)乘法,文中通過(guò)幾個(gè)問(wèn)題實(shí)例分析,來(lái)為大家進(jìn)行詳細(xì)講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11
  • x86匯編DOS編程環(huán)境搭建過(guò)程

    x86匯編DOS編程環(huán)境搭建過(guò)程

    在學(xué)習(xí)x86匯編時(shí),第一步是搭建一個(gè)可以編譯、運(yùn)行代碼的環(huán)境,這個(gè)搭建方法也真的超簡(jiǎn)單,本文重點(diǎn)給大家介紹x86匯編DOS編程環(huán)境搭建過(guò)程,感興趣的朋友一起看看吧
    2021-11-11
  • 匯編語(yǔ)言編譯環(huán)境搭建過(guò)程

    匯編語(yǔ)言編譯環(huán)境搭建過(guò)程

    這篇文章主要介紹了匯編語(yǔ)言編譯環(huán)境搭建過(guò)程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-01-01
  • 匯編語(yǔ)言偽指令和匯編指令的區(qū)別

    匯編語(yǔ)言偽指令和匯編指令的區(qū)別

    指令是控制程序運(yùn)行時(shí)的機(jī)器代碼運(yùn)作的,是CPU執(zhí)行的依據(jù),編程、編譯、執(zhí)行都是有效的。偽指令不直接控制運(yùn)行時(shí)刻的機(jī)器,但是控制翻譯程序如何生成機(jī)器指令代碼,感興趣的朋友跟隨小編一起看看吧
    2020-01-01
  • 匯編語(yǔ)言學(xué)習(xí)手把手的Debug教程

    匯編語(yǔ)言學(xué)習(xí)手把手的Debug教程

    這篇文章主要為大家分介紹了匯編語(yǔ)言學(xué)習(xí)的Debug教程內(nèi)容,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2021-11-11
  • 詳解匯編語(yǔ)言RCL(帶進(jìn)位循環(huán)左移)和RCR(帶進(jìn)位循環(huán)右移)指令

    詳解匯編語(yǔ)言RCL(帶進(jìn)位循環(huán)左移)和RCR(帶進(jìn)位循環(huán)右移)指令

    這篇文章主要介紹了匯編語(yǔ)言RCL(帶進(jìn)位循環(huán)左移)和RCR(帶進(jìn)位循環(huán)右移)指令的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-01-01

最新評(píng)論