0

在8085微处理器指令集下的汇编语言中,假设我们有如下操作ADD B
我知道这意味着“将B寄存器的数据添加到累加器寄存器并将内容保存回累加器”

  • 这里什么是助记符,什么是操作码。

  • ADD(只有 ADD 而不是ADD B)是操作码还是助记符?

  • 内部助记符转换为3E等十六进制代码,那么这里这个十六进制代码是指什么,ADD或者ADD B
    请帮忙。
4

3 回答 3

2

通常操作码是指操作类型(ADD),寄存器B是操作数。但是,对于固定且少量的操作数,相同的操作可以对所有可能的操作数具有不同的操作码。

于 2016-01-21T14:48:22.017 回答
2

操作码是指标识指令的二进制序列。所以对于 8085,我相信 0x80 将是“ADD B”的操作码

助记符是人类可读的名称,可帮助您记住指令。所以字符串“ADD B”是 0x80 的助记符。“ADD B”比 0x80 更容易记住。

于 2016-01-21T14:59:21.267 回答
2

一些架构有许多不同形式的相同助记符。从这样的架构中查看示例时,事情应该更容易理解。

例如 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 ibAND r/m32, imm8。当人们说 x86 机器码很难解码时,这就是他们正在谈论的那种事情(除了可变长度性质,以及可选前缀字节意味着操作码甚至不是第一个字节的事实......您必须先对一条指令进行解码,然后才能知道开始解码下一条指令需要多长时间。x86 指令的并行 4 宽解码耗电是有原因的。)


一个更极端的情况是 x86 使用mov几种不同类型的指令,由操作数决定:

  • 常规mov r32, r/m32(或相反)
  • mov-immediate 到寄存器或内存
  • 移入/移出段寄存器(所有这三种形式都记录在手册的同一页上)
  • 移入/移出控制寄存器(手册中甚至有不同的条目)
  • mov to/from debug registers(手册中的另一个单独条目)。

我想不出两个不同的助记符产生相同的操作码的情况。但是单个助记符可以产生具有不同操作数的不同操作码。

操作数甚至可以编码到非常常用的指令的操作码字节中,以节省空间(这是 SergeyA 的答案)。您可以将 x86 的B8操作码视为 mov-imm32-to-eax。(B8toBF操作码都是mov-immediate to register,每个都有不同的目标注册。)32位x86具有用于寄存器inc/dec的单字节操作码。x86-64 将 16 个操作码的连续范围重新用作 REX 前缀字节(将两字节inc r/m32形式作为唯一的选项inc eax。)

于 2016-01-21T16:22:35.590 回答