在8085微处理器指令集下的汇编语言中,假设我们有以下操作ADD
。
我知道这意味着" 将B的寄存器数据添加到累加器寄存器并将内容保存回累加器" 。
这里的助记符是什么,操作码是什么。
ADD B
(仅限ADD而不是ADD
)是操作码还是助记符?
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)
请帮忙。答案 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 ib
是AND r/m32, imm8
。当人们说x86机器码很难解码时,这就是他们所说的那种东西(除了可变长度性质,以及可选前缀字节意味着操作码甚至不是第一个) byte ...你必须先解码一条指令,然后才能知道开始解码下一条指令需要多长时间。有一个原因是x86指令并行4宽解码是耗电的。)
更极端的情况是x86使用mov
来表示由操作数确定的几种不同类型的指令:
mov r32, r/m32
(或反向)我无法想到两种不同助记符产生相同操作码的情况。但是单个助记符可以产生具有不同操作数的不同操作码。
对于非常常用的指令,操作数甚至可以编码到操作码字节中,以节省空间(这是SergeyA的答案)。您可以将x86' B8
操作码视为mov-imm32-to-eax。 (B8
到BF
操作码都是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更容易记住。