第一个月为什么这是无效的语法?这不算“mov r64,r/m64”吗?我是初学者,所以很抱歉我的无知。当表达式被括在方括号mov rax,[r9+rcx*2]中时,它才有效。为什么?
mov rax,[r9+rcx*2]
ktecyv1j1#
mov rax,r9+rcx*2
字符串这是一个无效的语法,因为源操作数(最右边的操作数)包含汇编程序无法在编译时执行的寄存器和操作,因为汇编程序不知道这些寄存器包含什么值。只有在运行时才显示这些值。使用方括号,[r9 + rcx * 2]成为一个有效的寻址模式,它使用一个基址寄存器(R9)和一个索引寄存器(RCX),并按因子(2)进行缩放。
[r9 + rcx * 2]
mov rax, [r9 + rcx * 2]
型当与mov指令结合使用时,计算地址处的内存内容将返回到指定的寄存器(RAX)中。
mov
lea rax, [r9 + rcx * 2]
型当与lea指令结合使用时,计算出的地址本身将返回到指定的寄存器(RAX)中。在这两种情况下,地址计算都发生在运行时。
lea
mepcadol2#
硬件机器码是非常具体的,它允许和不允许通过编码。在机器代码中没有通过单个、可能更大的指令的通用表达能力,但是某些非常有限的计算是允许的,例如,通过寻址模式。如果所有的操作数都是常量,并且它可以在程序构造过程中计算出来,那么许多汇编程序将允许计算表达式。对于通用表达式,我们需要使用高级语言-根据需要使用一个或多个指令将其转换为机器代码。对于汇编程序员来说,多条指令进行小的计算是正常的。
42fyovps3#
为了进行数学运算,必须使用汇编语言中的相关命令。您不能直接使用汇编语言中的寄存器进行算术运算。您不能像这样做:rcx * 2或r9 + 5。如果您想合法地进行“mov rax,r9 + rcx * 2”操作,可以使用以下命令:
3条答案
按热度按时间ktecyv1j1#
字符串
这是一个无效的语法,因为源操作数(最右边的操作数)包含汇编程序无法在编译时执行的寄存器和操作,因为汇编程序不知道这些寄存器包含什么值。只有在运行时才显示这些值。
使用方括号,
[r9 + rcx * 2]
成为一个有效的寻址模式,它使用一个基址寄存器(R9)和一个索引寄存器(RCX),并按因子(2)进行缩放。型
当与
mov
指令结合使用时,计算地址处的内存内容将返回到指定的寄存器(RAX)中。型
当与
lea
指令结合使用时,计算出的地址本身将返回到指定的寄存器(RAX)中。在这两种情况下,地址计算都发生在运行时。
mepcadol2#
硬件机器码是非常具体的,它允许和不允许通过编码。
在机器代码中没有通过单个、可能更大的指令的通用表达能力,但是某些非常有限的计算是允许的,例如,通过寻址模式。
如果所有的操作数都是常量,并且它可以在程序构造过程中计算出来,那么许多汇编程序将允许计算表达式。
对于通用表达式,我们需要使用高级语言-根据需要使用一个或多个指令将其转换为机器代码。
对于汇编程序员来说,多条指令进行小的计算是正常的。
42fyovps3#
为了进行数学运算,必须使用汇编语言中的相关命令。您不能直接使用汇编语言中的寄存器进行算术运算。您不能像这样做:rcx * 2或r9 + 5。如果您想合法地进行“mov rax,r9 + rcx * 2”操作,可以使用以下命令:
1.加上r9,rcx -> r9 = r9 + rcx -->现在r9等于r9 + rcx * 2