2016-01-21 50 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的唯一選項)。