2017-05-04 94 views
0

我試圖在C中複製x86 mov指令,例如mov%ecx,-0x4(%ebp),並且對如何執行它感到困惑。我有一個int數組的寄存器和一個int位移。如何將%ecx的值移動到內存地址4小於存儲在%ebp中的值?不同大小的C指針中的x86 mov指令

我:

int* destAddress=(int*)(displacement + registers[destination]); 
*destAddress=registers[source]; 

我得到一個警告:投從大小不同的整數的指針。

+0

你怎麼知道'destAddress'是一個有效的地址?假設'位移'是'-4','寄存器[目標]是某個地址。你怎麼知道這個結果地址是分配的,而不是指向隨機的東西? –

+0

要回答你的問題,你正在將'int'強制轉換爲'int *',這似乎是一個問題(當然是未定義的行爲)。如果你在X86_64上,你應該考慮''位移'的'size_t'類型和'寄存器'的'unsigned long long'。 –

+0

我不確定我是否理解代碼示例或您想要做什麼...?結果應該存儲在哪裏?初始值是多少?你想要做什麼:'寄存器[目的地] =寄存器[源] +位移「?指針的用途是什麼?它應該指向什麼? – Myst

回答

1
mov %ecx,-0x4(%ebp) 

,或者在Intel語法:

mov DWORD PTR [ebp-4], ecx 

被存儲在ECX的值到存儲器位置[ebp-4]

EBP是「基址指針」,通常用於(在未優化的代碼中)訪問堆棧中的數據。基於負偏移量,該指令幾乎可以肯定地將ECX的值存儲到第一個DWORD大小的局部變量中。

如果你想這個轉換到C,這將是:

int local = value; 

假設value映射到ECX寄存器,local是在棧上分配的局部變量。真的,就是這樣。

[除C編譯器一般會放一個局部變量這樣在寄存器中,所以這將真正轉化到更多的東西一樣mov edx, ecx。唯一會出現堆棧溢出的情況是,如果堆棧溢出(這在寄存器非常差的x86 ISA中並不罕見)。

或者,您可以通過使變量volatilevolatile int local = value;強制泄漏。
但是沒有充分的理由這樣做,在實際的代碼。]

有指針引用引擎蓋下怎麼回事,當然,當你在彙編語言指令看到,但它不體現在C表示中。

如果你想獲得一些指針符號在裏面,說你有在棧上分配的值的陣列,並希望初始化它的第一個成員:

int array[4]; 
array[0] = value; // set first element of array to 'value' (== ECX) 

位移(-4)韓元完全不出現在C代碼中。 C編譯器處理它。