簡體   English   中英

AT&T匯編中的算術運算(添加內存和寄存器)

[英]Arithmetic operations in AT&T assembly (adding memory and a register)

我無法理解將兩個值相加的行為,一個在寄存器中,一個在存儲器中。

假設內存有:

Address   Value
0x100     0xFF

並假設寄存器有:

 Register    Value
 %eax        0x100
 %ecx        0x1

現在,我不了解的是,當您使用(%eax)作為操作數時,您正在執行的操作是引用該地址處的內存,即您將獲得值0xFF,即

(%eax) = 0xFF

但是,當(%eax)是加法或減法的目標時,引用(%eax)會給我們返回內存中的地址,而不是引用內存(類似於lea行為),即

addl %ecx, (%eax)    

將0x1 + 0xFF寫入0x100。 令我感到困惑的是,當我們讀取該值以執行加法運算(%eax)時,我們會返回0xFF,但是當我們使用(%eax)作為加法運算的目的地時,我們將其寫入0x100。

有人可以解釋一下嗎?

當我們讀取執行加法的值時(%eax)返回0xFF,但是當我們使用(%eax)作為加法目標時,我們寫入0x100。 有人可以解釋一下嗎?

在兩種情況下,使用(%eax)作為操作數都意味着在%eax包含的地址處引用內存。 您的示例中的地址為0x100,該地址處的雙字包含值0xFF。

如果您進行讀取-例如movl (%eax),%ecx您只需在0x100處抓取值,那么您將獲得0xFF

如果執行addl %ecx,(%eax) ,則首先從內存地址0x100中讀取(即值0xFF),將%ecx (1)的值添加到其中以得到值0x100,然后將結果寫回到與您從中讀取它的地址相同(0x100)。 請注意, %eax的值在此操作期間永遠不會改變; 只是%eax 指向的值會改變。

暫無
暫無

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

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