tft每日頭條

 > 科技

 > 彙編指令debug的實驗結果及分析

彙編指令debug的實驗結果及分析

科技 更新时间:2024-06-18 21:22:46
【實驗具體内容】

1.使用Debug,将程序(見實驗源代碼)寫入内存,逐條執行,觀察每條指令執行後,CPU中相關寄存器中内存的變化。

2.将下面三條指令(見實驗源代碼)寫入從2000:0開始的内存單元中,利用這三條指令計算2的8次方。

3.查看内存中存有的PC機主闆上的ROM生産日期并試圖修改。

4.觀察下圖中的實驗過程,分析為何2000:0~2000:f中的内容會發生改變

【第一個實驗】

(1.1)實驗源代碼(粘貼源代碼):

機器碼 彙編指令

b8 20 4e mov ax,4E20H

05 16 14 add ax,1416H

bb 00 20 mov bx,2000H

01 d8 add ax,bx

89 c3 mov bx,ax

01 d8 add ax,bx

b8 1a 00 mov ax,001AH

bb 26 00 mov bx,0026H

00 d8 add al,bl

00 dc add ah,bl

00 c7 add bh,al

b4 00 mov ah,0

00 d8 add al,bl

04 9c add al,9CH

(1.2)實驗代碼、過程、相應結果(截圖)并對實驗進行說明和分析:

Win10下可以借用Dosbox調試Debug,如下圖

彙編指令debug的實驗結果及分析(彙編Debug入門:承接上篇文章)1

用Debug下的-d命令查看1000:0之後128個内存單元中的内容

彙編指令debug的實驗結果及分析(彙編Debug入門:承接上篇文章)2

用Debug下的-a命令以彙編語言的形式寫入從1000:0開始的内存單元中

彙編指令debug的實驗結果及分析(彙編Debug入門:承接上篇文章)3

使用Debug下的-d命令查看1000:0内存中的内容核對

彙編指令debug的實驗結果及分析(彙編Debug入門:承接上篇文章)4

在-t命令之前注意CS:IP當前指向,這裡指向073F:0102,需要修改其指向

彙編指令debug的實驗結果及分析(彙編Debug入門:承接上篇文章)5

使用Debug下的-r命令修改CS:IP指向,如下圖

彙編指令debug的實驗結果及分析(彙編Debug入門:承接上篇文章)6

使用Debug下的-t命令逐次執行1000:0中的指令,截圖如下

彙編指令debug的實驗結果及分析(彙編Debug入門:承接上篇文章)7

彙編指令debug的實驗結果及分析(彙編Debug入門:承接上篇文章)8

彙編指令debug的實驗結果及分析(彙編Debug入門:承接上篇文章)9

彙編指令debug的實驗結果及分析(彙編Debug入門:承接上篇文章)10

曆次-t命令下CS:IP指向和寄存器中内容如下:

CS:IP AX BX

1000:0000 0000 0000

1000:0003 4E20 0000

1000:0006 6236 0000

1000:0009 6236 2000

1000:000B 8236 2000

1000:000D 8236 8236

1000:000F 046C 8236

1000:0012 001A 8236

1000:0015 001A 0026

1000:0017 0040 0026

1000:0019 2640 0026

1000:001B 2640 4026

1000:001D 0040 4026

1000:001F 0066 4026

1000:0021 0002 4026


(2.1)實驗源代碼:

mov ax,1 (從2000:0開始的内存單元)

add ax,ax

jmp 2000:0003 (觀察跳到什麼地方了?)

(2.2)實驗代碼、過程、相應結果(截圖)并對實驗進行說明和分析:

源代碼寫入過程類似上面1.2的過程,這裡不再贅述,僅展示截圖

彙編指令debug的實驗結果及分析(彙編Debug入門:承接上篇文章)11

通過jmp指令,在執行一次mov ax,1後程序将在add ax,ax和jmp 2000:0003之間循環往複,直到計算出2的8次方

(下面忽略中間過程,僅關注最終結果即可)

彙編指令debug的實驗結果及分析(彙編Debug入門:承接上篇文章)12

彙編指令debug的實驗結果及分析(彙編Debug入門:承接上篇文章)13

彙編指令debug的實驗結果及分析(彙編Debug入門:承接上篇文章)14

彙編指令debug的實驗結果及分析(彙編Debug入門:承接上篇文章)15

指令執行過程紛繁複雜!


(3.1)實驗代碼、過程、相應結果(截圖)并對實驗進行說明和分析:

彙編指令debug的實驗結果及分析(彙編Debug入門:承接上篇文章)16

由于dosbox模拟一個真實的電腦環境,故01/01/92與主闆ROM不同可以理解。

【第二個實驗】

(1.1)實驗源代碼(粘貼源代碼):

mov ax,ffff

mov ds,ax

mov ax,2200

mov ss,ax

mov sp,0100

mov ax,[0] ;ax=C0EA

add ax,[2] ;ax=C0FC

mov bx,[4] ;bx=30F0

add bx,[6] ;bx=6021

push ax ;sp= 00FE ;修改的内存單元的地址是2200:00FE 内容為C0FC

push bx ;sp= 00FC ;修改的内存單元的地址是2200:00FC 内容為6021

pop ax ;sp= 00FE ;ax=6021

pop bx ;sp=0100 ;bx=C0FC

push [4] ;sp= 00FE ;修改的内存單元的地址是2200:00FE 内容為30F0

push [6] ;sp= 00FC ;修改的内存單元的地址是2200:00FC 内容為2F31

(1.2)實驗代碼、過程、相應結果(截圖)并對實驗進行說明和分析:

彙編指令debug的實驗結果及分析(彙編Debug入門:承接上篇文章)17

修改CS:IP,使之指向2000:0000,并查看當前寄存器中内容:

彙編指令debug的實驗結果及分析(彙編Debug入門:承接上篇文章)18

執行mov ax,ffff

彙編指令debug的實驗結果及分析(彙編Debug入門:承接上篇文章)19

執行mov ds,ax

彙編指令debug的實驗結果及分析(彙編Debug入門:承接上篇文章)20

執行mov ax,220

彙編指令debug的實驗結果及分析(彙編Debug入門:承接上篇文章)21

執行mov ss,ax,此處忘記截圖,可參考下圖

彙編指令debug的實驗結果及分析(彙編Debug入門:承接上篇文章)22

執行mov sp,0100

彙編指令debug的實驗結果及分析(彙編Debug入門:承接上篇文章)23

執行mov ax,[0]

彙編指令debug的實驗結果及分析(彙編Debug入門:承接上篇文章)24

執行add ax,[2]

彙編指令debug的實驗結果及分析(彙編Debug入門:承接上篇文章)25

執行mov bx,[4]

彙編指令debug的實驗結果及分析(彙編Debug入門:承接上篇文章)26

執行add bx,[6]

彙編指令debug的實驗結果及分析(彙編Debug入門:承接上篇文章)27

執行push ax

彙編指令debug的實驗結果及分析(彙編Debug入門:承接上篇文章)28

執行push bx

彙編指令debug的實驗結果及分析(彙編Debug入門:承接上篇文章)29

執行pop ax

彙編指令debug的實驗結果及分析(彙編Debug入門:承接上篇文章)30

執行pop bx

彙編指令debug的實驗結果及分析(彙編Debug入門:承接上篇文章)31

執行push [4]

彙編指令debug的實驗結果及分析(彙編Debug入門:承接上篇文章)32

執行push [6]

彙編指令debug的實驗結果及分析(彙編Debug入門:承接上篇文章)33

相關填空見(1.1)


(2.1) 實驗源代碼(粘貼源代碼):

mov ax,1000H

mov ds,ax

mov ds,[0]

add ds,ax

(2.2)實驗代碼、過程、相應結果(截圖)并對實驗進行說明和分析:

輸入指令過程中,出現錯誤,是因為add,sub不能對段寄存器ds進行操作

彙編指令debug的實驗結果及分析(彙編Debug入門:承接上篇文章)34

運行前三條指令是正常的(*)

彙編指令debug的實驗結果及分析(彙編Debug入門:承接上篇文章)35

若一定要執行add ds,ax,可以采用類似向ds輸入數據的方法,如下

彙編指令debug的實驗結果及分析(彙編Debug入門:承接上篇文章)36

運行結果如下

彙編指令debug的實驗結果及分析(彙編Debug入門:承接上篇文章)37

彙編指令debug的實驗結果及分析(彙編Debug入門:承接上篇文章)38

由于前面在運行不完整程序的前三條指令(*)後,寄存器ds的值發生變化,導緻bx的值發生變化,進而導緻add bx,ax運行後bx變化,最終導緻ds變化,所以在-t命令後截圖中寄存器的值與之前不同,可以通過正式程序之前提前修改ds的值,使之與之前一緻來消除影響。


(3.1)是因為中斷的影響

【實驗心得】

CS:IP指向指令的内存單元地址,CPU通過它區分指令和數據。DS存放要訪問數據的段地址,CPU是不是也可以通過它來區分指令和數據呢?SS:SP時刻指向棧頂,對于PUSH指令,先進行SP=SP-2再送數據入棧;POP指令相反,先取出棧内數據再SP=SP 2。

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved