【发布时间】: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 在与寻址模式一起使用的特定操作码中被编码引用。尝试这样做,你很年轻,祝你好运。