微機原理與單片機應用課件:第7章 匯編語言與匯編程序1-3_第1頁
微機原理與單片機應用課件:第7章 匯編語言與匯編程序1-3_第2頁
微機原理與單片機應用課件:第7章 匯編語言與匯編程序1-3_第3頁
微機原理與單片機應用課件:第7章 匯編語言與匯編程序1-3_第4頁
微機原理與單片機應用課件:第7章 匯編語言與匯編程序1-3_第5頁
已閱讀5頁,還剩141頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第7章 匯編語言與匯編程序符號指令(symbolic instruction)與機器指令(machine instruction)用符號指令書寫程序的語言稱為匯編語言(Assembly language)匯編:把匯編語言寫成的源程序翻譯成機器指令(目標程序)基本匯編:分配存儲區(qū)、進制轉換、計算表達式的值、語法檢查等。宏匯編:含宏指令宏匯編的三種基本指令:符號指令、偽指令、宏指令17.1 符號指令中的表達式符號指令:指令中使用助記符和用符號表示的操作數(shù)。符號用來表示指令的功能、某個存儲單元、數(shù)據(jù)注意:以字母開始的十六進制數(shù),要在其前面添加一個前導0. 例如:-1的補碼應寫為0FFH27.1.1

2、常量1、常量數(shù)值常量:如2345D,0FFH,A,BCD符號常量:由偽指令“EQU”定義,或由“=”號定義 P EQU 314 或 P=1匯編程序不給符號常量分配存儲單元。注意:符號常量名后面沒有冒號數(shù)值表達式允許對常量進行算術、邏輯和關系運算。如:COUNT EQU $-10037.1.2 標號標號是指令地址的符號表示,也可以是過程名標號的定義用“:”定義 CYCLE: MOV AL, SI 注意:使用符號(匯編)指令時,標號后面有冒號用于PROC 和ENDP偽指令定義過程時 MAIN PROC FAR MAIN ENDP標號的屬性:段基址、偏移地址、類型(FAR/NEAR)47.1.3 變

3、量 變量是代表存放在某些存儲單元的數(shù)據(jù),這些數(shù)據(jù)在程序運行期間隨時可以修改。 為了便于對變量的訪問,它常常以變量名的形式出現(xiàn)在程序中。 (1)變量的定義與預置:定義變量就是給變量分配存儲單元,且對這個存儲單元賦于一個符號名一變量名,同時將這些存儲單元預置初值。 定義變量使用數(shù)據(jù)定義偽指令DB(定義字節(jié)),DW(定義字),DD(定義雙字)。 變量定義格式: 變量名 數(shù)據(jù)定義偽指令 表達式,5 data segment BUFF DW 2301H,6745H,0AB89H,0EFCDH BINA DB A data ends經過定義的變量,每個變量均有3個屬性: 段屬性(SEG):表示變量存放在哪

4、一個邏輯段中(即變量所在段的段基值。)偏移量屬性(OFFSET):表示變量在邏輯段中離段起始點的字節(jié)數(shù)。類型屬性(TYPE):表示變量占用存儲單元的字節(jié)數(shù)。偏移地址存儲器BUFF00000123456789ABCDEF6表達式可以有如下幾種情況:數(shù)值表達式。 DA-BYTE DB 50H,51HASCII碼字符串 B1 DB AB$地址表達式 W1 DW B2 B2 DB 13,1,3?表達式 不帶引號的?表示可預置任何內容。 DA-B DB ?,? n DUP表達式 DUP (duplicate)是定義重復數(shù)據(jù)操作符。 B2 DB 2 DUP(-5,-1) 7地址表達式類型的變更使用類型PT

5、R 地址表達式BYTE PTR W1WORD PTR B2BXBYTE PTR BX+587.2 符號指令的尋址方式由指令字節(jié)給出的信息求出操作數(shù)的地址稱為有效地址EA。尋找(得到)操作數(shù)有效地址的方法稱為操作數(shù)的尋址方法尋找(得到)操作數(shù)有效地址和存取操作數(shù)的過程稱為指令的尋址操作 符號指令與偽指令語句的格式是類似的。一般情況下,匯編語言的語句可以由部分構成: 標號: 助記符 目的操作數(shù) 源操作數(shù) ;注釋 其中帶方括號的部分表示任選項,可以有,也可以沒有。例: LOOPER: MOV AL,DATA2SI;取一個字節(jié)加數(shù) DATA1 DB 0F8H,60H,0ACH,74H,3BH ;被加數(shù)

6、9(一)操作數(shù)尋址方式 共七種尋址方式1. 立即尋址2. 寄存器尋址3. 直接尋址4. 間接尋址 5種與存儲單元 5. 基址尋址 有關的尋址6. 變址尋址 (存儲器操作數(shù))7. 基址變址尋址7種10以數(shù)據(jù)傳送指令MOV為例介紹尋址方式。指令 MOV dst, src 執(zhí)行 (dst) (src)即: 源操作數(shù)的內容不變, 目的操作數(shù) 源操作數(shù)11立即尋址方式 操作數(shù)直接存放在指令中,緊跟在操作碼之后,作為指令的一部分,存放在代碼段里,這種操作數(shù)稱為立即數(shù)。 操作數(shù)在指令中,取來指令立即可得到操作數(shù)。稱該操作數(shù)為立即數(shù)。 立即數(shù)可以是8位或16位(16位的立即數(shù)是高位字節(jié)放在高地址,低位字節(jié)放在

7、低地址)。應用場合: 立即數(shù)常用來給寄存器或內存單元賦初值。例1 MOV AX , 2056H 結果 ( AH ) = 20H ( AL ) = 56H 例2 MOV AL , 78 H 結果 ( AL ) = 78H注意:只能用于源操作數(shù)字段,不能用于目的操作數(shù)字段。低地址高地址122. 寄存器尋址方式操作數(shù)在寄存器中,指令中指定寄存器名 8 位操作數(shù), 用 8 位寄存器: AH、AL、BH、BL、CH、CL、DH、DL 16 位操作數(shù),用 16 位寄存器: AX、BX、CX、DX、SP、BP、SI、DI ( CS、DS、SS、ES僅用在部分傳送指令中) 這種尋址方式因為操作數(shù)在寄存器中不需

8、要訪問存儲器因此運算速度較高。13例1 MOV AX , 2056H 執(zhí)行后:(AX)=2056H例2 MOV BL , AH 執(zhí)行前:(BL) = 12H, (AH) = 78H 執(zhí)行后:(BL) = 78H , (AH) = 78H 立即數(shù)尋址、寄存器尋址的操作數(shù), 不用在取完指令后再到內存中取數(shù)。14存儲器尋址指令中用 給出存儲單元的偏移地址。 操作數(shù)的偏移地址又稱有效地址EA ( Efficient Address)按給出偏移地址方式的不同,存儲器尋址分為以下5種:直接尋址 MOV AL, 1000H 間接尋址 MOV AL, BX 基址尋址 MOV AL, SS: BP + 10H

9、變址尋址 MOV AL, BX + SI 基址變址尋址 MOV AL, BX + SI + 10H 指令中用 給出偏移地址,或有效地址EA。153直接尋址方式(Direct addressing):操作數(shù)地址的位偏移量,直接包含在指令中,存放在代碼段中指令操作碼之后, 但操作數(shù)一般存放在數(shù)據(jù)段中, 必須先求出操作數(shù)的物理地址, 然后再訪問存儲器才能取得操作數(shù)。直接尋址方式要點: 存儲器操作數(shù)的有效地址EA在指令中直接給出。 例 MOV AL, 1000H 默認段寄存器為DS。 操作數(shù)所在內存單元的物理地址為: PA = ( DS )10H + EA 直接尋址方式默認段寄存器為DS16例:MOV

10、 AX , 1000 H 若 ( DS ) = 2000H 內存操作數(shù)的物理地址為: PA = ( DS )10H +EA = 2000H 10H + 1000H = 21000H 執(zhí)行后 (AX)= 3040H 思考: 指令 MOV AX,1000H 與指令MOV AX, 1000H有什么不同?17在匯編語言程序中,允許不直接用數(shù)值表示偏移地址時,而用符號代替數(shù)值表示地址,稱符號地址(變量名)。例 符號buffer表示一個地址。 MOV AX , buffer或寫成 MOV AX , buffer 源操作數(shù)為buffer指向的內存單元的內容符號地址( 變量名)經匯編連接后,與一個確定的數(shù)值地

11、址相對應,可用操作符Offset 獲取變量的偏移地址。故 PA = ( DS )10H + Offset buffer 指令執(zhí)行結果 ( AX ) = 0B0A H如:buffer在附加段中, 則應指定段跨越。(段跨越也可以是CS 、SS段寄存器) MOV AX,ES:buffer 或MOV AX,ES:buffer184. 間接尋址(又稱寄存器間接尋址 Register indirect addressing) 操作數(shù)放在存儲器里,操作數(shù)的有效地址EA由寄存器給出,寄存器的內容為操作數(shù)的有效地址。 可用的寄存器有 BX、SI、DI、BP 如: MOV AL, BX MOV AH, SI MO

12、V DL, DI MOV DH, BP 19 默認段寄存器的關系: 使用BX、SI、DI,默認段寄存器為DS (BX) PA = ( DS )10H + (SI) (DI) 使用BP,默認段寄存器為SSPA = ( SS )10H + ( BP ) 20例: MOV AX , DI 若 ( DS ) = 3000H ( DI ) = 2000H 則內存操作數(shù)的物理地址為: PA = ( DS )10H + ( DI ) = 32000H 執(zhí)行后 (AX) = (32000H) = 400BH 思考: 指令 MOV AX, DI 與指令MOV AX, DI有什么不同?21例: MOV AX ,

13、BP 若 ( SS ) = 4000H ( BP ) = 3000H 則內存操作數(shù)的物理地址為: PA = ( SS )10H + ( BP ) = 43000H 指令執(zhí)行后 (AX) = (43000H) = 0102H225. 基址尋址(Base Mode,寄存器相對尋址) 操作數(shù)的有效地址是一個基址或變址寄存器的內容和指令中指定的8位或16位位移量(displacement)之和。 可 用的寄存器有 BX、DI、SI、BP , 與寄存器間接尋址相同 如: MOV AL, BX +10HMOV AH, DI+20H MOV DL, 30H SI MOV DH, 40H BP 23 默認段寄

14、存器的關系與寄存器間接尋址相同,允許段跨越。 使用BX、SI、DI,默認段寄存器為DS (BX) PA = ( DS )10H + (SI) + 偏移量 (DI) 使用BP,默認段寄存器為SSPA = ( SS )10H + ( BP ) + 偏移量 24例: MOV AX , BX+30H 若 ( DS ) = 2000H ( BX ) = 1000H 則內存操作數(shù)的物理地址為: PA = ( DS )10H + ( BX ) + 30H = 21030H 指令執(zhí)行后: (AX) = (21030H) = 8976H 25例: MOV AX ,60H BP 若 ( SS ) = 3000H

15、( BP ) = 200H 則內存操作數(shù)的物理地址為: PA = ( SS )10H + ( BP ) + 60H = 30260H 指令執(zhí)行后: (AX) = (30260H) = 0ABCH 266. 變址尋址 (Based-Indexed Mode, 基址加變址尋址) 操作數(shù)的有效地址由一個基址寄存器與一個變址寄存器之和給出。 可用的基址寄存器為 BX 、BP ,變址寄存器為 SI 、DI。 如 MOV AL, BX+SI MOV AX, BXDI MOV DL, BP+SI MOV DX, BPDI 27 默認段寄存器由基址寄存器決定,允許段跨越。 基址寄存器為BX,默認段寄存器為DS

16、 (SI)PA = ( DS )10H + ( BX ) + (DI) 基址寄存器為BP,默認段寄存器為SS (SI)PA = ( SS )10H + ( BP ) + (DI)28使用BX的基址加變址尋址,默認段寄存器為DSCPU 總線 內存DSESSSCSIP數(shù)據(jù)暫存器PSW標志寄存器執(zhí)行部件控制電路指令譯碼器AXBXCXDXAHBHCHDHSIDIBPSPALBLCLDL寄存器組指令隊列總線接口控制電路運算器地址加法器、指令1指令2指令3指令4、數(shù)據(jù)1數(shù)據(jù)2數(shù)據(jù)3、地址總線AB數(shù)據(jù)總線DB控制總線CB地址譯碼器29使用BP的基址加變址尋址,默認段寄存器為SSCPU 總線 內存DSESSS

17、CSIP數(shù)據(jù)暫存器FR標志寄存器執(zhí)行部件控制電路指令譯碼器AXBXCXDXAHBHCHDHSIDIBPSPALBLCLDL寄存器組指令隊列總線接口控制電路運算器地址加法器、指令1指令2指令3指令4、數(shù)據(jù)1數(shù)據(jù)2數(shù)據(jù)3、地址總線AB數(shù)據(jù)總線DB控制總線CB地址譯碼器30例: MOV AX , BX + SI 若 ( DS ) = 4000H ( BX ) = 2000H ( SI ) = 100H 則內存操作數(shù)的物理地址為: PA = ( DS )10H + ( BX ) + ( SI ) = 42100H 指令執(zhí)行后 (AX) = (42100H) = 2345H 317. 基址變址尋址(相對

18、的基址加變址尋址 Relative based indexed addressing) 操作數(shù)的有效地址由基址寄存器、變址寄存器、偏移量( 8位或16位)三者之和給出。 可用的寄存器與基址加變址尋址方式相同 基址寄存器有 BX、BP 變址寄存器有 SI、DI如 MOV AL, BX+SI +10H MOV AX,20H BXDI MOV DL, BP+SI+30H MOV DX,40H BPDI 32 默認段寄存器由基址寄存器決定, 與基址加變址尋址相同. 允許段跨越。 基址寄存器為BX,默認段寄存器為DS (SI)PA = ( DS )10H + ( BX ) + + 偏移量 (DI) 基址

19、寄存器為BP,默認段寄存器為SS (SI)PA = ( SS )10H + ( BP ) + + 偏移量 (DI)33例: MOV AX , BX + SI + 10H 若 ( DS ) = 4000H ( BX ) = 3000H ( SI ) = 200H 則內存操作數(shù)的物理地址為: PA = ( DS )10H + ( BX ) + ( SI ) + 10H = 43210H 指令執(zhí)行后 (AX) = (43210H) = 8877H 34五種內存尋址: 尋址方式 形成EA EA計算式 直接尋址 位移量 EA=位移量 間接尋址 基址或變址 BX 或BP (寄存器間接尋址) EA= SI

20、DI基址尋址 基址或變址 BX (寄存器相對尋址 ) +位移量 EA = BP + 8位 SI 或16位位移量 DI 變址尋址 基址+變址 BX+SI(基址變址尋址) BP+DI EA= BP+SI BX+DI相對基址變址尋址 基址+變址+位移量 EA =EA +位移量 35指令機器碼與操作數(shù)及尋址方式的簡要說明368086/8088的指令系統(tǒng)中共有92種基本指令??梢苑殖?個功能組:1數(shù)據(jù)傳送(Data transfer)類指令2算術運算(Arithmetic)類指令3邏輯運算和移位(Logic& Shift)類指令4串操作(String manipulation)類指令5控制轉移(Cont

21、rol Transfer)類指令6處理器控制(Processor Control)類指令7.3 常用指令37介紹指令系統(tǒng)使用的符號:八位寄存器: AH,AL,BH,H,BL,CH,CL,DH,DL 十六位通用寄存器: AX,BX,CX,DX,SP,BP,SI,DI 堆棧指針 SP 指令指針 IP(或PC)標志位Flags目的和源變址寄存器DI, SI段寄存器CS, DS, ES, SS38src , dest源,目的操作數(shù)(下列尋址方式都可以用) BX+SI+n,BX+DI+n,BP+SI+n,BP+DI+nSI+n,DI+n, BP+n, BX+nN,r 存儲器單元的內容(正常在數(shù)據(jù)段)ES

22、: 附加存儲器段的內容 OPRD 操作數(shù)Seg 段寄存器(CS,DS,ES,SS)i m 立即數(shù) (n 8位, nn 16位, nnnn 32位 )DISP 位移量(displacement)398086/8088指令助記符表 (自學) 自學40自學41(一)通用傳送指令(General Purpose Transfer)(二)數(shù)據(jù)交換類指令(三)換碼指令(Translate)(四)輸入輸出指令(Input and Output)(五)堆棧操作類指令(五)目的地址傳送指令(Address-object transfer)(六)標志傳送指令(Flag register transfer)一、數(shù)據(jù)

23、傳送類指令428088提供方便靈活的通用的傳送操作,適用于大多數(shù)操作數(shù)。通用傳送指令(除了XCHG以外)是唯一允許以段寄存器為操作數(shù)指令。通用傳送指令包括:1、MOV (Movement)2、PUSH (Push word onto stack) POP (Pop word off stack)3、XCHG (Exchange)4、XLAT (Translate)(一)通用傳送類指令431MOVdest,src ; (dest) (src) 目的源目的 源功能: 把一個字節(jié)(B)或一個字(W)操作數(shù)由源傳送至目的。 實現(xiàn):寄存器 寄存器/存儲器之間;立即數(shù)寄存器/存儲器寄存器/存儲器段寄存器之

24、間的數(shù)據(jù)傳送。44 具體說,通用數(shù)據(jù)傳送指令能實現(xiàn): CPU內部寄存器之間的數(shù)據(jù)的任意傳送(除了碼段寄存器CS和指令指針I(yè)P以外)。段寄存器之間不能傳送。例: MOV DL,CH ; 8位寄存器 8位寄存器 MOV AX,DX ; 16位寄存器 16位寄存器 MOV SI, BP MOV DS,BX ;通用寄存器 段寄存器 MOV AX, CS ;段寄存器 通用寄存器45立即數(shù)傳送至CPU內部通用寄存器組 (AX、BX、CX、DX、BP、SP、SI、DI)。 用于給寄存器賦初值。 不能直接給段寄存器賦值例: MOV CL,04H;立即數(shù)8位寄存器 MOV AX,03FFH;立即數(shù)16位寄存器

25、PTR :屬性定義符號,符號后面的變量(或地址單元)有符號前面的屬性 MOV WORD PTR SI ,057BH ;立即數(shù)存儲器MOV BYTE PTR MEM, 5 ;立即數(shù)存儲器46CPU內部寄存器(除CS和IP外)與存儲器(所有尋址方式)之間數(shù)據(jù)傳送??梢詫崿F(xiàn)一字節(jié)或一個字的傳送。 存儲單元之間不能直接傳送 例:MOV MEM , AX; 累加器存儲器,直接尋址MOV MEM ,DS;段寄存器存儲器,直接尋址MOV DISPBX ,CX;寄存器存儲器,變址尋址MOV AX , DISP SI;存儲器累加器,變址尋址MOV DS , MEM;存儲器段寄存器,直接尋址MOV CX , DI

26、SP BX SI ;存儲器累加器,相對基址加變址47 注意:(1)不能用一條MOV指令實現(xiàn)以下傳送。 存儲單元之間的傳送MOV MEM2 , MEM1 錯。MOV AX , MEM1MOV MEM2 , AX 對。 立即數(shù)送段寄存器 例 : MOV DS,2000H 錯。MOV AX, 2000HMOV DS , AX 對。 48 段寄存器之間的傳送MOV ES , DS ; 錯MOV AX , DSMOV ES , AX ; 對 。 注意CS和IP的使用 CS和IP不能作為目標操作數(shù),CS可以作為源操作數(shù)。例:MOV CS,AX ; 錯 MOV AX,CS ;對 。 MOV IP, AX ;

27、錯 MOV AX, IP ;錯。49 注意操作數(shù)的范圍對字節(jié)操作指令 0 FFH 0 255 對字操作指令 0 FFFFH 0 65535 MOV AL , 260 MOV AX ,70000 MOV AL, 1FFH MOV AL, 2ABCDH 50注意如下指令: 不能兩個同為存儲器操作數(shù) MOV DI , SI 目的操作數(shù)不能是立即數(shù) ADD 3 , AL 兩個操作數(shù)的類型應相同 SUB AX , BL 若 value 定義為字類型存儲器變量: MOV CL, value BX 51(后面跟立即數(shù)時)內存操作數(shù)的屬性應明確。 MOV BX ,0MOV byte ptr BX , 0MOV

28、 word ptr BX , 0MOV BX , ALMOV BX , AX52 A、B、C、D、E、F開頭的十六進制數(shù)前面加0, 與H結尾的標識符區(qū)別。如 寄存器名: AH、BH、CH、DH 變量名 : abcdH 等例 mov AL, 0AH mov AL, AH mov BX, 0abcdH53 CS 和 IP的值只在控制轉移指令中修改。 對非控制轉移指令,取完指令后IP值自動+1 ,指向下條指令。 段寄存器CS的值,只在MOV、PUSH中可作操作數(shù), 且這兩條指令執(zhí)行結果不改變CS值。MOV AX, CSPUSH CS IP、FR兩個寄存器不能作為操作數(shù)在指令中出現(xiàn)。mov IP ,

29、1234Hmov FR , 0F0FH FR狀態(tài)寄存器的值由指令執(zhí)行后確定, 不同的指令對各標志的影響不同。54(2)段地址的默認BX、SI、DI間址默認段地址為DS,BP間址默認段地址SS。(3)凡是遇到給SS賦值指令,系統(tǒng)自動禁止外部中斷,執(zhí)行本條指令和下條指令,恢復對SS寄存器賦值前的中斷開放情況。這樣做為了允許程序員連續(xù)用兩條指令分別對SS和SP寄存器賦值,同時又防止堆??臻g變動過程出現(xiàn)中斷。*在修改SS和SP的指令之間不要插入其他指令。(4)所有通用傳送指令不影響標志位(除SAHF、POPF以外)。55 MOV指令可以傳送8位數(shù)據(jù),也可傳送16位數(shù)據(jù),具體取決于指令中涉及的寄存器是8

30、位還是16位,也取決于立即數(shù)的形式。 MOV指令中包括源操作數(shù)和目的操作數(shù),兩者之中應至少有一個是用寄存器指出的,這可減少指令長度。 不能在兩個內存單元之間直接傳送數(shù)據(jù)。 寄存器可以是源操作數(shù),也可以是目的操作數(shù),但CS寄存器不能用作目的操作數(shù),可以用作源操作數(shù)。MOV CS,AX 錯 MOV AX,CS 對MOV指令使用注意(總結)56 立即數(shù)不能做目的操作數(shù)。 立即數(shù)不能直接送入段寄存器。 MOV DS,1234H 源操作數(shù)與目的操作數(shù)數(shù)據(jù)類型必須相同。 段寄存器之間不能互相傳送。57 IP寄存器不能作為操作數(shù);MOV AX,IP 錯 用BX、SI、DI間接尋址時,默認的段寄存器為DS,而

31、用BP時,默認為SS。 8086系統(tǒng)規(guī)定,當遇到給SS寄存器賦值的傳送指令時,系統(tǒng)會自動禁止外部中斷,等本指令和下條指令執(zhí)行之后,自動恢復對SS寄存器賦值前的中斷開放情況,以利于程序員用連續(xù)的兩條指令改變堆??臻g。寫程序時要注意在修改SS和SP的指令之間不要插入其他指令。58格式:XCHG dest , src;(dest) (src)執(zhí)行操作: 把一個字節(jié)或一個字的源操作數(shù)與目的操作數(shù)相交換。 可以 實現(xiàn): 寄存器之間 寄存器和存儲器之間注意: 存儲器之間不能交換,兩個操作數(shù)中必須有一個在寄存器; 段寄存器不能作為一個操作數(shù); 允許字或字節(jié)操作,不影響標志位。(二) 數(shù)據(jù)交換指令59應用舉例

32、:XCHG BL,DLXCHG AX,SIXCHG COUNTDI, AXXCHG BX,DI(錯)XCHG DS, AX (錯)60該指令不影響標志位。格式: XLAT str_table;(AL)(BX +AL) 或 XLAT str_table表格符號地址(首地址), 只是為了提高可讀性而設置,匯編時仍用BX。 (三)換碼指令61XLAT指令使用方法: 先建立一個字節(jié)表格; 表格首偏移地址存入BX; 需要轉換代碼的序號(相對與表格首地址位移量)存入AL; (表中第一個元素的序號為0) 執(zhí)行XLAT指令后,表中指定序號的元素存于AL中。 (AL)為轉換的代碼。62XLAT指令應用: 若把字

33、符的鍵盤掃描碼轉換成ASCII碼,或根據(jù)數(shù)據(jù)查平方表, 或把數(shù)字09轉換成7段數(shù)碼管顯示所需要的相應代碼(字形碼)等就要用XLAT指令。例:內存的數(shù)據(jù)段中有一張十六進制數(shù)字的ASCII碼表。首地址為:Hex_table ,欲查出表中第10個元素(A)63執(zhí)行指令序列:MOV BX,OFFSET Hex_tableMOV AL,0AH XLAT Hex_table假設:(DS)=F000H, Hex_table=0040H(AL)=0AH執(zhí)行XLAT以后: (AL)=41H=(F004AH),即“A”的ASCII碼。30H31H32H.39H41H42H.46H.Hex_tableHex_tab

34、le+1Hex_table+2Hex_table+0AHHex_table+0BHHex_table+0FHFBA912016進制數(shù)的ASCII碼表64輸入輸出指令共兩條: 1、IN (Input byte or word) 2 、OUT (Output byte or word) 輸入指令用于CPU從外設端口接受數(shù)據(jù), 輸出指令用于CPU向外設端口發(fā)送數(shù)據(jù)。 無論接受還是發(fā)送數(shù)據(jù),必須通過累加器AX(字)或AL(字節(jié)),又稱累加器專用傳送指令 。 輸入、輸出指令不影響標志位。(四)輸入/輸出指令65每個外設要占幾個端口:數(shù)據(jù)口,狀態(tài)口和控制口。66信息交換要通過端口,在IBMPC機里,可以配

35、接許多外部設備,每個外設與CPU之間交換數(shù)據(jù),狀態(tài)信息和控制命令,每一種信息交換都要通過一個端口來進行。端口數(shù):外部設備最多有65536個I/O端口。 A0A15譯碼形成。端口號:端口號(即外設端口地址)為0000HFFFFH。PC機僅使用A0A9譯碼形成I/O口地址,即1024H個口地址 端口號:0000H03FFH其中: A9=1,表示擴充槽上的口地址。67長格式:端口號中前256個端口(0FFH),可以直接寫在指令中,這就是長格式。端口號代替指令中的PORT,機器指令用二字節(jié)表示,第二字節(jié)就是端口號。短格式:當端口號256時,只能使用短格式,必須先把端口號放到DX寄存器中。不需要用任何段

36、寄存器來修改它的值。681、IN (Input byte or word) 輸入指令格式:IN acc, port ;(acc) (port)具體形式有四種:IN AL, data8 ; 端口地址8位,輸入一個字節(jié)IN AX, data8 ;端口地址8位,輸入一個字IN AL, DX ;端口地址16位,輸入一個字節(jié)IN AX, DX ;端口地址16位,輸入一個字 必須通過累加器AX(字)或AL(節(jié))輸入數(shù)據(jù)。692 、OUT(Output byte or word) 輸出指令格式: OUT port, acc ;(port) (acc)具體形式有四種: OUT data8 , AL ; 端口地

37、址8位,輸出一個字節(jié)OUT data8, AX ;端口地址8位,輸出一個字OUT DX , AL ;端口地址16位,輸出一個字節(jié) OUT DX , AX ;端口地址16位,輸出一個字 必須通過累加器AX(字)或AL(節(jié))輸出數(shù)據(jù)。70例1:實現(xiàn)(29H)(28H)(DATA_WORD) IN AX,28H MOV DATA_WORD,AX例2:從端口3FCH 送一個字到AX寄存器MOV DX,3FCH IN AX,DX ; (AL)(3FCH), (AH)(3FDH) 例3:實現(xiàn)將(AL) (05H) OUT 5,AL;(05H)(AL)71 1. 只能用累加器AX作為執(zhí)行輸入輸出過程的機構,

38、不能用其它寄存器代替; 2. 輸入輸出指令可分為兩大類:一類是直接的輸入輸出指令,尋址范圍為0255H,即16進制數(shù)FFH是直接輸入輸出指令中允許使用的最大端口號;另一類是間接的輸入輸出指令,尋址范圍為065535H,要在DX寄存器中設置好端口號,且只能用DX寄存器,而不能用別的寄存器。注意問題:72 PUSH 進棧指令 指令格式: PUSH OPRD 執(zhí)行操作: SP SP-2, (SP + 1): (SP) OPRD 指令功能:該指令把一個字操作數(shù)從源傳送到堆棧的頂部。常用于在調用過程前把參數(shù)入棧,16位寄存器(包括段寄存器)、存儲器單元的內容都可入棧。 不影響標志位 (五)堆棧操作指令7

39、3 假定AX=1234H,BX=5678H,SS=2000H,SP=0100H,則執(zhí)行下列指令后堆棧的狀態(tài)是:PUSH AXPUSH BX指令舉例74PUSH指令舉例2000:00FBH2000:00FCH2000:00FDH2000:00FEH2000:00FFH2000:0100HSP(1) 起始狀態(tài)75 POP 出棧指令 指令格式: POP OPRD 執(zhí)行操作: (OPRD) (SP + 1): (SP), SP SP+2 指令功能:該指令把SP所指向的堆棧頂部的一個字 傳送到指定目的操作數(shù),同時修改堆棧 指針,即SP SP+2。76假定在執(zhí)行指令:POP CX POP DX之前,堆棧的

40、狀態(tài)如圖所示。指令執(zhí)行后,CX,DX的內容及堆棧的狀態(tài)?77PUSH指令的目標地址一定在當前堆棧中。SS內容為段基值, 偏移量由堆棧指針SP指出。8086的堆棧操作總是按字進行的,即操作數(shù)一定是16位的寄存器或存儲器操作數(shù); 每執(zhí)行一條推入(彈出)堆棧指令,堆棧地址指針SP減2(加2),推入堆棧的數(shù)據(jù)放在棧頂,低位字節(jié)放在較低地址單元,高位字節(jié)放在較高地址單元;堆棧中的內容是按后進先出的次序進行傳送的。注意問題:78(六)目標地址傳送指令功能:傳送操作數(shù)的段地址或偏移地址。1、取有效地址指令 LEA LEA可將存儲器地址送到一個寄存器。 要求:源操作數(shù)必須為內存單元地址,目的操作數(shù)必須為一個1

41、6位通用寄存器。 這條指令常用來使一個寄存器作為地址指針。例: LEA AX,2728H;(AX) 2728H LEA BX, BP+SI ;(BX) BP+SI LEA SP, 0428H ;(SP) 0428H792、將地址指針裝到DS和另一個寄存器的指令:LDS功能:把一個段地址和一個偏移量分別裝入DS和另一個指定的寄存器。例如:設2130H21333H這4個單元存放著一個地址,2130H、2131H中為地址的偏移量,2132H、2133H中為段地址,執(zhí)行指令: LDS DI, 2130H 而后,使偏移量送到DI,段地址送到DS。803、將地址指針裝到ES和另一個寄存器的指令:LES例如

42、:LES SI,2134H81(七)標志位傳送指令共4條指令讀取標志指令 LAHF LAHF指令將標志寄存 器F的低8位傳送到AH中。設置標志指令 SAHF SAHF指令將AH的內容送到標志寄存器F的低8位。對標志寄存器的壓入堆棧指令和彈出堆棧指令 PUSHF、POPF PUSHF、POPF指令一般用在子程序或中斷處理程序的首尾,起保存主程序標志和恢復主程序標志的作用。82算數(shù)運算指令涉及的一些問題加法指令減法指令乘法指令除法指令BCD碼運算指令二、算術運算類指令83算術運算指令涉及的一些問題指令對標志位的影響操作數(shù)類型:無符號二進制整數(shù)、帶符號二進制整數(shù) 無符號壓縮十進制BCD碼、無符號非壓

43、縮十進制BCD碼關于指令的運算結果乘除法指令中操作數(shù)的存放位置84需要注意問題 8086指令系統(tǒng)提供了加、減、乘、除四種基本運算指令,可以處理無符號數(shù)或帶符號的8位或16位二進制的算術運算,還提供了各種調整操作指令,故可進行壓縮的或非壓縮的十進制數(shù)的算術運算。 大多數(shù)算術運算指令都影響狀態(tài)標志位。對于加法和減法運算指令,帶符號數(shù)和無符號數(shù)的運算的操作過程是一樣的;而對于乘法和除法運算,帶符號數(shù)和無符號數(shù)的運算過程完全不同。85當無符號數(shù)運算產生溢出時,CF為1(編程關注);當有符號數(shù)運算產生溢出時,OF為1(編程關注) ;如果運算結果為0,則ZF1;如果運算結果的最高位為1,則SF1;如果運算

44、結果的低8位有偶數(shù)個1,則PF1;如果第3位向第4位借位或者進位,AF1。關于標志位的說明861. 加法指令(1)ADD 不帶進位標志位的加法指令(2)ADC 帶進位標志位的加法指令(3)INC 增量指令(4)DAA 加法的ASCII調整指令87(1) ADD 不帶進位位的加法指令指令匯編格式: ADD dest, src 操作: 兩個操作數(shù)求和, 結果存目標操作數(shù)中。 dest(dest)+(src)受影響的狀態(tài)標志位: OF,SF,ZF,AF,PF,CF說明: dest和src不能同時為存儲器操作數(shù)或段寄存器。ADC、SUB、SBB、CMP、AND、OR、XOR等指令對尋址方式的要求相同。

45、例:ADD AL, 50 ADD CX, 50H ADD BPDI, BX 88(2) ADC 帶進位位的加法指令指令匯編格式: ADC dest, src操作: 兩個操作數(shù)相加的同時,再加上CF。結果存入目標操作數(shù)中,可實現(xiàn)多字節(jié)的加法運算。 dest(dest)+(src)+CF受影響的狀態(tài)標志位: OF,SF,ZF,AF,PF,CF例:ADC AL, 3 ADC DX, BX+1089指令匯編格式: INC dest操作:將指定的操作數(shù)加1,并將結果送回到目標操作數(shù)中。 dest(dest)+1受影響的狀態(tài)標志位: OF,SF,ZF,AF,PF說明: INC 指令不影響標志位CF例: I

46、NC AL INC BX INC BYTE PTR BI+DI(3) INC 增量指令90指令匯編格式: DAA指令功能:在用ADD或ADC指令對兩個壓縮BCD數(shù),且運算結果已存在AL的情況下,用此指令將AL寄存器中的運算結果調整正確的壓縮BCD數(shù)。(4) DAA 加法的十進制調整指令91指令匯編格式: AAA指令功能:在用ADD或ADC指令對兩個非壓縮十進制數(shù)或ASCII碼表示的十進制數(shù)作加法后,運算結果已存在AL的情況下,用此指令將AL寄存器中的運算結果調整為1位非壓縮十進制數(shù),仍保留在AL中,如果AF1,表示向高位進位,則進到AH寄存器中。(5) AAA 加法的ASCII調整指令922.

47、 減法指令(1) SUB 不考慮借位標志位的減法指令(2) SBB考慮借位標志位的減法指令(3) DEC減量指令(4) NEG求補指令(5) CMP比較指令93(1) SUB 不考慮借位的減法指令指令匯編格式: SUB dest, src操作: 從目標操作數(shù)減去源操作數(shù),結果存入目標操作數(shù)中。 dest(dest)-(src)受影響的狀態(tài)標志位: OF,SF,ZF,AF,PF,CF例:SUB AL,10H SUB BX, BX+10H SUB AL, AL94(2) SBB 考慮借位的減法指令指令匯編格式: SBB dest, src操作:從目標操作數(shù)中減去源操作數(shù)和CF,結果存入目標操作數(shù)中

48、。 dest(dest)-(src)-CF受影響的狀態(tài)標志位:OF,SF,ZF,AF,PF,CF說明: SBB 指令主要用于多字節(jié)數(shù)據(jù)減法。例: SBB AL,0 SBB DL,CL SBB WORD PTR DI+2,1000H95(3) DEC減量指令指令匯編格式: DEC dest操作:將指定的操作數(shù)減1,并將結果送回到目標操作數(shù)中。dest(dest)-1受影響的狀態(tài)標志位:OF,SF,ZF,AF,PF說明: DEC指令不影響CF例: DEC BX DEC BYTE PTR BX+SI+1000H DEC SP96(4) NEG 求補指令(取負指令)指令匯編格式: NEG dest操作

49、:從0中減去指令中給定的操作數(shù), 最后將結果送回到給定的操作數(shù)中。 dest0-(dest)受影響的狀態(tài)標志位: OF,SF,ZF,AF,PF,CF特殊情況:0,80H,8000H說明: NEG 指令對于帶符號的數(shù)來說是取負,即改變操作數(shù)的符號。例: NEG AX NEG BYTE PTR BX+1097(5) CMP比較指令指令匯編格式: CMP dest,src操作: 從目標操作數(shù)中減去源操作數(shù),但不送回相減的結果。 (dest)-(src)受影響的狀態(tài)標志位:OF,SF,ZF,AF,PF,CF說明: CMP 將兩個操作數(shù)相減, 兩個操作數(shù)保持原值不變, 但與SUB指令一樣影響標志位,主要

50、用在希望比較兩個數(shù)的大小,而又不破壞原操作數(shù)。例: CMP AL, BL CMP DX, 10H 983. 乘法指令(1) MUL 無符號數(shù)的乘法指令(2) IMUL 有符號數(shù)的乘法指令99(1) MUL 無符號數(shù)的乘法指令指令匯編格式: MUL src操作: 源操作數(shù)與累加器的內容相乘。如果源操作數(shù)是字節(jié)數(shù)據(jù),就與AL中的數(shù)據(jù)相乘,乘積為字,存放在AX中。如果源操作數(shù)是字數(shù)據(jù),就與AX中的數(shù)相乘,乘積為雙字,存放在DX和AX中。 兩個字節(jié)數(shù)相乘: AXAL*(src)兩個字數(shù)據(jù)相乘: DX,AXAX*(src)受影響的狀態(tài)標志位: OF,CF說明: 源操作數(shù)src不能是立即數(shù)。如果乘積的高半

51、部不為零時,CF和OF被置位,否則將被清零。100ALsrcAXAXsrc AXDX例: MUL BL MUL DX MUL BYTE PTR SI+BX+1000H101(2) IMUL 有符號數(shù)的乘法指令指令匯編格式: IMUL src操作: 將源操作數(shù)與累加器的內容相乘。如果源操作數(shù)是字節(jié)數(shù)據(jù),就與AL中的數(shù)相乘,乘積為字,存放在AX中。如果源操作數(shù)是字數(shù)據(jù),那么就與AX數(shù)相乘,乘積為雙字,存放在DX和AX中。兩個字節(jié)數(shù)相乘: AXAL*(src)兩個字數(shù)據(jù)相乘: DX,AXAX*(src)受影響的狀態(tài)標志位: OF,CF。說明: src不能是立即數(shù)。IMUL指令視操作數(shù)為帶符號的數(shù)。如

52、果乘積的高半部不是低半部分的符號位擴展時,CF和OF被置位,否則將被清零。1025. 除法指令(1) DIV 無符號數(shù)的除法指令(2) IDIV 有符號數(shù)的除法指令(3) CBW 有符號數(shù)除法時符號擴展命令,字節(jié)字(4) CWD 有符號數(shù)除法時符號擴展命令,字雙字103(1) DIV 無符號數(shù)的除法指令指令匯編格式: DIV src操作: AX(或DX,AX)的內容除以src的內容。商存放在AL(字節(jié)時)或AX(字時),并將余數(shù)存放在AH(字節(jié)時)或DX(字時) 中。 字除以字節(jié): AX/(src);AL商,AH余數(shù) 雙字除以字: DX,AX/(src);AX商,DX余數(shù)受影響的狀態(tài)標志位:

53、不產生有效的狀態(tài)標志。說明: src不能是立即數(shù); 如果商數(shù)超過了允許的最大值 (字節(jié)時為0FFH,字時為0FFFFH) 時就產生一個方式0 的中斷,并且商和余數(shù)都不確定。104DX:AX16位除AX(商)DX(余)AX8位除數(shù)AL(商)AH(余)105 (2)IDIV 有符號數(shù)的除法指令指令匯編格式: IDIV src操作: AX(或DX,AX)的內容除以src的內容。商存放在AL( 字節(jié)時) 或AX (字時),并將余數(shù)存放在AH (字節(jié)時) 或DX (字時) 中。字除以字節(jié): AX/(src) ;AL商,AH余數(shù)雙字除以字: DX,AX/(src);AX商,DX余數(shù)受影響的狀態(tài)標志位: 不

54、產生有效的狀態(tài)標志。說明: src不能是立即數(shù); 如果商數(shù)超過了允許的最大值 (字節(jié)時為-128127,字時為-3276832767)時就產生一個方式0的中斷,并且商和余數(shù)都不確定。1061. NOT 取反2. AND 邏輯與3. OR 邏輯或4. XOR 異或5. TEST 測試三、邏輯運算與移位類指令 (一) 邏輯運算類指令107(1) NOT 取反指令匯編格式: NOT dest操作: 將操作數(shù)的每一位求反,然后將結果回送到對應位中??梢允?位、16位寄存器或存儲器操作數(shù)。 destdest 受影響的狀態(tài)標志位: 沒有說明: NOT指令常用來將某個數(shù)據(jù)取成反碼,再加上1得到補碼。例: N

55、OT AX NOT WORD PTR BX+SI+1000HNOT BYTE PTR BX+SI+1000H108(2)AND 邏輯與指令匯編格式: AND dest, src操作: 兩個操作數(shù)進行邏輯 “與”,即如果兩個操作數(shù)的對應位都為1時,結果的對應位才為1, 否則結果的對應位為0。 dest(dest)(src), CF0,OF0受影響的狀態(tài)標志位: OF,SF,ZF,AF,PF,CF說明: AND指令可借助某個給定的操作數(shù)將另一個操作數(shù)中的某些位清零(這種操作也稱設置屏蔽),或者令某些位保持不變,這個數(shù)通常稱為掩碼。例如,將一個源操作數(shù)與00001111B 相“與”,可將這個源操作數(shù)

56、的高半字節(jié)變?yōu)?, 而低半字節(jié)保持不變。例:AND AL, 0FH AND AX,BX109(3) OR 邏輯或指令匯編格式: OR dest, src操作: 兩個操作數(shù)進行邏輯“或”操作,即當兩個操作數(shù)的對應位都為0時結果的對應位為0,否則結果的對應位為1,結果存入目標操作數(shù)中,CF和OF位置0。dest(dest)(src), CF0,OF0受影響的狀態(tài)標志位: OF,SF,ZF,AF,PF,CF說明: OR指令可用來使操作數(shù)中的某些位置位,某些位保持不變。例如,用10000000B與一個 字節(jié)操作數(shù)相“或”,可使這個字節(jié)操作數(shù)的最高有效位為1。例: OR AL,0FH OR AX,BX+

57、DI+10110(4) XOR 異或指令匯編格式: XOR dest, src操作: 兩個操作數(shù)執(zhí)行邏輯“異或”操作,即當兩個操作數(shù)的對應位相同時,結果的對應位為0; 否則結果的對應位為1。結果存入目標操作數(shù)中,CF和OF位置0。 dest(dest)(src), CF0,OF0受影響的狀態(tài)標志位: OF,SF,ZF,AF,PF,CF說明:XOR指令可用來使操作數(shù)中的某些位取反,某些位不變。例: XOR AL,0FH XOR AX, AX111(5) TEST 測試指令匯編格式: TEST dest, src操作: 將兩個操作數(shù)進行邏輯“與”, 根據(jù)結果設置狀態(tài)標志位, 但不改變兩個操作數(shù)的原

58、始值,并將CF和OF清除。(dest)(src), CF0,OF0受影響的狀態(tài)標志位: OF,SF,ZF,AF,PF,CF說明: TEST指令通過 “與” 的方式對兩個源操作數(shù)進行比較,但不保留 “與” 的結果。112邏輯運算指令的妙用1. AND指令可用于對一個數(shù)據(jù)的指定位清零(屏蔽)。 例如, AND AL, 0FH2. OR指令可用于對一個數(shù)據(jù)的指定位置1。 例如,OR AL, 02H3. XOR指令通常用在一些程序的開頭使某個寄存器清零,以配合初始化工作的完成。例如, XOR AX, AX4. NOT指令常用來將某個數(shù)據(jù)取反碼,再加1得到補碼5. TEST指令一般用來檢測某個指定位是1

59、還是0,而這個指定位往往對應一個物理量。例如, TEST AL, 01H113(二)移位類指令指令類型指令格式指令功能狀態(tài)標志位備注O S Z A P C移位SHL dst, cnt邏輯左移*dst(目標):通用寄存器、存儲器cnt (計數(shù)值):1或CL,移位次數(shù)SAL dst, cnt算術左移*SHR dst, cnt邏輯右移*SAR dst, cnt算術右移*循環(huán)移位ROL dst, cnt循環(huán)左移 - - * -ROR dst, cnt循環(huán)右移 - - * -RCL dst, cnt帶進位循環(huán)左移 - - * -RCR dst, cnt帶進位循環(huán)右移 - - * -114CF0最高位最低

60、位算術左移指令SAL 及邏輯左移指令SHLCF最高位最低位(b) 算術右移指令SARCF最高位最低位0(c) 邏輯右移指令SHR非循環(huán)移位指令的功能SAL DX, 4SAL AX,CL115不帶CF的循環(huán)左移指令ROL(b) 帶CF的循環(huán)左移指令RCL(c) 不帶CF的循環(huán)右移循環(huán)指令ROR循環(huán)移位指令的功能ROL BX, 1CF最高位最低位CF最高位最低位CF最高位最低位CF最高位最低位(d) 帶CF的循環(huán)右移指令RCR116例:閱讀下面的程序,指出它實現(xiàn)的具體功能 SAL AL, 1 MOV BL, AL MOV CL, 2 SAL AL, CL ADD AL, BL 答案:上述程序將AL

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論