在組合語言程式除錯中發現了windows的低階錯誤

今天在除錯《INTEL組合語言程式設計第五版》第261頁的“9。3。6字串庫演示程式”這一節中的StringDemo。asm程式時發現了一個匪夷所思的問題——在執行str_trim子程式後主程式就無法返回作業系統。Str_trim子程式如下:

str_trim proc uses eax ecx edi,

pString:ptr byte,

char:byte

;功能:刪除字串結尾的所有指定的字元。

;入口引數:pString=字串首地址,

mov edi, pString

invoke str_length, edi

cmp eax, 0

je L2

mov ecx, eax

dec eax

add edi, eax

mov al, char

std

repe scasb

jne L1

dec edi

L1: mov byte ptr [edi+2], 0

L2: ret

str_trim end

執行時出現如下錯誤提示:

在組合語言程式除錯中發現了windows的低階錯誤

程式執行時出現的錯誤

在OD中除錯則顯示如下結果:

在組合語言程式除錯中發現了windows的低階錯誤

在OD中調試出現的錯誤

錯誤提示就是上圖的左下角所示“訪問違規:正在執行[00000000]-使用Shift+F7/F8/F9來忽略程式異常”。

經過我的多次除錯,最終把錯誤鎖定在str_trim子程式的std語句。這個語句改變了字串指令的訪問記憶體方向,導致主程式在返回作業系統時無論是呼叫ret指令,還是呼叫invoke ExitProcess, 0 指令都不能返回。本書的作者在編寫str_trim程式時都懂得用std 指令來改變訪問記憶體的方向,那windows的ExitProcess函式為什麼不知道呼叫cld指令來達到自己預期的訪問記憶體的方向呢?那你認為是本書的作者失誤還是windows的ExitProcess這個函式設計有bug呢?歡迎在評論區留言。