1. 程式人生 > >【學習筆記】彙編:關於DEBUG工具使用的時候的一個注意事項

【學習筆記】彙編:關於DEBUG工具使用的時候的一個注意事項

在學習彙編的時候發現一個簡單的程式碼出現了一個奇怪的問題

詢問過後發現了DEBUG工具的一個小注意事項(或者說是沒用的知識點)

ASSUME SS:STACKS,CS:CODES,DS:a,ES:b

a SEGMENT
    ONE dw 01h,02h,03h,04h,05h,06h,07h,08h
a ENDS

b SEGMENT
	TWO dw 01h,02h,03h,04h,05h,06h,07h,08h
b ENDS

STACKS SEGMENT
    DW     00H,00H,00H,00H,00H,00H,00H,00H
    DW	   00H,00H,00H,00H,00H,00H,00H,00H
STACKS ENDS

CODES SEGMENT
START:
			MOV AX,A
			MOV DS,AX

			MOV AX,B
			MOV ES,AX

			MOV AX,STACKS
			MOV SS,AX

			MOV SP,32
			MOV CX,8
			MOV BX,0

addNumber:
			MOV AX,0
			ADD AX,DS:[BX]
			ADD AX,ES:[BX]
			PUSH AX
			ADD BX,2

    		loop addNumber 
    		MOV AH,4CH
    		INT 21H
CODES ENDS
    END START

該程式碼的意圖是把A段以及B段的記憶體移動到棧當中

不過這裡不管程式碼本身的問題

這裡有一個關鍵指令MOV SS,AX

注意這裡的棧記憶體,在執行了MOV SS,AX指令後,自0770:0037到0770:003F的位置出現了一堆莫名其妙的記憶體

在之前分明是沒有的,那麼為什麼MOV SS,AX會導致記憶體被汙染呢

四處詢問了下,因為DEBUG這個工具本質上也是一箇中斷指令,而在使用這個工具的時候,DEBUG有時會在棧空閒(還是沒被利用的時候?)向棧中存放一些暫存器以及當前指令的內容

於是導致了棧汙染,注意這裡的SP依然是0020,所以他雖然使用了棧,但並沒有導致棧頂移動,所以貌似是不影響棧的使用,就是不知道在DEBUG中如果向棧中存放資料 覆蓋掉他的快取會怎麼樣,暫時沒有找到其他副影響

--------------------------------2018/2/26更新-------------------------------

學到後面的時候知道了 這裡的具體原因,首先DEBUG是單步執行,屬於內部中斷

而中斷過程有這麼一個規則

1、取得中斷型別碼N

2、PUSHF

3、TF=0 IF=0

4、PUSH CS

5、PUSH IP

6、CS = N*4 + 2

7、執行中斷程式

8、IRET(取出標誌位暫存器、CS、IP)

所以上面程式debug中的記憶體汙染 就是 PSW與CS和IP的值在執行的時候放進去的,同時這裡由於程式已經執行完畢,所以SS:SP指向了原位置,所以並沒有什麼大的副影響