今天在除錯《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
執行時出現如下錯誤提示:
程式執行時出現的錯誤
在OD中除錯則顯示如下結果:
在OD中調試出現的錯誤
錯誤提示就是上圖的左下角所示“訪問違規:正在執行[00000000]-使用Shift+F7/F8/F9來忽略程式異常”。
經過我的多次除錯,最終把錯誤鎖定在str_trim子程式的std語句。這個語句改變了字串指令的訪問記憶體方向,導致主程式在返回作業系統時無論是呼叫ret指令,還是呼叫invoke ExitProcess, 0 指令都不能返回。本書的作者在編寫str_trim程式時都懂得用std 指令來改變訪問記憶體的方向,那windows的ExitProcess函式為什麼不知道呼叫cld指令來達到自己預期的訪問記憶體的方向呢?那你認為是本書的作者失誤還是windows的ExitProcess這個函式設計有bug呢?歡迎在評論區留言。