2016-02-18 20 views
0

下面按照我的理解說,在%rsi指針存儲在%eax如果那是正確的,那麼第二行說,在%eax指針添加到指針%rdi的代碼?指針在C轉化爲裝配

很混亂。我知道程序集沒有指針,我只是在將程序集翻譯成c語言。我必須將彙編代碼編寫成C代碼,而這兩行代碼正在殺死我。我能澄清一下嗎?

movl (%rsi), %eax 
addl %eax, (%rdi) 
+1

第一行不存*指針,它*提領*它。你也可以說它*從*地址*加載*。第二行是一個(非原子)*讀 - 修改 - 寫*,其中''eax'的值被添加到*由'rdi'指向的*對象。 – EOF

+0

因此,不要將'%rsi'的內存空間複製到'%eax'中,將'%rsi'的內容移動到'%eax'中?我剛剛說過兩次同樣的事情,但我的意思是在指針 –

+0

的環境中看到那些括號?這意味着'(%寄存器)'是內存中的*地址*。 'movl(%rsi),%eax' *與'將'%rsi'移動到'%eax'「非常不同,最接近與'movq%rsi,%rax'或'movl類似的設置%esi,%eax'。 – EOF

回答

0

因爲你似乎使用AT & T語法使用,括號取消引用%rsi值。這些表達式的C等價物將是:

/* Expression 1 */ 
unsigned int* p = some_address; 
unsigned int i = *p; /* *p dereferences the address in p */ 


/* Expression 2 */ 
unsigned int* p = some_address; 
unsigned int i = 8; 
i += *p /* Increase i by the value pointed to by p */ 
+1

答案的第二部分不正確。 – EOF

+0

'8'從哪裏來?我不應該從第一個表達中獲得它的價值嗎? – Barmar

+0

仍然錯......錯的方向。 – EOF