準備工作
-
64位CPU
安裝DOSBOX
以及debug.exe
(點我查看教程) - 打開
DOSBOX
宛蚓,輸入mount
命令激捏,輸入C:
,輸入debug
(每一次都按下回車確認)
mount C E:\assembly-learn
C:
debug
準備就緒凄吏,可以輸入各種 debug 命令
debug
命令
R 寄存器 查看远舅、修改
D 內(nèi)存 查看
E 內(nèi)存 (數(shù)據(jù)闰蛔、機器碼)寫指令
U 內(nèi)存 翻譯成匯編指令
T 執(zhí)行CS:IP 指向的內(nèi)存單元的指令
A 內(nèi)存 匯編形式寫指令
內(nèi)存和寄存器不是一回事
- 寄存器在cpu內(nèi)部,是cpu內(nèi)部的其中一個部件图柏。
- 內(nèi)存 是和 cpu 同一個層次的兩個獨立的部件序六,通過總線(地址總線和數(shù)據(jù)總線等)傳遞數(shù)據(jù)。
- 內(nèi)存和寄存器都可以存儲數(shù)據(jù)蚤吹,但是內(nèi)存中的數(shù)據(jù)只有被讀成指令并且執(zhí)行之后例诀,才可以改變寄存器中的內(nèi)容,沒有說內(nèi)存一變寄存器就變了裁着,反之余佃,寄存器一變內(nèi)存未必也跟著變,要清楚它們都是獨立的跨算。
———————————————————————————————————
寄存器(CPU)
r 命令
r
命令 查看寄存器 的內(nèi)容
r命令 查看 寄存器 的內(nèi)容
r
命令 修改 寄存器 的內(nèi)容
r ax 修改 寄存器ax 的內(nèi)容
- 輸入
r ax
會出現(xiàn)提示符:
,冒號之后輸入新的數(shù)據(jù)椭懊,按下回車確認
———————————————————————————————————
內(nèi)存
d命令
d 命令 查看 內(nèi)存中的內(nèi)容
d 命令查看內(nèi)存中的內(nèi)容
-d 段地址:偏移地址
- 比如 2B 本質(zhì)是 2BH(十六進制形式 16進制里一位用 2進制里四位 表示)诸蚕,0010 1011(二進制形式 有8位),二進制很容易數(shù)出來是8bit(位)氧猬,8bit(位)一個B(Byte字節(jié))
- 1個內(nèi)存單元可以存一個Byte(字節(jié))
-
d 1000:0
查看內(nèi)存單元10000H
處開始的內(nèi)容背犯,將列出從10000H
開始的128
個內(nèi)存單元的內(nèi)容,16
個內(nèi)存單元一行盅抚,一共有8
行 - 左邊的列漠魏,是本行的起始內(nèi)存地址,每一行有
16
個內(nèi)存單元妄均,以1000:0060
舉例柱锹,這一行是1000:0060
到1000:006F
- 中間列的
小橫杠
只是視覺上表示前后,前半是1000:0060 ~ 1000:0067
丰包,后半是1000:0068 ~ 1000:006F
- 右邊的列禁熏,是可顯示的
ASCII
碼字符,與中間列一 一對應
d命令 查看 限定范圍的內(nèi)存的內(nèi)容
查看1000:0~1000:9 內(nèi)存單元中的內(nèi)容
d 1000:0 9
- 查看
1000:0~1000:9
內(nèi)存單元中的內(nèi)容
d 073F:011C 011C
查看單個內(nèi)容單元的內(nèi)容
d 073F:011C 011C 查看單個內(nèi)容單元的內(nèi)容
段地址:偏移地址 偏移地址
d 1000:0 0
d 0fff:10 10
d 0100:f000 f000
計算出來得到的物理地址都是 10000H
-
段地址:偏移地址
邑彪,計算得出的 物理地址 是一樣的話瞧毙,就是查看同一個內(nèi)存單元的內(nèi)容 - 后面重復寫一次偏移地址,就會給單個內(nèi)存單元的內(nèi)容
- 如果不寫寄症,就是從這個物理地址開始之后的內(nèi)存單元內(nèi)容
e 命令
e 命令改寫內(nèi)存中的內(nèi)容
e 命令改寫內(nèi)存中的內(nèi)容
- d 顯示單獨的一行
d 1000:0 F
顯示的是1000:0000 ~ 1000:000F
d 1000:0010 1F
顯示的是1000:0000 ~ 1000:001F
- e 修改內(nèi)容
一口氣全部改寫:
e 1000:0 0 1 2 3 4 5 6 7 8 9
直接修改了從1000:0開始的10個單元的內(nèi)容
一個一個地改寫:
e 1000:0010
只給一個起始的地址宙彪,這里是第二行的起始地址
命令行窗口會出現(xiàn) 00. ,后面有一個閃爍的圖標
如果想要改寫內(nèi)容
輸入你想要寫的內(nèi)容 按下【空格鍵space】確認輸入
注意是有巧,鍵盤上長長的那個【空格鍵 space】释漆,而不是【回車鍵 enter】
如果不想改寫內(nèi)容
直接按下【空格鍵space】,就會跳到下一個閃爍的位置了
想做的修改都做完了剪决,按【回車鍵 enter】結(jié)束本次 e 命令的全部操作
- e 命令可以寫
數(shù)值 灵汪、字符檀训、字符串
e 命令可以寫 數(shù)值 、字符享言、字符串
e 1000:0 F 1 2 3 'h' 'e' 'l' 'l' 'o' "world"
字符 單引號 ' '
字符串 雙引號 " "
———————————————————————————————————
E 寫 U看 T執(zhí)行 (內(nèi)存中的機器碼)
- 要用到的 機器碼 和 對應的 匯編指令
機器碼 對應的匯編指令 指令含義
b80100 mov ax,0001 將數(shù)據(jù) 0001 放入寄存器 ax
b90200 mov cx,0002 將數(shù)據(jù) 0002 放入寄存器 cx
01c8 add ax,cx ax = ax + cx
- 用
E 命令
將機器碼寫入 內(nèi)存 內(nèi)存 內(nèi)存 - 用
U 命令
將從1000:0H
開始的內(nèi)存單元中的內(nèi)容翻譯成匯編指令
E命令寫機器碼到內(nèi)存 U命令翻譯機器碼成匯編指令
用
R 命令
查看當前寄存器的內(nèi)容峻凫,會看到當前的CS:IP是073F:0100
用
R 命令
改寫寄存器 寄存器 寄存器的內(nèi)容-
使得
CS = 1000H
,讓IP = 0000H
览露,最后CS:IP指向10000H
R 命令 修改 寄存器 CS:IP 用
T 命令
執(zhí)行 從CS:IP
開始的內(nèi)存單元中的指令CS:IP
指向1000:0
內(nèi)存單元荧琼,從該內(nèi)存單元開始,機器碼b8 01 00
差牛,對應的匯編指令為mov ax,0001
命锄,AX寄存器
的值成為0001H
-
該指令使用 3個 內(nèi)存單元,
IP寄存器
的值自動增加變成0003H
偏化,CS:IP
隨之改變成為1000:0003H
T 命令執(zhí)行從CS:IP 開始的內(nèi)存單元中的指令 繼續(xù)執(zhí)行
T 命令
脐恩,從CS:IP 1000:0003H
開始 ,并且執(zhí)行匯編指令mov cx,0002
繼續(xù)執(zhí)行
T 命令
侦讨,從CS:IP 1000:0006H
開始 驶冒,并且執(zhí)行匯編指令add ax,cx
-
最終,
寄存器 AX
的內(nèi)容成為0003H
繼續(xù)執(zhí)行 T 命令 看IP寄存器自動增加 看AX CX寄存器內(nèi)容變化
A 命令 匯編指令形式 在 內(nèi)存 中寫指令
-
a 1000:0
光標在 給出的起始地址 之后閃爍韵卤,代表可以輸入匯編指令
A 命令 匯編指令形式 在 內(nèi)存 中寫指令 要用到的 機器碼 和 對應的 匯編指令
機器碼 對應的匯編指令 指令含義
b80100 mov ax,0001 將數(shù)據(jù) 0001 放入寄存器 ax
b90200 mov cx,0002 將數(shù)據(jù) 0002 放入寄存器 cx
01c8 add ax,cx ax = ax + cx
- 輸入?yún)R編指令骗污,再按
【回車鍵 enter】
表示 匯編指令 輸入的結(jié)束,進入下一條指令的輸入 - 直接按
【回車鍵 enter】
表示A命令
操作結(jié)束 - 現(xiàn)在沈条,只是把 匯編指令 放到了 **內(nèi)存 ** 之中需忿,內(nèi)存有東西了,寄存器還沒有【蜡歹!】
- 因此屋厘,使用
R命令
看 寄存器 內(nèi)容是沒有變化的 - 這時候要用
D命令
看 內(nèi)存 就可以看到,內(nèi)存里有我們自己寫的東西了
A命令用匯編形式 改寫 內(nèi)存內(nèi)容
- 只需,
R CS
以及R IP
修改 CS:IP 成1000:0 H - 再用
T命令
月而,就可以執(zhí)行上面的匯編指令了
先用R命令修改CS:IP 再用T命令執(zhí)行即可
debug.exe 命令小結(jié)
- 關于 寄存器 的命令就一個 R命令擅这,查看、修改
- 關于 內(nèi)存 的命令有 D命令(查看)景鼠、E命令(寫數(shù)據(jù))仲翎、U命令(翻譯成匯編)、T(執(zhí)行CS:IP指向的指令)铛漓、A命令(以匯編形式寫數(shù)據(jù))
思考
- 我們學習
C語言
的時候溯香,比學習輸出hello world
的C語言語法
要更優(yōu)先的事情是,搞一個可以編譯運行C語言
的開發(fā)環(huán)境IDE
浓恶,可以是簡單小巧的Dev-C++
玫坛,也可以是功能齊全的Visual studio
,然后就是掌握一系列基于IDE
的編譯包晰、運行快捷鍵
湿镀,最后才是在IDE
里面輸入合法的代碼
開始炕吸,看輸出效果學習語法和知識。 - 基于此種學習路徑勉痴,實驗1的目的就很清晰了赫模,通過實驗1,我們知道了是通過
A命令
直接寫匯編指令蒸矛,是通過T命令
執(zhí)行匯編指令瀑罗,現(xiàn)在我們手上有可以輸入、執(zhí)行匯編語言指令
的 "IDE" 了雏掠。