![](/img/trans.png)
[英]x86 E8 and FF calls, how to find the E8 shifting address 'on the fly'? basic x86 ASM calls
[英]Setting value stored at address using x86 ASM
我試圖讓我的頭圍繞一些內聯ASM,但由於某種原因,這不符合我的預期。 為什么這個設置不是x的值等於62?
#include <stdio.h>
int main()
{
int x = 525;
int* y = &x;
_asm
{
mov eax, 62
mov [y], eax
}
printf("%i", x);
getchar();
return 0;
}
代碼導致輸出525。 我預計它會是62歲。
這里有一個完全可以理解的誤解:
肯定[y]意味着[0xCCCCCCCC](假設x的地址是0xCCCCCCCC)
在高級理論中,是的。 麻煩的是,在實際組裝[0xCCCCCCCC]
是沒有意義- CPU不能直接解引用的存儲器地址-它只能加載來自該地址的值到一個寄存器,那么該解引用。
類似地,由於y
是一個變量 ,而不是一個寄存器 ,它的隱性視為一個地址1即y
內部asm
塊是相當於&y
在C代碼以外2。 正如您在調試器中逐步看到的那樣,發生的事情是匯編器簡單地忽略了沒有意義的括號(而不是拋出有用的錯誤)並組裝了相同的mov y, eax
。
獲得你期望的方式將是這樣的:
asm {
mov eax, 62
mov edx, y
mov [edx], eax
}
[1]這顯然不是海灣合作委員會。 GCC擴展asm是一個完全不同的球賽......
[2]有點簡化 - 從C的角度來看它是一個“地址”,但在匯編語境中它是一個內存操作數,它更像是一個地址的使用 。 當我編譯它時, y
出現為[ebp-20]
,它從高級視圖是“堆棧中的地址”。
您loadig的地址 x
為y
。 然后你將62
存儲在變量 y
的地址 (再次!)中 - 這就是[..]
語法的含義。 所以你不是修改變量x
而是修改存儲在*(* y)的值。 (這是一個小小的奇跡,不會導致程序崩潰。)
你可能想要
mov [&y], eax
(如果您的編譯器接受該語法)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.