彙編中的結構體表示

2021-05-25 09:43:41 字數 1205 閱讀 8467

我認為,彙編中一切皆位址。

在c/c++使用很多的結構體,在彙編中是如何表示的呢?其實,在彙編中根本就沒有什麼結構體的概念,結構體本質就是一堆連在一起的資料。只不過有人把他們想象成乙個整體,並以此產生結構體的概念,這與結構體中帶有變長陣列時候的情形一樣:

其實上面這個結構體尾部帶有的變長陣列,data[0]與結構體test沒有任何關係,sizeof(test)就知道。

結構體在彙編是如何表示的呢?

譬如如何訪問test中的x成員,其實就是採用位址偏移的方式,根據定義的test物件的起始位址,偏移一定的大小就可以訪問結構體中的不同成員了。

測試**:

gcc -s ***x

產生的彙編**如下:

由c++filt 檢視_zn4testc1ev 知道為test::test(),也即test結構體的建構函式,看看這個函式的具體情況,

movl    8(%ebp), %eax//把this指標的位址放入eax

然後看它如何給第乙個成員變數賦值:

movl    $0, (%eax)//將值0放入eax的值所對應的記憶體位址處,也就是給第乙個成員變數賦值

同理:movl    8(%ebp), %eax

movb    $0, 4(%eax)//4(%eax)表示eax+4所對應的記憶體位址處,也就是第二個成員變數處

由以上分析就很明顯了,彙編中訪問結構體成員採用的是位址偏移的方式,其實c/c++等高階語言,編譯之後都要轉換成彙編**,所以,結構體的底層訪問,就是採用的位址偏移的方式。

注意:結構體中有乙個重要的概念,記憶體對齊,它會改變結構體成員變數的偏移值。

windows和linux都有預設的位址對齊大小,一般4位元組,以利於cpu訪問資料,因為cpu一般資料匯流排32位,可以一次訪問4位元組大小。

用#pragma pack(n) 可以改變記憶體對齊大小。

結構體內存對齊原則很複雜,特別是結構體中套乙個結構體的時候,但是簡單說來,有兩點原則:

1,每個成員(基本資料型別,也就是int,bool,char等)的偏移值由兩個資料決定:其資料型別所佔大小(記為變數x),例如int型佔4位元組;

編譯器設定的記憶體對齊大小,預設的,或是你通過上述指令設定的大小(記為變數y),取兩者中的較小值,得到資料z。根據記憶體對齊原則,該成員變數的偏移值必須是z的倍數。

2,假如結構體中佔記憶體最大的成員大小為m,則結構體總大小必須是m的倍數。

綜上,用彙編要對結構體的記憶體模型很熟悉。

if語句的彙編表示

gcc產生的 可以使用objdump 檢視它對應的彙編 gcc檢視彙編 本文主要介紹條件語句if 語句的彙編表示 有以下 int max int x,int y 產生的彙編 如下 00000000 0 55 push ebp 1 89 e5 mov esp,ebp 3 8b 45 08 mov 0x...

if語句的彙編表示

demo c語言 int max int x,int y 產生的彙編 如下 00000000 0 55 push ebp 1 89 e5 mov esp,ebp 3 8b 45 08 mov 0x8 ebp eax 6 3b 45 0c cmp 0xc ebp eax 9 7e 05 jle 10 ...

句法敏感的實體表示用於神經網路關係抽取

摘要 句法敏感的實體表示用於神經網路關係抽取。關係抽取任務大規模應用的乙個主要瓶頸就是語料的獲取。近年來基於神經網路的關係抽取模型把句子表示到乙個低維空間。這篇 的創新在於把句法資訊加入到實體的表示模型裡。首先,基於tree gru,把實體上下文的依存樹放入句子級別的表示。其次,利用句子間和句子內部...