间接寻址和数组

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 汇编语言相关的指令编码。如果你不解决这个问题,不管你帮了大忙,谢谢:)

以上是关于间接寻址和数组的主要内容,如果未能解决你的问题,请参考以下文章

C 编译器——Multidim 数组的间接寻址

存储器 间接 寻址 试验 立即寻址 ;直接寻址 ;间接寻址 16位指针间接寻址 32位指针间接寻址

不使用 eval 的间接寻址

(计算机组成原理)第四章指令系统-第二节2:数据寻址(直接寻址间接寻址立即数)

西门子博图HMI内部变量怎么寻址外部变量

嵌入式:ARM间接寻址变址寻址与多寄存器寻址