我是新來的彙編,並試圖迭代存儲在內存中的字符串。我可以使用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"
英特爾擁有內存訪問的語法'[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
這就是說,它看起來像你正在嘗試GUESS的指示。請不要這樣做,即使你可能只有很少的時間用它,遲早你會碰到一些東西,比如最常見的SO裝配問題「分裂溢出」,因爲人們期望'div%ebx'能夠分裂eax/ebx,而不是。獲取一些指令集參考指南,並獲取一些GAS/AT&T彙編語法參考指南。並快速通過他們幾次。 (在8086模式下可能的內存尋址模式是非常有限的......你的'lea字符串,%edx'在8086上是無效的,這讓我想知道......) – Ped7g
@ Ped7g我實際上使用它作爲指令的參考http://flint.cs.yale.edu/cs421/papers/x86-asm/asm.html#registers,我找不到像'lw'這樣的問題,所以我問了這個問題。你是對的,但我需要更好地理解尋址模式。 – Bhargav