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

时间:2016-01-21 14:44:47

标签: assembly machine-code mnemonics

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

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

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

  • 内部mneomonics被转换为十六进制代码,如3E,所以在这里 这个十六进制代码是指ADD B还是FOR /f "tokens=1,2" %%i IN ("%disktotal% %diskavail%") DO SET "disktotal=%%i"& SET "diskavail=%%j" (ECHO(Information for volume %volume% ECHO(TOTAL SIZE ---------- %disktotal:~0,-9% GB ECHO(AVAILABLE SIZE ------- %diskavail:~0,-9% GB) 请帮忙。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

e.g。 x86有5种形式的32位添加。 (8bit添加的形式也是一样多,当然除了32位立即版本之外。在32位编码之前,16位和64位的编码用前缀字节编码。)

表格格式: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机器码很难解码时,这就是他们所说的那种东西(除了可变长度性质,以及可选前缀字节意味着操作码甚至不是第一个) byte ...你必须先解码一条指令,然后才能知道开始解码下一条指令需要多长时间。有一个原因是x86指令并行4宽解码是耗电的。)

更极端的情况是x86使用mov来表示由操作数确定的几种不同类型的指令:

  • 常规mov r32, r/m32(或反向)
  • mov-immediate注册或记忆
  • mov to / from segment registers(所有这三种形式都记录在手册的同一页面上)
  • mov to / from control registers(甚至在手册中有不同的条目)
  • mov to / from debug registers(手册中另一个单独的条目)。

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

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

答案 2 :(得分:1)

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

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