簡體   English   中英

C指針和AT&T Movl語法

[英]C Pointers & AT&T Movl Syntax

我試圖了解AT&T匯編語言中這兩個命令之間的區別。

movl    %edx, %eax
movl    (%ebx), %eax

我知道第一個命令將值放入%edx,並將該值放入%eax。 我的理解是第二個是與指針有關的東西。 但是%ebx是不是地址,它包含的值是該地址的值?

我看過很多不同的教程,Wiki文章,PowerPoint和堆棧溢出帖子,但找不到任何明確解釋的人。 我見過的最好的網站http://www.scs.stanford.edu/nyu/04fa/notes/l2.pdf

他們舉個例子

movl    %edx, %eax    //edx = eax
movl    (%ebx), %eax  //edx = *((int32_t*) ebx)

哪一個確認我對第一個是正確的,但是第二個它們正在將ebx作為指針或..類型轉換? 這是課堂作業的一部分,我在尋找現有問題時不小心碰到了答案。 分配幾乎與C,Assembly相同:了解開關條件,edx eax ecxAssembly中的Pointers ,但是說實話,我沒有閱讀這些內容,因為我不想從帖子中了解答案,我想學習如何做,並對照他們檢查我的工作。

謝謝您的幫助!

http://en.wikipedia.org/wiki/X86_assembly_language#Syntax

ATT語法在目標之前使用源

movl %edx, %eax

相當於

eax = edx

更復雜的例子

movl (%ebx), %eax

相當於

eax = *((int32 *) ebx;

使用int32的原因是該指令的末尾有字母l (即小寫L)。 不同的字母指定不同的類型,但是l指定一個帶符號的32位數字。 圓括號(%ebx)表示正在指定有效地址。 一個有效地址只有一個必需元素( BASE地址)和3個可選元素。 在您的示例中,僅提供了必需的基本地址。 當給出具有有效地址的指令時,該地址的計算如下

address = base + index * scale + displacement

在該語句的C版本中,將ebx強制轉換為(int32 *)會將ebx的值轉換為指向有效地址處的int32的指針,然后取消對該指針的引用以讀取該地址處的32位數字。

暫無
暫無

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

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