2017-09-08 129 views
-1

我是新來的彙編,並試圖迭代存儲在內存中的字符串。我可以使用lea(加載有效地址)指令得到字符串的地址,但我現在想使用存儲在寄存器中的那個地址。如何加載存儲在程序集寄存器中的內存地址的內容?

有模lw其可以使用如下:

lea string, %edx  ; Load effective address of string into edx 
lw %edx, %eax  ; Load eax with the value stored where edx points 

... 
string: 
    .string "Hello" 
+1

英特爾擁有內存訪問的語法'[address]',可以應用於幾乎所有的基本指令,'mov'在您的情況下只是爲了獲取值,還有基本的算術工作。但是當你使用gas/AT&T語法時,它是不同的,所以內存引用是'offset(r_base,r_index,index_scale_factor)',其中'offset'和'index_scale_factor'是數字(或符號)。所以'mov eax,[edx];加載string' ='movl(%edx),%eax'的前4個字符,以及像'mov al,[arrayX + edi * 8 + esi]'= movb arrayX(%esi,%edi,8 ),%al' – Ped7g

+0

這就是說,它看起來像你正在嘗試GUESS的指示。請不要這樣做,即使你可能只有很少的時間用它,遲早你會碰到一些東西,比如最常見的SO裝配問題「分裂溢出」,因爲人們期望'div%ebx'能夠分裂eax/ebx,而不是。獲取一些指令集參考指南,並獲取一些GAS/AT&T彙編語法參考指南。並快速通過他們幾次。 (在8086模式下可能的內存尋址模式是非常有限的......你的'lea字符串,%edx'在8086上是無效的,這讓我想知道......) – Ped7g

+0

@ Ped7g我實際上使用它作爲指令的參考http://flint.cs.yale.edu/cs421/papers/x86-asm/asm.html#registers,我找不到像'lw'這樣的問題,所以我問了這個問題。你是對的,但我需要更好地理解尋址模式。 – Bhargav

回答

1

「MOV」是你在找什麼,用間接尋址(其基於哪個模式寄存器的一些限制你」重新進入)

+0

你能舉個例子嗎?我猜測我在嘗試執行'mov%edx,%eax'時做錯了什麼,因爲它只是將內容移到eax中,而不是內存地址的內容。 – Bhargav

+0

對,你沒有在那裏使用間接尋址。你需要在AT&T語法中找到如何做到這一點。對於AT&T語法,我基本上是隻讀的。我討厭激情,所以現在只使用英特爾語法,如MOV EAX,[EDX] –

相關問題