2011-05-28 173 views
1

我使用的代碼:: Blocks的代碼,但我引用的代碼的一個是從Visual C++的,所以我對差的困難... :(MOV EAX,DWORD PTR SS的含義是什麼:[EBP + 8h]以及如何將它轉換爲AT&T格式?

完整的代碼在這裏

NAKED void ijlWrite() 
{ 
__asm { 
    PUSH EBP 
    MOV  EBP, ESP 
    MOV  EAX, DWORD PTR SS:[EBP+8h] 
    MOV  ECX, ssQuality 
    MOV  DWORD PTR DS:[EAX+50h], ECX 
    MOV  EDX, DWORD PTR SS:[EBP+0Ch] 
    PUSH EDX 
    MOV  EAX, DWORD PTR SS:[EBP+08h] 
    PUSH EAX 
    CALL lpfnIJLWrite //a global variable 
    POP  EBP 
    RETN 
} 
} 

如果你翻譯他們我會很感激。

PS我也不知道怎麼翻譯RETN。怎麼辦呢?該cheatsheet文件沒有這樣的事情:(

+0

你有一個合成速查表[有](http://www.imada.sdu.dk/Courses/DM516/Litteratur/IntelnATT.htm) – 2011-05-28 10:29:04

+0

另請參見[有](HTTP:// WWW .ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html),因爲GCC內聯asm要求你聲明很多MSVC的內聯asm沒有的東西。 – 2011-05-28 10:30:01

+0

你確定調用約定可以直接翻譯? – 2011-05-28 10:53:35

回答

3
MOV  EAX, DWORD PTR SS:[EBP+8h] 

相當於

movl %ss:8(%ebp), %eax 

你只是交換源和目的地的順序,DWORD轉化爲一個l後綴。 %ss:前綴是嚴格不必要的,它是使用基於EBP的內存訪問時的默認值。

+0

另一個問題:我如何翻譯RETN?謝謝! – xxbidiao 2011-05-28 10:36:15

+0

'retn'只是'ret'。 'retf'翻譯成'lret'。 – detunized 2011-05-28 10:41:09

1

我認爲這是

movl %ss:8(%ebp), %eax 

的快速參考見this

+0

你是第二個鏈接該「參考」,但它是一個http:403對我來說。 – Pixelchemist 2013-07-17 06:48:20

+0

@Pixelchemist,使用Wayback Machine:http://web.archive.org/web/20120822123638/http://www.imada.sdu.dk/Courses/DM516/Litteratur/IntelnATT.htm – detunized 2013-08-08 10:59:48

4

難道你不能只用C++編寫函數嗎?更多類型的信息會有所幫助,但這又如何呢?

void ijlWrite(int* p, int i) 
{ 
    p[80] = ssQuality; 
    lpfnIJLWrite(p, i); 
} 
+0

實際上'ijlWrite'是從一個DLL和代碼試圖鉤住DLL並更改參數,然後運行原始功能。 – xxbidiao 2011-05-28 11:21:48

相關問題