Delphi中使用彙編 關於POS函式的問題

2021-04-13 23:56:23 字數 1571 閱讀 2705

在delphi中使用彙編異常的簡單,只用使用關鍵字a** ....end來引導就行了。 

得到乙個字元在字串中的位置有很多方法,最簡單的就是使用delphi自己的pos函式 

另外乙個方法就是使用 迴圈查詢字串陣列的方法,二分法等,這幾種是比較常規的方法,其中建議最好不使用pos函式。 因為,雖然使用該函式寫的**是很簡單,只用一句話   

charindex := pos(mychar,str) 

就能夠完成,但是其實他的效率是最低的,因為delphi在使用它之前,先要開闢乙個陣列空間,然後將長度變成1 

然後在把這個單字元拷貝到剛剛開闢的記憶體空間中去。然後才呼叫pos函式進行查詢,而查詢完成之後,delphi還 

會 使用 try...finally...end機制來釋放分配開闢的記憶體空間,而try  finally是很消耗資源的。所以不推薦使用。 

順序迴圈查詢的方法也很簡單,二分法稍微複雜一點。 

下面是自己寫的乙個得到乙個字元在字串中的位置函式:(採用的是順序查詢,有興趣可以在修改一下成為二分查詢,其查詢速度將會由數量級變成對數級) 

止在討論如何在delphi中使用彙編!

delphicode:

functiongetcharpos(reschar:ansichar;consts:string;index:integer=0):integer; 

a**//test指令執行的就是and與操作,唯一不同的是,不儲存結果,所以edx中的值不變

test edx,edx;// 判斷edx是否為0,如果為0則指標為 nil

jz @exit//如果為空, 則跳轉退出

mov edi,ecx;//儲存index的值,表示從什麼地方開始查詢

//使用乙個增量計數edi,可以在迴圈中使用[edx+edi]來得到s的每乙個字元

mov ecx, [edx-4];

test ecx,ecx;//看字串 s是否為''沒有乙個字元,長度為0

jz @exit;

cmp ecx,edi//查詢開始位置超過字串長度,退出

jb @exit

//mov edi,0;

@compore:

cmp al,[edx+edi]//al中存放字元

jz @found//相等則說明找到

inc edi;//edi計數器增加

loop @compore//迴圈比較

@found:

inc edi//由於edi從0計數開始,所以加1

mov eax,edi//將查詢結果傳遞給函式 返回結果儲存在eax中

ret

@exit:

mov eax,-1;

end;

Delphi中使用彙編 關於POS函式的問題

在delphi中使用彙編異常的簡單,只用使用關鍵字asm end來引導就行了。得到乙個字元在字串中的位置有很多方法,最簡單的就是使用delphi自己的pos函式 另外乙個方法就是使用 迴圈查詢字串陣列的方法,二分法等,這幾種是比較常規的方法,其中建議最好不使用pos函式。因為,雖然使用該函式寫的 是...

Delphi中使用彙編 關於POS函式的問題

在delphi中使用彙編異常的簡單,只用使用關鍵字asm end來引導就行了。得到乙個字元在字串中的位置有很多方法,最簡單的就是使用delphi自己的pos函式 另外乙個方法就是使用 迴圈查詢字串陣列的方法,二分法等,這幾種是比較常規的方法,其中建議最好不使用pos函式。因為,雖然使用該函式寫的 是...

iOS逆向 在OC專案中使用彙編函式

在開發或研發的時候,有兩種場景可能需要在oc中使用彙編函式 1.正向開發時你想把部分關鍵邏輯隱藏。2.逆向分析時你想直接使用別人的加密方法。1.1.建立彙編檔案 text align 4 globl funcadd arm funcadd arm add w0,w0,w1 add w0,w0,w2 ...