簡體   English   中英

使用x86 ASM設置存儲在地址中的值

[英]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是一個變量 ,而不是一個寄存器 ,它的隱性視為一個地址1y內部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的地址 xy 然后你將62存儲在變量 y地址 (再次!)中 - 這就是[..]語法的含義。 所以你不是修改變量x而是修改存儲在*(* y)的值。 (這是一個小小的奇跡,不會導致程序崩潰。)

你可能想要

mov [&y], eax

(如果您的編譯器接受該語法)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM