【问题标题】:What is the difference between Mnemonics and Opcode助记符和操作码有什么区别
【发布时间】:2016-01-21 14:44:47
【问题描述】:

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

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

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

  • 在内部将助记符转换为 3E 等十六进制代码,所以这里有什么 这个十六进制代码是指ADD 还是ADD B
    请提供帮助。

【问题讨论】:

  • 在字典中查找助记词:“协助或打算协助记忆”。 add 比 0x37 或任何操作的实际数字代码更容易记住。 add 是助记符,而对于 8085,add b 是一个特定的操作码,不同于(比如)add aadd c
  • @MarcB 请直接回答我。
  • ADD 是助记符。操作码是将汇编到程序中的指令值,其值将取决于指令的寻址方式(如果有)。
  • 不能,因为在这种情况下,两者都是。 intel x86/x85/etc... 是一个 CISC 指令集,因此 SAME 操作有特定的操作码,但针对不同的寄存器。你写add b,它映射到一些数字代码。你写add a,它映射到不同的代码,即使它基本上是相同的指令。
  • @MarcB 谢谢。而被映射的十六进制代码是助记符还是完整的操作码?

标签: assembly machine-code mnemonics


【解决方案1】:

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

【讨论】:

  • 请回答问题的上下文,即问题中的助记符和操作码。
  • "ADD B" 中的助记符和操作码是什么。十六进制代码用于助记符或操作码?
  • ADD 是助记符。 8085 的 ADD B 的操作码是 0x88。
  • 感谢帮助。 :D
【解决方案2】:

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

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

【讨论】:

  • 但这与上面其他人所说的完全相反。
【解决方案3】:

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

例如x86 有 5 种形式的 32 位加法。 (8bit add 的形式一样多,当然没有 32bit 立即版本。16 和 64bit add 在 32bit 编码之前使用前缀字节编码。)

表格格式: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-wide 解码非常耗电是有原因的。)


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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    相关资源
    最近更新 更多