【學習筆記】彙編:關於DEBUG工具使用的時候的一個注意事項
阿新 • • 發佈:2019-02-05
在學習彙編的時候發現一個簡單的程式碼出現了一個奇怪的問題
詢問過後發現了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指向了原位置,所以並沒有什麼大的副影響