assembly 为什么我们不能在x86 asm中对操作数进行算术运算?

zbdgwd5y  于 11个月前  发布在  其他
关注(0)|答案(3)|浏览(119)

第一个月
为什么这是无效的语法?这不算“mov r64,r/m64”吗?我是初学者,所以很抱歉我的无知。
当表达式被括在方括号mov rax,[r9+rcx*2]中时,它才有效。为什么?

ktecyv1j

ktecyv1j1#

mov rax,r9+rcx*2

字符串
这是一个无效的语法,因为源操作数(最右边的操作数)包含汇编程序无法在编译时执行的寄存器和操作,因为汇编程序不知道这些寄存器包含什么值。只有在运行时才显示这些值。
使用方括号,[r9 + rcx * 2]成为一个有效的寻址模式,它使用一个基址寄存器(R9)和一个索引寄存器(RCX),并按因子(2)进行缩放。

mov rax, [r9 + rcx * 2]


当与mov指令结合使用时,计算地址处的内存内容将返回到指定的寄存器(RAX)中。

lea rax, [r9 + rcx * 2]


当与lea指令结合使用时,计算出的地址本身将返回到指定的寄存器(RAX)中。
在这两种情况下,地址计算都发生在运行时。

mepcadol

mepcadol2#

硬件机器码是非常具体的,它允许和不允许通过编码。
在机器代码中没有通过单个、可能更大的指令的通用表达能力,但是某些非常有限的计算是允许的,例如,通过寻址模式。
如果所有的操作数都是常量,并且它可以在程序构造过程中计算出来,那么许多汇编程序将允许计算表达式。
对于通用表达式,我们需要使用高级语言-根据需要使用一个或多个指令将其转换为机器代码。
对于汇编程序员来说,多条指令进行小的计算是正常的。

42fyovps

42fyovps3#

为了进行数学运算,必须使用汇编语言中的相关命令。您不能直接使用汇编语言中的寄存器进行算术运算。您不能像这样做:rcx * 2或r9 + 5。如果您想合法地进行“mov rax,r9 + rcx * 2”操作,可以使用以下命令:

  1. imul rcx,2 -> rcx = rcx * 2
    1.加上r9,rcx -> r9 = r9 + rcx -->现在r9等于r9 + rcx * 2
  2. mov rax,r9 ->我们合法间接地执行了mov rax,r9 + rcx * 2操作。

相关问题