在8085微處理器的指令集下的彙編語言中,假設我們有以下操作ADD B
。
我知道這意味着「將B寄存器的數據添加到累加器寄存器,並將內容保存回累加器」。
助記符與操作碼有什麼區別
這裏什麼是記憶,什麼是操作碼。
ADD
(只有ADD而不是ADD B
)是操作碼還是助記符?- 內部mneomonics被轉換爲十六進制代碼,如3E,所以這裏什麼 這個十六進制代碼是指,
ADD
或ADD B
。
請幫忙。
在8085微處理器的指令集下的彙編語言中,假設我們有以下操作ADD B
。
我知道這意味着「將B寄存器的數據添加到累加器寄存器,並將內容保存回累加器」。
助記符與操作碼有什麼區別
這裏什麼是記憶,什麼是操作碼。
ADD
(只有ADD而不是ADD B
)是操作碼還是助記符?
ADD
或ADD B
。 通常操作碼是指操作類型(ADD),寄存器B是操作數。但是,對於固定且少量的操作數,對於所有可能的操作數,相同的操作可以具有不同的操作碼。
操作碼指的是識別指令的二進制序列。因此,對於8085,我相信0x80是「ADD B」的操作碼。
助記符是一種人類可讀的名稱,可以幫助您記住指令。所以字符串「ADD B」是0x80的助記符。 「ADD B」比0x80更容易記住。
但這與其他人在上面所說的完全相反。 –
某些體系結構具有許多不同形式的相同助記符。從這樣的體系結構中查看示例時,應該更容易理解。
例如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 ib
是AND r/m32, imm8
。當人們說x86機器代碼難以解碼時,這就是他們正在談論的事情(除了可變長度本質,以及可選前綴字節意味着操作碼甚至不是第一個字節......在開始解碼下一個指令之前,你必須對指令進行大部分的解碼。對x86指令進行並行4寬度解碼需要耗電,這是有原因的。)
一個更極端的情況是,x86使用mov
用於幾種不同類型的指令,由操作數確定:
mov r32, r/m32
(或相反)我不認爲兩個不同助記符產生相同的操作碼的情況。但是單個助記符可以產生具有不同操作數的不同操作碼。
甚至可以將操作數編碼到非常常用的指令的操作碼字節中,以節省空間(這是SergeyA的答案)。您可以將x86的B8
操作碼視爲mov-imm32-to-eax。 (B8
至BF
操作碼都是mov-immediate寄存器,每個寄存器都有不同的目標寄存器。)32位x86具有用於寄存器增量/減法的單字節操作碼。 x86-64重新調整了用作REX前綴字節的16個操作碼的連續範圍(將雙字節inc r/m32
作爲inc eax
的唯一選項)。
在字典中查找助記符:「幫助或意圖幫助內存」 。 「add」比0x37或任何實際的數字代碼更容易記住。 'add'是助記符,而對於8085,'add b'是一個特定的操作碼,不同於(比如說)'add a'或'add c'。 –
@MarcB請給我一個直接的答案。 –
'ADD'是助記符。操作碼是將被組裝到程序中的指令值,其值將取決於指令的尋址模式(如果有)。 –