我有一個爲X64寫的ASM文件。它提供了一個葉函數。該文件與MASM64/ML64組裝。尋址變量(或什麼是ML64生成?)
與簽名的C-pseduo代碼是:
int GenerateBlock(byte* ptr, size_t size, unsigned int safety)
{
if (ptr == NUL) return 0; /*FAIL*/
...
}
下面是ASM代碼相同的部分:
;; RCX (in): byte* buffer
;; RDX (in): size_t bsize
;; R8d (in): unsigned int safety
;; RAX (out): bool, success (1), failure (0)
ASM_GenerateBlock PROC buffer:QWORD,bsize:QWORD,safety:DWORD
LOCAL val:QWORD ;; local variables
MWSIZE EQU 8 ;; machine word size
;; Validate pointer
cmp buffer, 0
je ASM_GenerateBlock_Cleanup
;; Cleanup will set RAX to 0 and return
...
ENDP
當我步驟呼叫,似乎fastcall
是正在使用,這與文檔一致。前兩個參數出現在RCX
和RDX
之間,這也是一致的。
但是帶有NULL
指針的測試用例產生了意想不到的結果。這裏是一個的正在使用的測試案例:
ASM_GenerateBlock(NULL /*ptr*/, 64 /*size*/, 20 /*safety*/);
當我步驟的代碼,RCX
似乎是buffer
(其NULL
),RDX
似乎是bsize
(其0x40
),但比較cmp buffer, 0
發生針對這是我未知的價值。從即時窗口:
buffer
0x000000013f82bcd0
*(__int64*)buffer
0x000000013f62aba8
bsize
0x000000013f14871b
*(__int64*)bsize
0xccccccc348c48348
13f82bcd0
大體類似的指令指針地址(EIP是13F50D268
)。它看起來不像ESP
或EBP
。
我有幾個問題...
- 什麼尋址ML64使用可變
buffer
模式? - 變量
buffer
的值來自哪裏? - 爲什麼
ML64
不使用ECX
的變量buffer
? - 我該如何解決這個問題?
相同的代碼,縮短到32位,組裝並執行精細。然而,ML將buffer
和bsize
放在堆棧上並且相對於EBP
解決它們。
我也嘗試更改爲cmp QWORD PTR buffer, 0
,但它沒有幫助。
謝謝彼得。你知道我該如何解決這個問題嗎? MASM/MASM64有一個['ALIAS'](https://msdn.microsoft.com/en-us/library/b07c5b4f.aspx),但它在MASM64/ML64下不起作用。請參閱從ML(X86)移植到ML64(X64)時的[A2008錯誤?](http://stackoverflow.com/q/33118452)我可以說最好的,MASM64/ML64幾乎沒有用於符號開發(與MASM/ML)。它所做的就是與MASM共享相同的名字(這對MASM來說是一種恥辱,因爲它是一個非常好的工具)。 – jww
@jww:對不起,沒有線索。我不使用MSVC,只使用yasm和GNU。即使在亞洲,我也沒有做過太多的宏觀工作。有人在你最近的另一個問題上發佈的鏈接聽起來像MSVC只是放棄了支持將'IF EAX == 1'這樣的東西變成64位的實際insns。有時你可以通過'cmp eax,1'和'jb'來保存一條指令,對於== 0和'je'對於== 1。這樣可以節省幾個insn字節,並且在CPU上不能宏塊融合同一塊insn中的兩個比較和分支對。 –