助记符和操作码有什么区别
What is the difference between Mnemonics and Opcode
在8085微处理器指令集下的汇编语言中,假设我们有如下操作ADD B
。
我知道这意味着“将B寄存器的数据添加到累加器寄存器并将内容存回累加器”.
这里助记词是什么,操作码是什么
ADD
(只有ADD没有ADD B
)是操作码还是助记符?
- 内部助记符转为16进制码如3E,所以这里是什么
这个十六进制代码是指
ADD
还是 ADD B
.
请帮忙。
通常opcode指的是操作类型(ADD),寄存器B是操作数。但是,对于固定且少量的操作数,相同的操作可以对所有可能的操作数具有不同的操作码。
操作码是指标识指令的二进制序列。所以对于 8085,我相信 0x80 将是 "ADD B"
的操作码
助记符是一种人类可读的名称,可帮助您记住说明。所以字符串 "ADD B" 是 0x80 的助记符。 "ADD B" 比 0x80 更容易记住。
一些架构有许多不同形式的相同助记符。从这样的架构中查看示例时,事情应该更容易理解。
例如x86 有 5 种形式的 32 位加法。 (8 位加法有很多形式,当然除了没有 32 位直接版本。16 位和 64 位加法在 32 位编码前面加上前缀字节编码。)
Table格式:OPCODE和操作数编码/MNEMONIC/OPERANDS(dest,src)
05 id ADD EAX, imm32 # special-case save-one-bye for adding to the accumulator
81 /0 id ADD r/m32, imm32
83 /0 ib ADD r/m32, imm8
03 /r ADD r32, r/m32 # src can be memory
01 /r ADD r/m32, r32 # dest can be memory
所以对于 add eax, edx
,有两种可能的编码:01 D0
(由 GNU 选择)或 03 whatever
(查找 mod/rm 字节的编码其他顺序的操作数留作 reader 的练习。)
/0
表示 mod/rm 字节中未使用的 src-reg 位被借用为操作码的一部分。 83 /4 ib
是 AND r/m32, imm8
。当人们说 x86 机器代码难以解码时,这就是他们正在谈论的事情(除了 variable-length 性质,以及可选前缀字节意味着操作码甚至不是第一个字节的事实。 .. 你必须先解码一条指令,然后才能知道开始解码下一条指令需要多长时间。x86 指令的并行 4 宽解码是 power-hungry。)
是有原因的
更极端的情况是x86使用mov
来表示几种不同类型的指令,由操作数决定:
- 常规
mov r32, r/m32
(或相反)
- mov-immediate注册或记忆
- mov to/from 段寄存器(所有这三种形式都记录在手册的同一页上)
- mov to/from 控制寄存器(甚至在手册中有不同的条目)
- mov to/from 调试寄存器(手册中的另一个单独条目)。
我想不出两个不同的助记符产生相同操作码的情况。但是单个助记符可以用不同的操作数产生不同的操作码。
对于非常常用的指令,操作数甚至可以编码到操作码字节中,以节省 space(这是 SergeyA 的回答)。您可以将 x86 的 B8
操作码视为 mov-imm32-to-eax。 (B8
到 BF
操作码都是要注册的 mov-immediate,每个都有不同的目标寄存器。)32 位 x86 有 single-byte 寄存器的 inc/dec 操作码。 x86-64 将 16 个操作码的连续范围重新用作 REX 前缀字节(留下 two-byte inc r/m32
形式作为 inc eax
的唯一选项)
在8085微处理器指令集下的汇编语言中,假设我们有如下操作ADD B
。
我知道这意味着“将B寄存器的数据添加到累加器寄存器并将内容存回累加器”.
这里助记词是什么,操作码是什么
ADD
(只有ADD没有ADD B
)是操作码还是助记符?- 内部助记符转为16进制码如3E,所以这里是什么
这个十六进制代码是指
ADD
还是ADD B
.
请帮忙。
通常opcode指的是操作类型(ADD),寄存器B是操作数。但是,对于固定且少量的操作数,相同的操作可以对所有可能的操作数具有不同的操作码。
操作码是指标识指令的二进制序列。所以对于 8085,我相信 0x80 将是 "ADD B"
的操作码助记符是一种人类可读的名称,可帮助您记住说明。所以字符串 "ADD B" 是 0x80 的助记符。 "ADD B" 比 0x80 更容易记住。
一些架构有许多不同形式的相同助记符。从这样的架构中查看示例时,事情应该更容易理解。
例如x86 有 5 种形式的 32 位加法。 (8 位加法有很多形式,当然除了没有 32 位直接版本。16 位和 64 位加法在 32 位编码前面加上前缀字节编码。)
Table格式:OPCODE和操作数编码/MNEMONIC/OPERANDS(dest,src)
05 id ADD EAX, imm32 # special-case save-one-bye for adding to the accumulator
81 /0 id ADD r/m32, imm32
83 /0 ib ADD r/m32, imm8
03 /r ADD r32, r/m32 # src can be memory
01 /r ADD r/m32, r32 # dest can be memory
所以对于 add eax, edx
,有两种可能的编码:01 D0
(由 GNU 选择)或 03 whatever
(查找 mod/rm 字节的编码其他顺序的操作数留作 reader 的练习。)
/0
表示 mod/rm 字节中未使用的 src-reg 位被借用为操作码的一部分。 83 /4 ib
是 AND r/m32, imm8
。当人们说 x86 机器代码难以解码时,这就是他们正在谈论的事情(除了 variable-length 性质,以及可选前缀字节意味着操作码甚至不是第一个字节的事实。 .. 你必须先解码一条指令,然后才能知道开始解码下一条指令需要多长时间。x86 指令的并行 4 宽解码是 power-hungry。)
更极端的情况是x86使用mov
来表示几种不同类型的指令,由操作数决定:
- 常规
mov r32, r/m32
(或相反) - mov-immediate注册或记忆
- mov to/from 段寄存器(所有这三种形式都记录在手册的同一页上)
- mov to/from 控制寄存器(甚至在手册中有不同的条目)
- mov to/from 调试寄存器(手册中的另一个单独条目)。
我想不出两个不同的助记符产生相同操作码的情况。但是单个助记符可以用不同的操作数产生不同的操作码。
对于非常常用的指令,操作数甚至可以编码到操作码字节中,以节省 space(这是 SergeyA 的回答)。您可以将 x86 的 B8
操作码视为 mov-imm32-to-eax。 (B8
到 BF
操作码都是要注册的 mov-immediate,每个都有不同的目标寄存器。)32 位 x86 有 single-byte 寄存器的 inc/dec 操作码。 x86-64 将 16 个操作码的连续范围重新用作 REX 前缀字节(留下 two-byte inc r/m32
形式作为 inc eax
的唯一选项)