微機原理——指令系統——算數運算指令(ADD、ADC、SUB、SBB、INC、DEC、NEG、CMP、MUL、IMUL、DIV、IDIV、CBW、CWD、BCD調整)

博主聯系方式:
QQ:1540984562
QQ交流群:892023501
群里會有往屆的smarters和電賽選手,群里也會不時分享一些有用的資料,有問題可以在群里多問問。

算數運算指令

      • 1、加減法指令ADD、ADC 、SUB 、SBB 和增量減量指令INC、DEC、NEG
        • ADD ADC例題講解
        • SUB SBB例題講解
      • 2、比較指令CMP
        • CMP例題講解
      • 3、乘除指令MUL IMUL DIV IDIV
        • DIV、IDIV例題講解
      • 4、符號擴展指令CBW CWD
      • 5、BCD數運算調整指令(十進制調整指令)

算術

1、加減法指令ADD、ADC 、SUB 、SBB 和增量減量指令INC、DEC、NEG

(1)不帶進位位加法指令
指令格式:ADD DST,SRC ; DST←DST+SRC
語法格式:ADD reg / mem ,reg/mem /imm8/imm16
指令功能:完成兩個操作數相加,結果送目的操作數DST。
該指令要求DST、SRC 不能同時為存儲器,DST不能為立即數,運算結果對標志位有影響
例子:
例子
(2)ADC 帶進位位加法指令
指令格式: ADC DST,SRC
功能:與ADD指令相同,只是相加時要加上進位位的當前值。
完成的操作為:== (DST) ← (SRC)+(DST)+ CF ==
DST、SRC 不能同時為存儲器, SRC可為立即數,運算結果對標志位有影響
對狀態標志位的具體影響:

CF=1 二進制加法中最高有效位向高位有進位。
CF=0 二進制加法中最高有效位向高位無進位。
ZF=1 加法結果為0
ZF=0 加法結果不為0 。
OF=1 兩同符號數相加(正數+正數、或負數+負數),而結果符號與其相反。
OF=0 不同符號數相加。注意: (不同符號數相加不會產生溢出)
SF=1 加法結果為負(符號位為1)
SF=0 加法結果為正(符號位為0)。

ADD ADC例題講解

問:設在DVAR開始的連續8字節中分別存放著兩個數A(00127654H)和B(00049821H)(每個數為32位),求C=A+B,并將結果C放到DVARC開始的內存中
思路分析:完成雙字(32位)相加:先用ADD把低位字相加,再用ADC完成高位字的帶進位加法

data segmentDVAR DD 00127654H;DVAR DD 00049821H;DVARC DD ?	;存儲相加后的值
ends
;在數據段定義數據
LEA DI,DVAR;獲取DVAR地址
MOV AX,4[DI];第二個數的低位字的起始地址=DI+4,將其中內容送入AX
ADD AX,[DI];第一個數的低位字
MOV WORD PTR DVARC,AX;保存結果的低位字
MOV AX,6[DI];
ADC AX,2[DI];	帶進位		
MOV DVARC+2,AX;保存結果的高位字

語法知識點:
匯編中何時使用WORD/BYTE PTR
偽指令DD DW DB
(3) SUB DST,SRC 不帶借位減法指令
功能:進行兩個操作數的相減操作,結果送回DST。
完成的操作: DST←DST-SRC
(4) SBB DST,SRC 帶借位減法指令
功能:與SUB相類似,但相減時還應減去標志CF的當前值。
完成的操作: DST←DST-SRC-CF
語法格式:SUB(SBB) reg/mem ,reg/mem/imm
DST、SRC可以是存儲器或寄存器, 但不能同時為存儲器。運算結果對標志位有影響。
LIZi

SUB SBB例題講解

問:設DVAR1和DVAR2保存有雙字數,求(DVAR1)- (DVAR2),并將結果保存在雙字變量DVARR中。

data segmentDVAR1 DD 00127654H;DVAR2 DD 00049821H;DVARR DD ?	;存儲相減后的值
ends
;在數據段定義數據
MOV AX,WORD PTR DVAR1;
SUB AX,WORD PTR DVAR2;
MOV WORD PTR DVARR,AX;保存結果的低位字
MOV AX,WORD PTR DVAR1+2;
SBB AX,WORD PTR DVAR2+2;	帶借位		
MOV WORD PTR DVARR+2,AX;保存結果的高位字

(5) INC OPR 加1指令
對指定的操作數進行加1操作,其操作數OPRD可以是任意一個通用寄存器,也可以在內存單元中。
該指令影響標志位,但不影響CF標志位
完成的操作: OPR OPR+1

INC AL ; AL←AL+1
INC (SI); (SI) (SI)+1

(6) DEC OPR 減1指令
功能:實現對操作數的減1操作,操作數可以是通用寄存器,也可以在內存單元中。減1操作時,把操作數看作為無符號的二進制數。
完成的操作: OPRD OPRD-1
語法格式:DEC reg/mem

DEC BX ; BX BX-1
DEC(DI);(DI) (DI)-1

(7) NEG (取負指令)
格式: NEG DST;
描述
轉換成二進制算法:

OPR OPRD ‘+1
或: OPR FFFFH -(OPR)’+1

2、比較指令CMP

指令格式: CMP OPR1,OPR2;OPR1-OPR2 結果影響標志位。
語法格式:CMP reg/mem ,reg/mem/imm
功能:做兩個數的比較,與減法指令一樣執行OPR1-OPR2操作,但相減后不回送結果,只是根據相減結果修改標志位
OPR1、OPR2可以是存儲器或寄存器,不能同時為存儲器,OPR2還可為立即數,運算結果對標志位有影響。
比較結果有三種可能:AX>BX 、 AX<BX 、 AX=BX
對標志位的影響:

CF=1 減法中最高有效位向高位有借位( AX<BX )
CF=0 減法中最高有效位向高位無借位( AX≥BX )
ZF=1 結果為0(AX=BX);
ZF=0 ,結果不為0(AX≠BX)
OF=1 兩數符號相反(正數-負數、或負數-正數),而結果符號與減數(BX)相同。
OF=0 同符號數相減。

CMP例題講解

問:若自BLOCK開始的內存緩沖區中,有100個帶符號的數,希望找到其中最大的一個值,并將它放到MAX單元中。
分析思路:循環語句 加一減一指令、找到最大值:需要比較語句CMP
帶符號的數:一個字大小

data segmentBLOCK DD 00127654H;......BLOCK DD 00049821H;MAX DD ?;
ends
;在數據段定義數據
MOV BX,OFFSETBLOCK;		==LEA BX,BLOCK;	獲取地址
MOV AX,[BX];	將第一個數存入AX
INC BX;
INC BX;	地址轉到下一個數:BX+2
MOV CX,99;計數器置數
AGAIN:CMP AX,[BX];	AX中的數和BX指向的數
JG   NEXT     ;大于則轉,AX>[BX]
MOV AX,[BI];	否則把[BX]送入AX
NEXT:DEC CX;
INC BX;
INC BX;計數減1,bi指向下一個數
JNZ AGAIN;所有的數比較完了嗎?沒完轉AGAIN繼續
MOV [MAX],AX;	將AX內容送入存儲單元MAX

3、乘除指令MUL IMUL DIV IDIV

(1)無符號數乘法指令MUL
格式:MUL SRC ;(AX)(AL)×(SRC)字節乘法
(DX,AX)(AX)×(SRC)字乘法
語法格式:MUL reg/mem
要求:字節運算時,目的操作數(被乘數)(隱含指令)必須是累加器AL,在做乘法運算時要先把被乘數設置好,即被乘數和乘積是隱含的形式,被乘數和乘數都是無符號數,乘積存放在寄存器AX中。進行字運算時,目的操作數必須是累加器AX,乘積在寄存器DXAX中。源操作數不允許使用立即數
示意圖:
示意圖
(2) 帶符號數乘法指令IMUL
格式:IMUL SRC ;(AX) (AL)×(SRC)字節
;(DX,AX) (AX)×(SRC)字
語法格式:IMUL reg/mem
注意:操作同無符號數乘法相同
對標志位的影響也可相類比。

例: MOV AL 66H;被乘數送AL
MOV BL 88H;乘數送BL
MUL BL ;無符號乘法,AL×BL結果存于AX中
MOV AX,6666H ;被乘數(字)送AX
MOV BX,4567H ;乘數(字)送BX
MUL BX ;結果的高字在DX中,低字在AX中

何時使用帶符號和不帶符號?
MUL和IMUL指令的使用條件是由數的屬性決定(由程序設計者自己確定)。
如(11111111B)× (11111111B)為無符號數時為255×255=65025,
而為有符號數時為(-1)×(-1)=1,因此根據要相乘數的格式決定選用那一種指令。
對標志位的影響:
乘法指令運算結果影響狀態標志,但對CF、OF有特殊的定義
影響
字與字節相乘

MOV AL,15H;
CBW; CBW = convert byte to word邏輯意義就是al的符號擴展到ah
節擴展CBW的基本功能是(AH)=00H,當(AL)的最高有效位為0時。AH)=FFH,當(AL)的最高有效位為1時
MOV BX,0FB78H;
IMUL BX;
結果

(3)無符號數除法指令DIV (被除數和結果隱含)
格式:DIV SRC ;(AL) (AX)/(SRC)除法的商
字節操作 (AH) (AX)/(SRC)除法余數
字操作 (AX) (DX,AX)/(SRC)除法的商
(DX) (DX,AX)/(SRC)除法余數
(4)帶符號除法指令IDIV (被除數和結果隱含)
格式:IDIV SRC ;(AL) (AX)/(SRC)除法的商
字節操作 (AH) (AX)/(SRC)除法余數
字操作 (AX)(DX,AX)/(SRC)除法的商
(DX)(DX,AX)/(SRC)除法余數
形象表示:表述
== 需要注意點:==
1) 如果除數為0,則產生0型中斷。
2) 除法指令運算結果對狀態標志無定義。
3) 除法指令要求字操作時,被除數必須為32位,除數是16位,商和余數是16位;字節操作時,被除數必須為16位,除數是8位,商和余數是8位。(被除數必須大于除數)。
4)有符號與無符號除法完成的操作相同,只是做有符號除法時,操作數是有符號的,得到的商和余數也是有符號的,余數的符號同被除數符號相同。

DIV、IDIV例題講解

問:***分別實現下列數據的無符號和有符號除法
DATA7 DW 9400H ;被除數
DATA8 DW 0060H ;除數
QUOT DW ? ;商
REMAIN DW ? ;余數 ***

;無符號
MOV AX,DATA7;
MOV DX,0;
DIV DATA8;
MOV QUOT,AX;
MOV REMAN,DX;
;有符號
MOV AX,DATA7;
;CWD可將AX內容擴展到DX、AX。規則是若AX最高位=1,則執行后DX=FFFFH;若AX最高位=0,則執行后DX=0000H
IDIV DATA8;
MOV QUOT,AX;
MOV REMAN,DX;

符號擴展指令CBW,CWD是什么意思?

4、符號擴展指令CBW CWD

在這里插入圖片描述

5、BCD數運算調整指令(十進制調整指令)

開始寫這一類指令時感覺有點蒙,看了這篇文章感覺稍微好了點,建議先看這篇文章再往下了解具體指令。
http://www.elecfans.com/dianzichangshi/20171124586013.html
BCD碼:用4位二進制碼表示1位10進制數。
它和二進制碼并不相同,為了得到正確結果我們需要進行修正。
BCD分為兩類:
1)、分離BCD碼:8位寄存器包含一位BCD碼 (非壓縮BCD)
2)、組合BCD碼:8位寄存器包含2位BCD碼 (壓縮BCD)
1、加法調整指令AAA DAA
AAA——對AL中非壓縮的BCD數的加法結果進行調整;
具體操作:
1、對相加結果AL的低四位+6修正
2、觀察AF
AF有進位,則AH=1,CF=1,AF=l;
AF無進位,則AH=0,CF=0,AF=0。
3、清AL的高4位

DAA——對AL中的兩個壓縮十進制數相加之和進行調整,得到壓縮十進制和;
具體操作:
對相加結果AL的低4位和高4位分別進行+6修正。對標志位的影響等同于ADD指令
壓縮BCD和非壓縮BCD的區別
壓縮BCD碼
用一個字節表示兩位BCD碼,高位表示十位數BCD碼,低位表示個位數BCD碼,稱為壓縮型BCD碼。
例如:十進制數56用壓縮8421BCD碼表示為0101 0110
非壓縮BCD碼
用一個字節表示一位BCD碼,高位為0,低位為BCD碼。
例如:十進制數5用非壓縮8421BCD碼表示為0000 0101
參考鏈接
問:計算十進制數的運算:4+8

;通過鍵盤輸入得到的是ASCII碼,將其看做分離BCD碼,則高4位為無效部分,因此不需要清除.
MOV AL,34H;		BCD表示十進制數34
MOV BL,28H;		BCD表示十進制數28
ADD AL.BL;
;在此之前(AL)=5CH,(按照二進制相加)
DAA;
;在此之后,(AL)=62H(轉化成BCD碼)

2、減法調整指令AAS DAS
AAS——對AL中非壓縮的BCD數的減法結果進行調整;
對非壓縮BCD碼的低位AL進行減6處理,觀察AF有無借位
AF有借位,則CF=1,AF=l;
AF無借位,則CF=0,AF=0。
DAS——對AL中的兩個壓縮十進制數相減之差進行調整,得到壓縮十進制差;
對壓縮BCD碼的高位AH和低位AL都進行減6處理。對標志位的影響等同于SUB指令。
問:計算十進制數的運算:5-9

;通過鍵盤輸入得到的是ASCII碼,將其看做分離BCD碼,則高4位為無效部分,因此不需要清除.
MOV AL,05H;		BCD表示十進制數5
MOV BL,09H;		BCD表示十進制數9
SUB AL.BL;
AAS

問:計算十進制數的運算:31-87

;通過鍵盤輸入得到的是ASCII碼,將其看做分離BCD碼,則高4位為無效部分,因此不需要清除.
MOV AL,31H;		BCD表示十進制數5
MOV BL,87H;		BCD表示十進制數9
SUB AL.BL;
DAS

3、乘法調整指令AAM
AAM——對AX中兩個ASCII未壓縮十進制相乘結果進行調整;
調整方法:將結果(AL)除以10,商為(AH)的低4位,余數為(AL)的低4位
問:計算十進制數的運算:78*

;通過鍵盤輸入得到的是ASCII碼,將其看做分離BCD碼,則高4位為無效部分,因此不需要清除.
MOV AL,7;		
MOV BL,8;	
MUL BL;
AAM

4、除法調整指令AAM
AAD——在除法指令前對AX中ASCII未壓縮的十進制數進行調整;
調整方法:(AL)=(AH)*10+(AL);使(AH)=0,接下來操作是正常的除法操作。

問:計算十進制數的運算:274*

;通過鍵盤輸入得到的是ASCII碼,將其看做分離BCD碼,則高4位為無效部分,因此不需要清除.
MOV AX,0207H;		
MOV BL,4;	
AAD ;(AX)<-001BH
DIV BL;

總結,因為BCD的類型而總分為兩類的指令其實本質相同,其中,
加減乘都是通過一些操作從而將結果進行修正,從二進制轉為BCD形式。
除法卻是對被除數進行操作,這點需要特別注意
*

【沒事兒可以到我主頁看看】https://blog.csdn.net/qq_42604176

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378672.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378672.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378672.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux系統出現Too many open files 錯誤、linux too many open files

故障一、linux too many open files linux系統出現Too many open files 錯誤&#xff0c;這是因為文件描述符大小不夠&#xff0c;或者有不正常的網絡連接(Socket也是一種特殊的文件)、文件IO沒有關閉并釋放出文件描述符&#xff08;文件句柄&#xff0c;File Operator&#xf…

精通init ramfs構建

一、init ramfs是什么   在2.6版本的linux內核中&#xff0c;都包含一個壓縮過的cpio格式的打包文件。當內核啟動時&#xff0c;會 從這個打包文件中導出文件到內核的rootfs文件系統&#xff0c;然后內核檢查rootfs中是否包含有init文件&#xff0c;如果有則執行它&#xff0…

python 示例_帶有示例的Python date isocalendar()方法

python 示例Python date.isocalendar()方法 (Python date.isocalendar() Method) date.isocalendar() method is used to manipulate objects of date class of module datetime. date.isocalendar()方法用于操作模塊datetime的日期類的對象。 It uses a date class object a…

mysql 函數重載_[賦值]函數,變量,重載 ,_第1頁_169IT

[java/j2ee] java實現簡單的給sql語句賦值的示例代碼本身很簡單。拼接sql的時候&#xff1f;不好數&#xff0c;簡單的用來賦值。代碼如下:/** * TODO 循環賦值,缺少的類型可隨時添加 * author Lucius * param pt * param list * throws SQLException */ public static…

20-SIFT算法

import cv2 import numpy as np from matplotlib import pyplot as pltdef show_photo(name,picture):#圖像顯示函數cv2.imshow(name,picture)cv2.waitKey(0)cv2.destroyAllWindows()img cv2.imread(E:\Jupyter_workspace\study\data/cfx.png) gray cv2.cvtColor(img,cv2.COL…

Opencv——寫入或讀取數據到XML或YAML文件

什么是XML、YAML文件 XML(eXtensible Markup Language)是一種元標記語言。所謂“原標記”&#xff0c;就是開發者可以根據自身需要定義的標記&#xff0c;任何滿足XML命名規則的名稱都可以標記。此外&#xff0c;XML是一種語義/結構化語言&#xff0c;它描述了文檔的結構和語義…

mysql 遷移 nosql_從關系型Mysql到Nosql HBase的遷移實踐

2013年11月22-23日&#xff0c;作為國內唯一專注于hadoop技術與應用分享的大規模行業盛會&#xff0c;2013 Hadoop中國技術峰會(China Hadoop Summit 2013)于北京福朋喜來登集團酒店隆重舉行。來自國內外各行業領域的近千名CIO、CTO、架構師、IT經理、咨詢顧問、工程師、Hadoop…

Oracle EBS數據定義移植工具:FNDLOAD

在實際的EBS二次開發中&#xff0c;我們經常會碰到需要在各個環境之間移植二次開發的程序對象以及數據定義&#xff0c;如在EBS二次開發中并發請求的定義會涉及到&#xff1a;可執行、并發程序、值集、請求組等的定義&#xff0c;定義需要從開發環境、測試環境、UAT環境一直到正…

21-特征匹配方法(Brute-Force蠻力匹配)

Brute-Force蠻力匹配 cv2.BFMatcher(crossCheck True) crossCheck表示兩個特征點相互匹配 例如A中的第i個特征點與B中的第j個特征點最近&#xff0c;并且B中的第j個特征點到A中的第i個特征點也是 NORM_L2&#xff1a;歸一化數組的(歐幾里得距離)&#xff0c;如果其他特征計算…

weakhashmap_Java WeakHashMap values()方法與示例

weakhashmapWeakHashMap類values()方法 (WeakHashMap Class values() method) values() method is available in java.util package. values()方法在java.util包中可用。 values() method is used to get the values that exist in this map to be viewed in a collection. val…

Opencv——幾何空間變換(仿射變換和投影變換)

幾何空間變換【1】幾何變換&#xff08;空間變換&#xff09;簡述【2】變換矩陣知識簡述齊次坐標的概念幾何運算矩陣【3】圖像的仿射變換1、平移變換2、比例縮放3、旋轉4、對稱變換&#xff08;不做展示&#xff09;1、關于X軸變換2、關于Y軸變換3、關于直線YX變換4、關于直線Y…

用于主題檢測的臨時日志(e1784e6f-037e-45de-bad1-8bbc239818ee - 3bfe001a-32de-4114-a6b4-4005b770f6d7)...

這是一個未刪除的臨時日志。請手動刪除它。(578392f7-2207-4b01-b36d-c483f0699988 - 3bfe001a-32de-4114-a6b4-4005b770f6d7)轉載于:https://www.cnblogs.com/Fly-sky/archive/2011/03/03/1969850.html

probuffer java_Protocol Buffer的使用

Probotbuf簡介在網絡通信和通用數據交換等應用場景中經常使用的技術是 JSON 或 XML&#xff0c;這兩種技術常被用于數據的結構化呈現和序列化。我們可以從兩個方面來看JSON 和 XML與protobuf的異同&#xff1a;一個是數據結構化&#xff0c;一個是數據序列化。這里的數據結構化…

根據DbSchema生成代碼2

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel; using System.Threading; using System.IO; using Rocky;namespace Rocky.CodeBuilder {public class DbBuilder : Disposable{#region 字段public even…

22-隨機抽樣一致算法RANSAC

隨機抽樣一致算法(Random sample consensus&#xff0c;RANSAC) 看似復雜&#xff0c;其基本思想就是&#xff1a;隨機選取倆點&#xff0c;然后連接&#xff0c;給定一個容忍范圍&#xff0c;在這個范圍內的點越多越好&#xff0c;然后不斷的迭代進行找兩點之間容忍范圍內點最…

treeset比較器_Java TreeSet比較器()方法與示例

treeset比較器TreeSet類的compare()方法 (TreeSet Class comparator() method) comparator() method is available in java.util package. 比較器()方法在java.util包中可用。 comparator() method is used to get the Comparator object based on customizing order the eleme…

智能車復工日記【1】——菜單索引回顧

博主聯系方式: QQ:1540984562 QQ交流群:892023501 群里會有往屆的smarters和電賽選手,群里也會不時分享一些有用的資料,有問題可以在群里多問問。 菜單回顧 1、系列文章解析結構元素菜單圖示菜單缺點:1、系列文章 【智能車Code review】—曲率計算、最小二乘法擬合 【智能…

[轉載]Oracle 11g R1下的自動內存經管(2)

AMM調整 除現有的用于內存經管的V$視圖外&#xff0c;Oracle 11g還新添加了下面4個視圖用于自動內存經管&#xff1a; ? ◆V$MEMORY_CURRENT_RESIZE_OPS ? ◆V$MEMORY_DYNAMIC_COMPONENTS ? ◆V$MEMORY_RESIZE_OPS ? ◆V$MEMORY_TARGET_ADVICE 轉載于:https://www.cnblogs.…

23-背景建模

幀差法 由于場景中的目標在運動&#xff0c;目標的影像在不同圖像幀中的位置不同。該類算法對時間上連續的兩幀圖像進行差分運算&#xff0c;不同幀對應的像素點相減&#xff0c;判斷灰度差的絕對值&#xff0c;當絕對值超過一定閾值時&#xff0c;即可判斷為運動目標&#xf…

DB2 9 運用開辟(733 考試)認證指南,第 3 部門: XML 數據獨霸(4)

議決運用順序存儲和檢索 XMLXML 編碼字符編碼在汗青上&#xff0c;術語 字符集、字符編碼 和 碼頁 都有雷同的意義&#xff1a;一個字符集和一個二進制碼集&#xff0c;其中每個碼示意一個字符。&#xff08;碼頁是來自 IBM 的一個術語&#xff0c;示意一個大型主機或 IBM PC 上…