[英]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.