繁体   English   中英

助记符和操作码有什么区别

[英]What is the difference between Mnemonics and Opcode

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

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

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

  • 在内部,音组学被转换为十六进制代码,例如3E,因此这里该十六进制代码指的是ADDADD B
    请帮助。

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

某些体系结构具有相同助记符的许多不同形式。 从这种架构查看示例时,事情应该更容易理解。

例如x86有5种形式的32位添加。 (除了没有32位立即版本外,8位加法的形式也很多。除了16位和64位加法外,还用32位编码之前的前缀字节进行编码。)

表格格式:OPCODE和操作数编码/ MNEMONIC / OPERANDS(目标,源代码)

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 (或相反)
  • 立即移动到寄存器或存储器
  • 移入/移出段寄存器(手册中同一页上记录的所有这三种表格)
  • 移入/移出控制寄存器(甚至在手册中有不同的条目)
  • 从调试寄存器移入/移出(手册中的另一个单独条目)。

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

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

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

助记符是易于理解的名称,可以帮助您记住说明。 因此,字符串“ ADD B”是0x80的助记符。 “ ADD B”比0x80更容易记住。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM