Assembly 内联值的定义
浏览时,我遇到了立即数操作数的定义: 操作数可以是立即数(即计算为内联值的常量表达式),[…] 如果我得到的是正确的,表达式将返回一个值。常量表达式是否返回常量值?内联值是否意味着在经过组装过程后,它将被其他值替换 常量表达式是否返回常量值 对。立即数操作数在操作码中创建常量值。与mov eax一样,3创建一个由多个字节组成的操作码-根据 例如:对于32位模式,以下字节组合表示有效的操作码。这意味着对于Assembly 内联值的定义,assembly,definition,inline-code,Assembly,Definition,Inline Code,浏览时,我遇到了立即数操作数的定义: 操作数可以是立即数(即计算为内联值的常量表达式),[…] 如果我得到的是正确的,表达式将返回一个值。常量表达式是否返回常量值?内联值是否意味着在经过组装过程后,它将被其他值替换 常量表达式是否返回常量值 对。立即数操作数在操作码中创建常量值。与mov eax一样,3创建一个由多个字节组成的操作码-根据 例如:对于32位模式,以下字节组合表示有效的操作码。这意味着对于mov目的地,3有几种可能性: b0 03 mov
mov目的地,3
有几种可能性:
b0 03 mov al, 3
66 b8 03 00 mov ax, 3
b8 03 00 00 00 mov eax, 3
c6 45 00 03 mov byte ptr [xxx], 3
66 c7 45 00 03 00 mov word ptr [xxx], 3
c7 45 00 03 00 00 00 mov dword ptr [xxx], 3
B0h和B8h表示一个单字节操作码,C6h和C7h表示一个双字节操作码,由一个操作码字节和一个编码寻址模式的Mod/RM字节组成-在本例中为间接寻址
66h
指定一个操作数大小前缀
,指示以下指令使用16位(地址外模式)操作数-与正常32位模式操作数相比,这是一个例外。8位操作数由另一个操作码编码。其余字节是3
的8/16/32位值的编码
内联值是否意味着在经过组装过程后,它将被其他值替换
不。汇编(y | ing)是将常量值合并到生成的操作码(字节序列)中的过程。在某种程度上,所有内容都是在汇编中内联的
常量表达式是否返回常量值
对。立即数操作数在操作码中创建常量值。与mov eax一样,3创建一个由多个字节组成的操作码-根据
例如:对于32位模式,以下字节组合表示有效的操作码。这意味着对于mov目的地,3
有几种可能性:
b0 03 mov al, 3
66 b8 03 00 mov ax, 3
b8 03 00 00 00 mov eax, 3
c6 45 00 03 mov byte ptr [xxx], 3
66 c7 45 00 03 00 mov word ptr [xxx], 3
c7 45 00 03 00 00 00 mov dword ptr [xxx], 3
B0h和B8h表示一个单字节操作码,C6h和C7h表示一个双字节操作码,由一个操作码字节和一个编码寻址模式的Mod/RM字节组成-在本例中为间接寻址
66h
指定一个操作数大小前缀
,指示以下指令使用16位(地址外模式)操作数-与正常32位模式操作数相比,这是一个例外。8位操作数由另一个操作码编码。其余字节是3
的8/16/32位值的编码
内联值是否意味着在经过组装过程后,它将被其他值替换
不。汇编(y | ing)是将常量值合并到生成的操作码(字节序列)中的过程。在某种程度上,所有内容都是在汇编中内联的。这只是意味着表达式必须是一个可以在汇编过程中计算的值。常量表达式的示例包括:
5
5+5
5*5
MyConstant (where this constant is defined somewhere else)
MyConstant*4
ah (a register)
ah*al (expression containing registers)
[0x800] (a memory location)
以上所有的值都可以由汇编程序确定,并用表达式的值替换
相反,非常量表达式的值在汇编过程中无法确定。例子包括:
5
5+5
5*5
MyConstant (where this constant is defined somewhere else)
MyConstant*4
ah (a register)
ah*al (expression containing registers)
[0x800] (a memory location)
这只意味着表达式必须是一个可以在组装期间计算的值。常量表达式的示例包括:
5
5+5
5*5
MyConstant (where this constant is defined somewhere else)
MyConstant*4
ah (a register)
ah*al (expression containing registers)
[0x800] (a memory location)
以上所有的值都可以由汇编程序确定,并用表达式的值替换
相反,非常量表达式的值在汇编过程中无法确定。例子包括:
5
5+5
5*5
MyConstant (where this constant is defined somewhere else)
MyConstant*4
ah (a register)
ah*al (expression containing registers)
[0x800] (a memory location)
你能告诉我“inline”在汇编语言中的实际含义是什么吗?@MaxHerrmann我在汇编手册中没有看到inline这个词,但在这里它似乎只是指“一个常量值”。请注意,
mov-eax,1+2
和mov-eax,1+1+1
以及返回3的常量表达式的其他变体都组合成简单的mov-eax,3
。也就是说,它们是由汇编程序计算的表达式。你能告诉我在汇编语言的上下文中“inline”的实际含义是什么吗?@MaxHerrmann我在汇编手册中没有看到inline这个词,但在这里它似乎只是指“常量值”。请注意,mov-eax,1+2
和mov-eax,1+1+1
以及返回3的常量表达式的其他变体都组合成简单的mov-eax,3
。也就是说,它们是由汇编程序计算的表达式。