在8085微处理器指令集下的汇编语言中,假设我们有如下操作ADD B
。
我知道这意味着“将B寄存器的数据添加到累加器寄存器并将内容保存回累加器”。
这里什么是助记符,什么是操作码。
ADD
(只有 ADD 而不是ADD B
)是操作码还是助记符?- 内部助记符转换为3E等十六进制代码,那么这里这个十六进制代码是指什么,
ADD
或者ADD B
。
请帮忙。
在8085微处理器指令集下的汇编语言中,假设我们有如下操作ADD B
。
我知道这意味着“将B寄存器的数据添加到累加器寄存器并将内容保存回累加器”。
这里什么是助记符,什么是操作码。
ADD
(只有 ADD 而不是ADD B
)是操作码还是助记符?
ADD
或者ADD B
。通常操作码是指操作类型(ADD),寄存器B是操作数。但是,对于固定且少量的操作数,相同的操作可以对所有可能的操作数具有不同的操作码。
操作码是指标识指令的二进制序列。所以对于 8085,我相信 0x80 将是“ADD B”的操作码
助记符是人类可读的名称,可帮助您记住指令。所以字符串“ADD B”是 0x80 的助记符。“ADD B”比 0x80 更容易记住。
一些架构有许多不同形式的相同助记符。从这样的架构中查看示例时,事情应该更容易理解。
例如 x86 有 5 种形式的 32 位加法。(8 位加法有很多形式,当然没有 32 位立即版本。16 位和 64 位加法在 32 位编码之前使用前缀字节编码。)
表格格式: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 字节的编码,留给读者练习。)
这/0
意味着 mod/rm 字节中未使用的 src-reg 位作为操作码的一部分被借用。 83 /4 ib
是AND r/m32, imm8
。当人们说 x86 机器码很难解码时,这就是他们正在谈论的那种事情(除了可变长度性质,以及可选前缀字节意味着操作码甚至不是第一个字节的事实......您必须先对一条指令进行解码,然后才能知道开始解码下一条指令需要多长时间。x86 指令的并行 4 宽解码耗电是有原因的。)
一个更极端的情况是 x86 使用mov
几种不同类型的指令,由操作数决定:
mov r32, r/m32
(或相反)我想不出两个不同的助记符产生相同的操作码的情况。但是单个助记符可以产生具有不同操作数的不同操作码。
操作数甚至可以编码到非常常用的指令的操作码字节中,以节省空间(这是 SergeyA 的答案)。您可以将 x86 的B8
操作码视为 mov-imm32-to-eax。(B8
toBF
操作码都是mov-immediate to register,每个都有不同的目标注册。)32位x86具有用于寄存器inc/dec的单字节操作码。x86-64 将 16 个操作码的连续范围重新用作 REX 前缀字节(将两字节inc r/m32
形式作为唯一的选项inc eax
。)