2016-01-21 46 views
0

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

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

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

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

  • 内部mneomonics被转换为十六进制代码,如3E,所以这里什么 这个十六进制代码是指,ADDADD B
    请帮忙。
+0

在字典中查找助记符:“帮助或意图帮助内存” 。 “add”比0x37或任何实际的数字代码更容易记住。 'add'是助记符,而对于8085,'add b'是一个特定的操作码,不同于(比如说)'add a'或'add c'。 –

+0

@MarcB请给我一个直接的答案。 –

+0

'ADD'是助记符。操作码是将被组装到程序中的指令值,其值将取决于指令的寻址模式(如果有)。 –

回答

2

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

+0

请回答问题的背景,即问题中的助记符和操作码。 –

+0

究竟我的答案中还不清楚什么? – SergeyA

+0

“ADD B”中的助记符和操作码是什么。十六进制代码是用于助记符还是操作码? –

1

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

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

+0

但这与其他人在上面所说的完全相反。 –

2

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

例如x86有5种形式的32位添加。 (除了当前不存在32位立即版本时,8位添加的格式也是一样多的,16位和64位添加在32位编码前加前缀字节编码)。

表格格式:OPCODE和操作数编码/助记符/ 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字节的编码另一个顺序的操作数留给读者作为练习。)

Th e /0表示mod/rm字节中未使用的src-reg位作为操作码的一部分借用。 83 /4 ibAND r/m32, imm8。当人们说x86机器代码难以解码时,这就是他们正在谈论的事情(除了可变长度本质,以及可选前缀字节意味着操作码甚至不是第一个字节......在开始解码下一个指令之前,你必须对指令进行大部分的解码。对x86指令进行并行4宽度解码需要耗电,这是有原因的。)


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

  • 定期mov r32, r/m32(或相反)
  • MOV-立即进行登记或存储器
  • mov来往段寄存器(所有这三种形式记录在手册中的同一页上)
  • mov to/from c ontrol寄存器(甚至在手册中有不同的条目)
  • mov进出调试寄存器(手册中的另一个单独条目)。

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

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