间接寻址和数组
Posted
技术标签:
【中文标题】间接寻址和数组【英文标题】:Indirect Addressing and Arrays 【发布时间】:2014-11-10 05:42:30 【问题描述】:section .data
matrix dw 1,2,3,4,5
dw 6,7,8,9,10
dw 11,12,13,14,15
dw 16,17,18,19,20
dw 21,22,23,24,25
;defined as word in order to be used in stack as well as ASCII representing numbers in 2 bytes(1 byte for each digit)
msg db "The smallest value in this matrix is:",10
msgL equ $-msg
section .bss
smallVal resw 2
section .text
global _start
_start:
mov edi, 0 ;will be used in order to indicate when end of matrix has been reached
mov esi,0 ; will be used to indicate when end of row has been reached
mov ecx, [matrix + edi +esi*2]
我正在开发一个程序,该程序采用矩阵并试图找到矩阵中的最小值。我对编程很陌生,现在才开始编程 java 大约 4 个月,现在也在学习 ASM。我的问题是关于间接寻址。以下语句实际上会做什么 [eax + edx](给定存储在 eax 和 edx 中的任意值)。根据一个网站,我发现它有效地找到了有效地址,但我不确定这意味着什么。
谢谢
感谢您的快速回复。我的问题实际上在于间接寻址如何用于寄存器。我已将代码 sn-p 附加到该线程的顶部。我的问题在于 mov ecx,[matrix+edi+esi*2]。我不确定这条线实际上是做什么的。
【问题讨论】:
“查找”在这种情况下并不意味着你想要它。它不对内存范围执行任何类型的扫描。[eax + edx]
不是 x86 汇编中的语句。它只能作为某些指令的操作数出现(实际上有很多指令)。它不能单独存在,因此它本身不会“做”任何事情。
...但是,如果要按照它的精神来解释 [eax+edx],它会计算内存中的地址,该地址是 eax 和 edx 寄存器内容的总和。 [matrix + edi +esi*2] 计算一个地址,该地址是“matrix”的内存地址、edi 寄存器的内容和 esi 寄存器的内容的 2 倍之和。给定这样一个地址,机器指令可以从内存中获取地址的内容(mov 到寄存器),可以存储到该地址(mov 到内存),或者可以只使用该地址作为结果(lea)。 ....
...内存地址指向字节(8 位)、字(2 字节或 16 位)、“d(ouble)word”(4 字节或 32位),在 x64 CPU 上,一个“q(uad)word”(8 字节或 64 位)。哪个 size 在与寻址模式一起使用的特定操作码中被编码引用。尝试这样做,你很年轻,祝你好运。
【参考方案1】:
代码行
mov ecx, [matrix + edi +esi*2]
从数组中取出一个元素,但这是错误的!由于数组已被定义为单词,因此您必须使用 CX 而不是 ECX。
进一步了解寻址方式。 EDI 控制外循环,将从 0 到 40 以 10 为步长(停止在 50) ESI控制内循环,会从0循环到4(停在5)
【讨论】:
谢谢你解释了很多。如果你有时间,你能看看我发布的另一个问题。也与组装相关,但 MARIE 而不是 ASM。其标题为与 MARIE 汇编语言相关的指令编码。如果你不解决这个问题,不管你帮了大忙,谢谢:)以上是关于间接寻址和数组的主要内容,如果未能解决你的问题,请参考以下文章
存储器 间接 寻址 试验 立即寻址 ;直接寻址 ;间接寻址 16位指针间接寻址 32位指针间接寻址