8085微處理器減法操作指令
在兩個數的減法運算中,8085要求累加器(Accumulator)儲存其中一個運算元,然後從該運算元中減去由以下方式指定的另一個運算元。
—8位暫存器的內容;
—HL暫存器對指向的記憶體單元的內容;
—8位立即數。
在8085指令集中,**SUB** 是一個助記符,代表“從累加器中減去R的內容”。 這裡R代表以下任意一個暫存器,或者HL暫存器對指向的記憶體單元M。
R = A, B, C, D, E, H, L, 或 M
助記符,運算元 | 操作碼(十六進位制) | 位元組數 |
---|---|---|
SUB A | 97 | 1 |
SUB B | 90 | 1 |
SUB C | 91 | 1 |
SUB D | 92 | 1 |
SUB E | 93 | 1 |
SUB H | 94 | 1 |
SUB L | 95 | 1 |
SUB M | 96 | 1 |
在這條指令中,暫存器R的內容將從累加器中減去,結果差將儲存到累加器中,覆蓋累加器之前的內容。由於R可以是8個值中的任意一個,因此此類指令有8個操作碼,如上表所示。它只佔用記憶體中的1個位元組。
讓我們以**SUB E**作為此類指令的示例。由於它是一條1位元組指令,因此它將佔用記憶體中的單個位元組空間。該指令執行的結果如下面的示例所示。
示例1
假設累加器和E暫存器初始值分別為ABH和CDH。那麼,執行**SUB E**指令後,暫存器的內容將變為:
之前 | 之後 | |
---|---|---|
(A) | ABH | DEH |
(E) | CDH | CDH |
(F) | 任意值 | Cy=1,AC=0,S=1,P=1,Z=0 |
地址 | 十六進位制程式碼 | 助記符 | 註釋 |
---|---|---|---|
2004 | 93 | SUB E | 累加器 = 累加器 + E的二進位制補碼 |
這裡Cy=1表示結果為負。實際上A – E = A + E的二進位制補碼。以下是計算過程:
(A) BH (1010 1011) ---------------> 1010 1011
二進位制補碼
(E) CDH (1100 1101) ---------------> 0011 0011
---------
1101 1110 (DEH)
以下是**SUB E**指令的時序圖:
**總結:**因此,這條指令**SUB E**需要1個位元組、1個機器週期(操作碼獲取)和4個T狀態才能執行,如時序圖所示。
示例2
假設累加器和E暫存器初始值分別為CDH和ABH。那麼,執行**SUB E**指令後,暫存器的內容將變為:
之前 | 之後 | |
---|---|---|
(A) | CDH | 22H |
(E) | ABH | ABH |
(F) | 任意值 | Cy=0,AC=1,S=0,P=1,Z=0 |
地址 | 十六進位制程式碼 | 助記符 | 註釋 |
---|---|---|---|
2004 | 93 | SUB E | 累加器 = 累加器 + E的二進位制補碼 |
這裡Cy=0表示結果為正。實際上A – E = A + E的二進位制補碼。以下是計算過程:
(A) CDH (1100 1101) ---------------> 1100 1101
二進位制補碼
(E) ABH (1010 1011) ---------------> 0101 0101
---------
0010 0010 (22H)
以下是**SUB E**指令的時序圖:
**總結:**因此,這條指令**SUB E**需要1個位元組、1個機器週期(操作碼獲取)和4個T狀態才能執行,如時序圖所示。
在8085指令集中,**SUI** 是一個助記符,代表“從累加器中減去立即數”,這裡**d8**代表任意8位或1位元組資料。這條指令用於從累加器中減去8位立即數。減法的結果將儲存到累加器中,覆蓋其之前的內容。由於它是一個算術指令,因此標誌位將根據結果進行影響。它是一條2位元組指令,在記憶體中佔用2個位元組。
助記符,運算元 | 操作碼(十六進位制) | 位元組數 |
---|---|---|
SUI 資料 | D6 | 2 |
當我們發出**SUI d8**指令時,實際上會將d8的二進位制補碼與累加器的內容相加。結果將儲存回累加器。
示例1
SUI ABH 是此類指令的一個示例。這意味著從累加器的內容中減去ABH的二進位制補碼。假設累加器的初始內容為CDH。以下是跟蹤表:
之前 | 之後 | |
---|---|---|
(A) | CDH | 22H |
(F) | 任意值 | Cy=0,AC=1,S=0,P=1,Z=0 |
地址 | 十六進位制程式碼 | 助記符 | 註釋 |
---|---|---|---|
2002 | D6 | SUI ABH | 累加器 = 累加器 + ABH的二進位制補碼 |
2003 | AB | 運算元 ABH |
這裡Cy=0表示結果為正。實際上A – ABH = A + ABH的二進位制補碼。以下是計算過程:
(A) CDH (1100 1101) ---------------> 1100 1101
二進位制補碼
(d8) ABH (1010 1011) ---------------> 0101 0101
---------------
0010 0010 (22H)
以下是**SUI ABH**指令的時序圖:
**總結:**因此,這條指令**SUI d8**需要2個位元組、2個機器週期(操作碼獲取、記憶體讀取)和7個T狀態才能執行,如時序圖所示。
示例1
SUI ABH 是此類指令的一個示例。這意味著從累加器的內容中減去ABH的二進位制補碼。假設累加器的初始內容為CDH。以下是跟蹤表:
之前 | 之後 | |
---|---|---|
(A) | CDH | 22H |
(F) | 任意值 | Cy=0,AC=1,S=0,P=1,Z=0 |
地址 | 十六進位制程式碼 | 助記符 | 註釋 |
---|---|---|---|
2002 | D6 | SUI ABH | 累加器 = 累加器 + ABH的二進位制補碼 |
2003 | AB | 運算元 ABH |
這裡Cy=0表示結果為正。實際上A – ABH = A + ABH的二進位制補碼。以下是計算過程:
(A) CDH (1100 1101) ---------------> 1100 1101
二進位制補碼
(d8) ABH (1010 1011) ---------------> 0101 0101
--------------
0010 0010 (22H)
以下是**SUI ABH**指令的時序圖:
**總結:**因此,這條指令**SUI d8**需要2個位元組、2個機器週期(操作碼獲取、記憶體讀取)和7個T狀態才能執行,如時序圖所示。
示例2
SUI CDH 是此類指令的一個示例。這意味著從累加器的內容中減去CDH的二進位制補碼。假設累加器的初始內容為ABH。以下是跟蹤表:
之前 | 之後 | |
---|---|---|
(A) | ABH | DEH |
(F) | 任意值 | Cy=1,AC=0,S=1,P=1,Z=0 |
地址 | 十六進位制程式碼 | 助記符 | 註釋 |
---|---|---|---|
2002 | D6 | SUI CDH | 累加器 = 累加器 + CDH的二進位制補碼 |
2003 | CD | 運算元 CDH |
這裡Cy=1表示結果為負。實際上A – CDH = A + CDH的二進位制補碼。以下是計算過程:
ABH (1010 1011) ---------------> 1010 1011
二進位制補碼
(d8) CDH (1100 1101) ---------------> 0011 0011
--------------
1101 1110 (DEH)
以下是**SUI CDH**指令的時序圖:
**總結:**因此,這條指令**SUI d8**需要2個位元組、2個機器週期(操作碼獲取、記憶體讀取)和7個T狀態才能執行,如時序圖所示。