匯編語(yǔ)言入門教程課件_第1頁(yè)
匯編語(yǔ)言入門教程課件_第2頁(yè)
匯編語(yǔ)言入門教程課件_第3頁(yè)
匯編語(yǔ)言入門教程課件_第4頁(yè)
匯編語(yǔ)言入門教程課件_第5頁(yè)
已閱讀5頁(yè),還剩553頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

匯編語(yǔ)言簡(jiǎn)介

匯編語(yǔ)言程序設(shè)計(jì)是計(jì)算機(jī)類專業(yè)的重要專業(yè)基礎(chǔ)課,是從事計(jì)算機(jī)研究與應(yīng)用,特別是軟件研究的基礎(chǔ)。雖然它并不象高級(jí)語(yǔ)言如VB、VC那樣容易使用,但它匯編后的目標(biāo)代碼少,執(zhí)行時(shí)間短等優(yōu)點(diǎn)是其他語(yǔ)言所無(wú)法取代的,所以它多用于那些要求運(yùn)行效率高、實(shí)時(shí)性很強(qiáng)的系統(tǒng)程序和應(yīng)用程序的編制,例如自動(dòng)控制等方面,所以匯編語(yǔ)言是非常重要的。第一章基礎(chǔ)知識(shí)

第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)

因此,n位二進(jìn)制數(shù)可以表示出2n個(gè)數(shù)。例如3位二進(jìn)制數(shù)可以表示8個(gè)數(shù),4位二進(jìn)制數(shù)可以表示16個(gè)數(shù)。

為了便于人們的閱讀和書寫,經(jīng)常使用八進(jìn)制和十六進(jìn)制數(shù)來(lái)表示二進(jìn)制數(shù)。它們的基數(shù)和數(shù)碼可表示為下表:

進(jìn)位計(jì)數(shù)制基數(shù)數(shù)碼

十六進(jìn)制數(shù)160、1、2、3、4、5、6、7、8、9、a、b、c、d、e、f

十進(jìn)制數(shù)100、1、2、3、4、5、6、7、8、9

八進(jìn)制數(shù)80、1、2、3、4、5、6、7

二進(jìn)制數(shù)20、1

第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)2.1計(jì)算機(jī)系統(tǒng)的概述

計(jì)算機(jī)系統(tǒng)包括硬件與軟件兩部分一、計(jì)算機(jī)硬件二、計(jì)算機(jī)軟件2.1.1硬件硬件是指計(jì)算機(jī)的物理實(shí)體(如CPU,顯卡等)我們?cè)谶@里將它分為微處理器,存儲(chǔ)器,接口電路,外部設(shè)備和系統(tǒng)總線等。(如左圖所示)

微處理器就是由控制器和算術(shù)邏輯部件組成的中央處理器(即CPU)。它的作用是自動(dòng)地執(zhí)行各條指令,協(xié)調(diào)整個(gè)系統(tǒng)的工作。存儲(chǔ)器是計(jì)算機(jī)的記憶裝置,用于存儲(chǔ)計(jì)算機(jī)當(dāng)前的數(shù)據(jù)和程序,我們通常接觸的是RAM,它是一種隨機(jī)存取存儲(chǔ)器,它的數(shù)據(jù)在重啟或關(guān)機(jī)后會(huì)丟失,而且在計(jì)算機(jī)運(yùn)行時(shí)還需不斷刷新。

系統(tǒng)總線是將CPU與存儲(chǔ)器及外部設(shè)備連接起來(lái)的導(dǎo)體,它用來(lái)傳輸信息。第一章基礎(chǔ)知識(shí)2.1.1硬件

外部設(shè)備按功能可分為二類:一類是與計(jì)算機(jī)進(jìn)行通訊的設(shè)備如鍵盤,打印機(jī)和顯示器等。這些設(shè)備與計(jì)算機(jī)的通訊是通過(guò)I/O接口實(shí)現(xiàn)的。另一類是用來(lái)存儲(chǔ)信息的設(shè)備如磁盤,光盤等。第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)151631第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)15第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)機(jī)器規(guī)定:從0地址開始,每16個(gè)字節(jié)為一小段。段地址的選取不是任意的,計(jì)算機(jī)規(guī)定:20位二進(jìn)制的地址值中,只有低4位地址值為0的地址才能作為段地址使用。在1M空間中,可以有以下的地址作為段地址使用:00000H00010H……41230H41240H……FFFE0HFFFF0H很明顯,共有64K個(gè)小段的首地址。

第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)16第一章基礎(chǔ)知識(shí)80386的地址總線擴(kuò)展到了32位,可尋址空間一下擴(kuò)充為4G,更為先進(jìn)的是在保護(hù)模式下,它的段范圍不再受限于可憐的64K,可以達(dá)到4k-4G。保護(hù)模式和實(shí)模式好比一對(duì)孿生兄弟,從程序角度來(lái)看幾乎看不出什么區(qū)別,它們都是通過(guò)段寄存器去訪問內(nèi)存地址,都通過(guò)中斷和設(shè)備驅(qū)動(dòng)程序來(lái)操作硬件,表面上能感覺得到的差異就是保護(hù)模式能訪問的空間是4G,而實(shí)模式只能訪問到1M的地址空間。但實(shí)際上保護(hù)模式和實(shí)模式采用了兩種截然不同的思路,保護(hù)模式帶來(lái)的最可貴的優(yōu)點(diǎn)不是單純的擴(kuò)大了內(nèi)存尋址范圍,而是對(duì)內(nèi)存尋址從機(jī)制上提供了保護(hù),將系統(tǒng)的執(zhí)行空間按權(quán)限進(jìn)行了化分。

第一章基礎(chǔ)知識(shí)為什么需要保護(hù)?

如今的系統(tǒng)需要支持多個(gè)用戶同時(shí)運(yùn)行多個(gè)任務(wù)。為了防止你去破壞別人的任務(wù),系統(tǒng)有責(zé)任將每個(gè)任務(wù)隔離開來(lái),讓大家各自運(yùn)行在不同的空間,免收干擾。這就是保護(hù)的第一個(gè)方面——任務(wù)間保護(hù),要做到任務(wù)間保護(hù)需要借助虛擬內(nèi)存技術(shù)(我們后面分析它),其基礎(chǔ)之一就是保護(hù)模式。除了任務(wù)間保護(hù)外,另一個(gè)必須保護(hù)的東西就是操作系統(tǒng)本身,它可是資源調(diào)配的首腦呀!決不能讓你有機(jī)可承,擅自進(jìn)入。必須有一道鐵絲網(wǎng),將你和操作系統(tǒng)隔離開,要想拉起這道鐵絲網(wǎng),就需要借助保護(hù)模式中的特權(quán)級(jí)機(jī)制。操作系統(tǒng)放在高特權(quán)級(jí)里,你的任務(wù)被放在低特權(quán)級(jí)里。你沒有權(quán)利去偷看操作系統(tǒng)的內(nèi)容。有什么要求只能請(qǐng)示“領(lǐng)導(dǎo)”(就是保護(hù)機(jī)制),獲得拼準(zhǔn)后才能給你提供服務(wù)。這點(diǎn)可謂是保護(hù)模式的最直接應(yīng)用。第一章基礎(chǔ)知識(shí)

我們知道段方式尋址時(shí),是直接從段寄存器中取得的段的首地址,但是在保護(hù)模式中是要多經(jīng)過(guò)一次檢查手續(xù)才能獲得想要的段地址。

雖然80386有的通用寄存器(EAX,EDI等等)被擴(kuò)充倒了32位,但是其中的段寄存器(DS,ES等)仍然只有16位,顯然不可能再用16位的段寄存器直接存放4G空間需要的32位地址了,所以必須引入了一種間接辦法——將段寄存器存放的地址換成一個(gè)索引指針,尋址時(shí)不再是從段寄存器種去地址,而是先取指針,再通過(guò)該指針?biāo)阉饕粋€(gè)系統(tǒng)維護(hù)的“查找表”讀出所需段的具體信息。

保護(hù)模式中,對(duì)段的處理,不再簡(jiǎn)簡(jiǎn)單單是16位的段了,而是16位的段選擇符,要到GDT或者LDT中去查找段的位置。用于定義內(nèi)存段的表有兩種:全局描述符表(GDT)和局部描述符表(LDT)。GDT是一個(gè)段描述符數(shù)組,其中包含所有應(yīng)用程序都可以使用的基本描述符。在實(shí)模式中,段長(zhǎng)是固定的(為64KB),而在保護(hù)模式中,段長(zhǎng)是可變的,其最大可達(dá)4GB。

LDT也是段描述符的一個(gè)數(shù)組。與GDT不同,LDT是一個(gè)段,其中存放的是局部的、不需要全局共享的段描述符。第一章基礎(chǔ)知識(shí)每一個(gè)操作系統(tǒng)都必須定義一個(gè)GDT,而每一個(gè)正在運(yùn)行的任務(wù)都會(huì)有一個(gè)相應(yīng)的LDT。每一個(gè)描述符的長(zhǎng)度是8個(gè)字節(jié),格式如下圖所示。

GDT和LDT是在內(nèi)存中的,由OS設(shè)置。第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)4.1尋址方式尋址方式分類:1)與數(shù)據(jù)有關(guān)的尋址方式2)與轉(zhuǎn)移地址有關(guān)的尋址方式:確定內(nèi)存單元的地址有7

與數(shù)據(jù)有關(guān)的尋址方式:確定轉(zhuǎn)移地址以MOV指令為例:MOV目的操作數(shù),源操作數(shù)對(duì)源操作數(shù)分別使用7

種尋址方式如下:(1)立即尋址方式(ImmediateAddressing)特點(diǎn):操作數(shù)包含在指令中操作數(shù)是指令的組成部分,可以是8位或16位,取出指令就立即獲得操作數(shù)——立即數(shù)例1:

MOVAL,5執(zhí)行指令后:(AL)=05HB005存儲(chǔ)器指令05AL例2:

MOVAX,3045H執(zhí)行指令后:(AX)=3045H指令45AXOP45存儲(chǔ)器3030低地址高地址用途:給變量或寄存器賦常量值限制:只能用于源操作數(shù)(2)寄存器尋址方式(RegisterAddressing)特點(diǎn):操作數(shù)存在寄存器中例:

MOVAX,BX執(zhí)行指令前:(AX)=3045H(BX)=4000H

執(zhí)行指令后:

(AX)=4000H(BX)=4000H用途:用寄存器提供操作數(shù)時(shí)存取速度快

指令

2000H5030…………存儲(chǔ)器代碼段op0020數(shù)據(jù)段30000H32000HAX用途:用于存取單個(gè)變量中的操作數(shù)3050例:設(shè)(DS)=3000H

MOVAX,[2000H](3)直接尋址方式(DirectAddressing)特點(diǎn):操作數(shù)的偏移地址包含在指令中要訪問的存儲(chǔ)單元物理地址為:30000H+2000H=32000H設(shè):(32000H)=3050H執(zhí)行指令后:(AX)=3050H如果2000H單元在附加段,指令為:MOVAX,ES:[2000H]

段跨越前綴:段寄存器名:——改變默認(rèn)使用的段寄存器

MOVAX,NUM第一章基礎(chǔ)知識(shí)可以使用屬性操作符typePTR來(lái)進(jìn)行屬性說(shuō)明第一章基礎(chǔ)知識(shí)1000HAX用途:可用于處理數(shù)組50A0A050………存儲(chǔ)器數(shù)據(jù)段20000H21000HXXXX21002H例:設(shè)(DS)=2000H

(BX)=1000H指令為:

MOVAX,[BX]

數(shù)組起始地址(4)寄存器間接尋址方式(RegisterIndirectAddressing)特點(diǎn):(寄存器)=操作數(shù)的偏移地址計(jì)算操作數(shù)物理地址的公式:1)操作數(shù)物理地址=(DS)16+2)操作數(shù)物理地址=(SS)16+(BP)(BX)(SI)(DI)20000H+1000H=21000H

要訪問的存儲(chǔ)單元物理地址為:設(shè):(21000H)=50A0H執(zhí)行指令后:(AX)=50A0H指令

4000H30000HAX(寄存器相對(duì)尋址方式)1234例:設(shè)(DS)=3000H

ARRAY=4000H(SI)=2000H指令為:

MOVAX,ARRAY[SI]3412…………存儲(chǔ)器代碼段op

00

40數(shù)據(jù)段36000Hop…

2000H

數(shù)組起始地址(5)變址尋址方式(

IndexedAddressing)特點(diǎn):(變址、基址寄存器)+指令中的位移量

=

操作數(shù)的偏移地址計(jì)算操作數(shù)物理地址的公式:1)操作數(shù)物理地址=(DS)16+2)操作數(shù)物理地址=(SS)16+(BP)+8位位移量16位位移量30000H+4000H+2000H=36000H

要訪問的存儲(chǔ)單元物理地址為:設(shè):(36000H)=1234H用途:可用于處理數(shù)組執(zhí)行指令后:(AX)=1234H+(SI)(DI)(BX)8位位移量16位位移量0158HAX1234例:設(shè) (DS)=2100H (BX)=0158H (DI)=1000H指令為:MOVAX,[BX+DI]3412………存儲(chǔ)器數(shù)據(jù)段21000H22158H

1000H

數(shù)組起始地址(6)基址變址尋址方式(

BasedIndexAddressing)特點(diǎn):(基址寄存器)+(變址寄存器)

=

操作數(shù)的偏移地址計(jì)算操作數(shù)物理地址的公式:1)操作數(shù)物理地址=(DS)16+2)操作數(shù)物理地址=(SS)16+(BP)+(BX)+(SI)(DI)(SI)(DI)21000H+0158H+1000H=22158H

要訪問的存儲(chǔ)單元物理地址為:設(shè):(22158H)=1234H執(zhí)行指令后:(AX)=1234H用途:可用于處理數(shù)組幾種可處理數(shù)組的尋址方式的比較:1.MOVAX,[BX]2.MOVAX,ARRAY[SI]3.MOVAX,[BX][SI]寄存器間接尋址方式變址尋址方式基址變址尋址方式特點(diǎn):可讀性好,指令中明確指出了要處理的數(shù)組。限制:寫程序時(shí)必須清楚要處理什么數(shù)組。特點(diǎn):適用于要處理的數(shù)組需要在程序運(yùn)行中動(dòng)態(tài)確定,并且修改BX就可以處理不同的數(shù)組。特點(diǎn):適用于要處理的數(shù)組需要在程序運(yùn)行中動(dòng)態(tài)確定,且形式簡(jiǎn)單。

上述1.和2.指令中的[寄存器]還可被哪些寄存器替換?DISIBP(加段跨越前綴DS:或ES)

上述3.指令中的BX寄存器是否可被其他寄存器替換?DIBXBP(加段跨越前綴DS:或ES)next指令

2000HAX1234例:設(shè)(SS)=3000H (BP)=2000H

ARRAY=0250H (SI)=1000H

MOVAX,ARRAY[BP][SI]

1000H30000H3412…………存儲(chǔ)器代碼段op

50

02堆棧段33250Hop…

0250H棧頂數(shù)組首址(7)相對(duì)基址變址尋址方式(

RelativeBasedIndexAddressing)特點(diǎn):(基址寄存器)+(變址寄存器)+位移量

=

操作數(shù)的偏移地址30000H+2000H+0250+1000H=33250H

要訪問的存儲(chǔ)單元物理地址為:用途:便于訪問堆棧中的數(shù)組第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)注意:高低地址寫錯(cuò)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)機(jī)器指令的一般構(gòu)成格式:

1。前綴,共4種,可以0~4種結(jié)合起來(lái)。4個(gè)字節(jié)

2。指令,1~2字節(jié)。

3。尋址方式,0~1字節(jié),有的指令沒有操作數(shù)或者不用指明操作數(shù),所以就不必要有尋址方式了。

4。比例因子,0~1字節(jié),16位指令是沒有這個(gè)的,是32位變址的一個(gè)附帶系數(shù)。

5。偏移量,1,2,4字節(jié)。16位是1或2,32位是1或4。

6。立即數(shù),1,2,4字節(jié)。第一章基礎(chǔ)知識(shí)LockREPREPEREPNE第一章基礎(chǔ)知識(shí)W位指示對(duì)字(W=1)還是對(duì)字節(jié)(W=0)操作D值在雙操作數(shù)才有效,如果雙操作數(shù)中存在寄存器,D指定寄存器是目的操作數(shù)(D=1)還是源操作數(shù)(D=0)。第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)根據(jù)d的不同進(jìn)行選取第一章基礎(chǔ)知識(shí)d=1時(shí)的操作第一章基礎(chǔ)知識(shí)d=0時(shí)的操作第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)MOV指令注意事項(xiàng):

MOV指令可以在CPU內(nèi)或CPU和存儲(chǔ)器之間傳送字或字節(jié),它傳送的信息可以從寄存器到寄存器,立即數(shù)到寄存器,立即數(shù)到存儲(chǔ)單元,從存儲(chǔ)單元到寄存器,從寄存器到存儲(chǔ)單元,從寄存器或存儲(chǔ)單元到除CS外的段寄存器(注意立即數(shù)不能直接送段寄存器),從段寄存器到寄存器或存儲(chǔ)單元。MOV指令中的源操作數(shù)絕對(duì)不能是立即數(shù)和代碼段CS寄存器;

MOV指令中絕對(duì)不允許在兩個(gè)存儲(chǔ)單元之間直接傳送數(shù)據(jù);

MOV指令中絕對(duì)不允許在兩個(gè)段寄存器之間直接傳送數(shù)據(jù);

MOV指令不會(huì)影響標(biāo)志位例:MOVAX,DATA_SEGMOVDS,AX注意:段寄存器(段地址)必須通過(guò)寄存器如AX寄存器進(jìn)行立即數(shù)的初始化。例:MOVBX,OFFSETTABLE將TABLE的偏移地址(而不是內(nèi)容)送到BX寄存器中。其中OFFSET為屬性操作符,表示的是將其后的符號(hào)地址的值(不是內(nèi)容)作為操作數(shù)。例MOVAX,Y[BP][SI]

把地址為16d×(SS)十(BP)十(SI)十位移量Y的存儲(chǔ)單元的內(nèi)容送給AX寄存器例:

MOVAL,

E

指令執(zhí)行后:(AL)=45H例:

判斷下列指令是否合法:MOV DS,AX

不允許兩個(gè)操作數(shù)都是存儲(chǔ)器單元

MOV CS,AX

MOV CH,4050H

MOV DL,5BH

MOV DX,5BH

MOV DX,AL

MOV VA1,VA2

MOV 45,DL

目的操作數(shù)不允許是CS段寄存器目的操作數(shù)不允許是立即數(shù)數(shù)據(jù)類型不匹配數(shù)據(jù)類型不匹配next第一章基礎(chǔ)知識(shí)(2)堆棧傳輸指令格式PUSH進(jìn)棧指令格式為PUSHSRC執(zhí)行操作:(SP)<-(SP)-2((SP)十1,(SP))<-(SRC)POP出棧指令格式為POPDST執(zhí)行操作:(DST)<-((SP)十1,(SP))(SP)<-〔SP〕十2這是兩條堆棧的進(jìn)棧和出棧指令。堆棧是以“后進(jìn)先出”方式工作的一個(gè)存儲(chǔ)區(qū),它必須存在于堆棧段中,因而其段地址存放于SS寄存器中。它只有一個(gè)出入口,所以只有一個(gè)堆棧指針寄存器SP,SP的內(nèi)容在任何時(shí)刻都是指向當(dāng)前的棧頂,所以PUSH和POP指令都必須根據(jù)當(dāng)前SP的內(nèi)容來(lái)確定進(jìn)棧或出棧的存儲(chǔ)單元,而且必須及時(shí)修改指針,以保證(SP)指向當(dāng)前的棧頂。第一章基礎(chǔ)知識(shí)堆棧傳輸指令堆棧的存取必須以字為單位,(IBMPC中不允許字節(jié)堆棧),所以PUSH和POP指令只能作字操作。它們可以使用初立即數(shù)以外的其他尋址方式。指令也可以指定段寄存器作為操作數(shù),注意POP絕對(duì)不能使用代碼段(CS)寄存器。這兩條指令不影響標(biāo)志位。例PUSHAX例POPAX第一章基礎(chǔ)知識(shí)堆棧傳輸指令堆棧在計(jì)算機(jī)工作中起著重要的作用,如果在程序中要用到某些寄存器,但是它的內(nèi)容在將來(lái)工作中還有用,這時(shí)就可以利用堆棧把它們保存下來(lái),然后到必要時(shí)恢復(fù)其原始內(nèi)容。例如:第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)(3)有效地址傳輸指令地址傳送指令LEA有效地址送寄存器LDS指針?biāo)图拇嫫骱虳SLES指針?biāo)图拇嫫骱虴S這一組指令完成把地址送到指定寄存器的功能。1.LEA有效地址送寄存器格式:LEAREG,SRC

執(zhí)行過(guò)程:(REG)<-SRC

完成功能:指令將有效地址送到指定的寄存器中。2.LDS指針?biāo)图拇嫫骱虳S

格式:LDSREG,SRC

執(zhí)行的操作:(REG)〈一(SRC)

(DS)〈-(SRC十2)把源操作數(shù)指定的4個(gè)相繼字節(jié)送到由指令指定的寄存器及DS寄存器中。該指令通常用來(lái)指定SI寄存器。3.LES指針?biāo)图拇嫫骱虴S

格式:LESREG,SRC

執(zhí)行的操作:(REG)〈一(SRC)

(ES)〈-(SRC十2)

把源操作數(shù)指定的4個(gè)相繼字節(jié)送到由指令指定的寄存器及ES寄存器中。該指令通常用來(lái)指定DI寄存器。第一章基礎(chǔ)知識(shí)有效地址傳輸指令注意:以上三條指令,不能指定段寄存器,指令操作不影響標(biāo)志位本組指令把變量的偏移地址(LEA)或段地址和偏移地址(LDS和LES)送給寄存器,以提供訪問變量的工具。例:LEABX,[BX十SI十0F62H]

如指令執(zhí)行前(BX)=0400H,(SI)=003CH

則指令執(zhí)行后(BX)=0400十003C十0F62=139EH

必須注意,在這里BX寄存器得到的是偏移地址而不是該存儲(chǔ)單元的內(nèi)容。例:LDSSI,[10H]

如指令執(zhí)行前(DS)=C000H,(C0010H)=0180H,(C0012H)=2000H

則指令執(zhí)行后(S1)=0180H,(DS)=2000H

例LESDI,[BX]

如指令執(zhí)行前(DS)=B000H,(BX)=080AH,(0B080AH)=05AEH,(0B080CH)=4000H

則指令執(zhí)行后(D1)=05AEH,(ES)=4000H第一章基礎(chǔ)知識(shí)(4)XCHG交換指令

格式為XCHOOPRl,OPR2

執(zhí)行操作:(OPRl)〈一一〉(OPR2)其中OPR表示操作數(shù)。該指令的兩個(gè)操作數(shù)中必須有一個(gè)在寄存器中,因此,它可以是寄存器之間;寄存器和存儲(chǔ)器之間交換信息,注意不能使用段寄存器。指令允許字和字節(jié)操作,且不會(huì)影響標(biāo)志位。例XCHGBX,[BP+SI]

如指令執(zhí)行前:

(BX)=6F30H,(BP)=0200H,(SI)=0046H,(SS)=2F00H,(2F246H)=4l54HOPR2的物理地址=2F000十0200十0046=2F246則指令執(zhí)行后:

(BX)=4154H(2F246H)=6F30H第一章基礎(chǔ)知識(shí)(5)累加器專用傳送指令

IN(input)輸入OUT(output)輸出XLAT(Translate)換碼這組指令只限于使用累加器AX和AL傳送信息。1.IN輸入指令長(zhǎng)格式:對(duì)于前256個(gè)端口,可以在指令中直接指定,這就是常格式的端口(PORT)。短格式:當(dāng)端口號(hào)大于等于256時(shí),則必須先將端口號(hào)置于DX寄存器中,然后再利用IN或OUT進(jìn)行信息的傳遞。第一章基礎(chǔ)知識(shí)(5)累加器專用傳送指令

2、OUT輸出指令所有的I/O端口與CPU之間的通信都由IN和OUT指令來(lái)完成。其中IN完成從I/O到CPU的信息傳送,而OUT完成從CPU到I/O的信息傳送。CPU只和累加器(AX或AL)進(jìn)行接收或發(fā)送信息,外部最多可以有64K個(gè)端口,端口號(hào)為0000H–FFFFH。注意,在利用IN/OUT進(jìn)行信息傳遞時(shí),所有的端口號(hào)(或DX的內(nèi)容)均為地址,而傳送的均為端口號(hào)的內(nèi)容。輸入、輸出指令不影響標(biāo)志位第一章基礎(chǔ)知識(shí)(5)累加器專用傳送指令

例INAX,28HMOVDATA_WORD,AX這兩條指令把地口28的內(nèi)容經(jīng)過(guò)AX傳送到存儲(chǔ)單元DATA_WORD中。例MOVDX,3FCHINAX,DX從端口03FCH送一個(gè)字到AX寄存器中。例OUT5,AL從AL寄存器輸出一個(gè)字節(jié)到端口53.XLAT換碼指令格式為;XLATOPR

或XLAT執(zhí)行的操作:(AL)〈一((BX)十(AL))功能:將一種代碼轉(zhuǎn)換為另一種代碼。第一章基礎(chǔ)知識(shí)(5)累加器專用傳送指令

3.XLAT換碼指令格式為;XLATOPR

或XLAT執(zhí)行的操作:(AL)〈一((BX)十(AL))功能:將一種代碼轉(zhuǎn)換為另一種代碼。在使用這條指令之前,應(yīng)該先建立一個(gè)字節(jié)表格,表格的首地址提前存入BX寄存器,需要轉(zhuǎn)換的代碼應(yīng)該是相對(duì)于表格首地址的位移量也提前存放在AL寄存器中,表格的內(nèi)容則是需要轉(zhuǎn)換的代碼,該指令執(zhí)行后就可在AL中得到轉(zhuǎn)換后的代碼。該指令可以使用XLAT或XLATOPR兩種格式中的任一種,使用XLATOPR時(shí),OPR為表格的首地址(一般為符號(hào)地址),但在這里的OPR只是為提高程序的可讀性而設(shè)置的,指令執(zhí)行時(shí)只使用預(yù)先已存入BX中的表格首地址,而并不用匯編格式中指定的值。該指令不影后標(biāo)志位。

第一章基礎(chǔ)知識(shí)(5)累加器專用傳送指令

例如(BX)=0040H,(AL)=0FH,(Ds)=F000H所建立的表格如下圖所示。指令XLAT把F0000H+0040H+0FH的內(nèi)容送AL,所以指令執(zhí)行后:(AL)=2CH

即指令把AL中的代碼0FH轉(zhuǎn)換為2CH。必須注意,由于AL為8位二進(jìn)制位,所以表格的最大長(zhǎng)度不能超過(guò)256。如果我們想把十進(jìn)制數(shù)轉(zhuǎn)換為ASC碼,如何進(jìn)行轉(zhuǎn)換呢?

第一章基礎(chǔ)知識(shí)(6)標(biāo)志位寄存器傳送指令

LAHF標(biāo)志寄存器的低字節(jié)送AHSAHFAH送標(biāo)志寄存器的低字節(jié)PUSHF標(biāo)志進(jìn)棧POPF標(biāo)志出棧1.LAHF標(biāo)志送AH指令格式為:LAHF執(zhí)行的操作:(AH)〈-(PSW寄存器的低字節(jié))2.SAHFAH送標(biāo)志寄存器指令格式為:SAHF執(zhí)行的操作:(PSW的低字節(jié))一〉(AH)3.PUSHF標(biāo)志進(jìn)棧指令格式為;PUSHF執(zhí)行的操作:(SP)〈-(SP)-2((SP)+1,(SP))〈-(PSW)第一章基礎(chǔ)知識(shí)(6)標(biāo)志位寄存器傳送指令

4.POPF標(biāo)志出棧格式為:POPF執(zhí)行過(guò)程為:(PSW)〈--((SP)十1,(SP))(SP)〈一(SP)十2

這組指令中的LAHF和PUSHF不影響標(biāo)志位。SAHF相POPF則由裝入的值來(lái)確定標(biāo)志位的值。第一章基礎(chǔ)知識(shí)DF=0:遞增指令CLDDF=1:遞減指令STD(7)串操作指令串操作指令能對(duì)存貯區(qū)中一塊(串)字節(jié)或字進(jìn)行操作,其塊的長(zhǎng)度可達(dá)64K字節(jié),任一個(gè)這樣的基本操作指令前還能用一個(gè)重復(fù)前綴使它們重復(fù)地操作。

重復(fù)執(zhí)行串操作指令(由CX控制次數(shù)),實(shí)現(xiàn)串操作。第一章基礎(chǔ)知識(shí)(7)串操作指令注意:所有的基本串操作指令都約定:源串用寄存器SI進(jìn)行尋址,在無(wú)超越前綴時(shí),段地址取自于數(shù)據(jù)段寄存器DS;目的串則用寄存器DI進(jìn)行尋址,其段地址總是取自于附加段寄存器ES中。

串操作指令在每一次操作之后能自動(dòng)修改地址指針SI,DI的值,以便指向串中下一個(gè)元素的地址。但按增量還是按減量來(lái)修改地址,則取決于方向標(biāo)志DF。若DF=0,則SI,DI自動(dòng)增量(字節(jié)操作加1,字操作加2);反之,SI,DI自動(dòng)減量。DF的狀態(tài)由指令STD(置方向標(biāo)志)和CLD(清除方向標(biāo)志)來(lái)控制。注意:MOVS、LODS、STOS指令對(duì)標(biāo)志位無(wú)影響,CMPS、SCAS指令對(duì)標(biāo)志位的影響同CMP指令(1)串傳送指令

MOVSDST,SRCMOVSB

(字節(jié)操作)MOVSW

(字操作)執(zhí)行操作:((DI))←((SI))

完成操作后:(SI)←(SI)±1,(DI)←(DI)±1(SI)←(SI)±2,(DI)←(DI)±2DF=0,取+DF=1,取-串傳送指令與重復(fù)操作前綴聯(lián)用,就可以傳送數(shù)據(jù)串。指令格式指令功能MOVSOPRD1,OPRD2

或MOVSB

或MOVSW

把由SI作為地址指針的源串中的一個(gè)字節(jié)或字傳送到由DI為地址指針的目的串并相應(yīng)的修改地址,以指向串中的下一個(gè)元素。其中OPRD1、OPRD2分別為目的串和源串操作數(shù)的符號(hào)地址。其中第二、三種格式明確地注釋是傳送字節(jié)和字,第一種格式則應(yīng)在操作數(shù)中表明是字還是字節(jié)操作,例如:MOVES:BYTEPTR[DI],DS:[SI]重復(fù)操作前綴有下列三種形式:1)重復(fù)前綴REP應(yīng)用指令:MOVS,STOS

2)相等重復(fù)前綴

REPE/REPZ應(yīng)用指令:CMPS,SCAS3)不相等重復(fù)前綴REPNE/REPNZ應(yīng)用指令:CMPS,SCAS(CX)=0?

執(zhí)行串操作指令(CX)(CX)-1(SI)(SI)+1(DI)(DI)+1是否退出執(zhí)行(CX)=0或

ZF=0?(CX)=0或

ZF=1?以REPMOVSB為例,串操作步驟:(1)源串首地址→SI(2)目的串首地址→DI

(3)串長(zhǎng)度→CX(4)設(shè)置方向標(biāo)志(5)執(zhí)行串操作指令:REPMOVSB例:buffer

l(4個(gè)字符)buffer2程序如下:

LEA SI,buffer1LEA DI,buffer2CLD MOV CX,4REP MOVSB

CLD

DF=0

地址自動(dòng)增

STD

DF=1

地址自動(dòng)減數(shù)據(jù)段附加段REPMOVSB指令操作(CX)=0?((DI))((SI))(CX)(CX)-1(SI)(SI)+1(DI)(DI)+1是否退出執(zhí)行

v

e

m

o………存儲(chǔ)器ovebuffer1mbuffer2SIDIDSES…………ovembuffer2DIDSES…DIDISISI串傳送指令執(zhí)行前、后的情況:(2)串比較指令

CMPSSRCDSTCMPSB

(字節(jié)操作)

CMPSW

(字操作)完成操作:((SI))-((DI))

例:比較存放在兩個(gè)數(shù)組(string

l和string2)中的兩個(gè)字符串(14個(gè)字節(jié))是否相同,即比較(

string

l)=(string2

)?程序如下:

LEA SI,string

l

LEA DI,string2MOV CX,14CLDREPZ CMPSB

程序執(zhí)行結(jié)果如圖所示(3)串搜索指令

SCASB

(字節(jié)操作)

SCASW

(字操作)

字節(jié)操作:(AL)-((DI)),(DI)←(DI)±1

字操作:(AX)-((DI)),(DI)←(DI)±2next

如何體現(xiàn)搜索功能?DISI……數(shù)據(jù)段t

nstring1sSIDS……trisDS……tri

sESg

-m20000H20002H20004H20006H20008H附加段DIstring2n

g

-co…25000H25002H25004H25006H25008H2500AH2000AH(SI)=0008H(DI)=5008H返回…

o(4)存串指令

STOSDSTSTOSB

(字節(jié)操作)

STOSW

(字操作)

字節(jié)操作:((DI))←(AL),(DI)←(DI)±l

字操作:

((DI))←(AX),(DI)←(DI)±2

(5)取串指令

LODSLODSB

(字節(jié)操作)

LODSW

(字操作)

字節(jié)操作:(AL)←((SI)),(SI)←(SI)±1

字操作:(AX)←((SI)),(SI)←(SI)±2例:取串指令舉例

LEASI,BUFMOVCX,50CLDREPLODSB

MOVAL,[SI]INCSILODSB第一章基礎(chǔ)知識(shí)與串操作指令配合使用的前綴指令:串操作指令與重復(fù)操作前綴的搭配:REP

存串、串傳送指令REPE/REPZ

串比較指令REPNE/REPNZ

串搜索指令

無(wú)取串指令第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)(1)加法指令

(完成二進(jìn)制的加法、帶進(jìn)位加法、加1)

1)加法指令A(yù)DD

ADD dst,src(dst)←(dst)+(src)影響CF、AF、OF、PF、SF、ZF標(biāo)志位。2)帶進(jìn)位加法指令A(yù)DCADCdst,src(dst)←(dst)+(src)+CF(進(jìn)位標(biāo)志位的值)

3)加1指令I(lǐng)NCINC opr(opr)←(opr)+1

(不影響CF)CF=1:無(wú)符號(hào)數(shù)運(yùn)算溢出最高有效位有進(jìn)位時(shí),CF置1

OF=1:帶符號(hào)數(shù)運(yùn)算溢出兩個(gè)同符號(hào)操作數(shù)的運(yùn)算結(jié)果符號(hào)發(fā)生變化時(shí),OF置1

CF、OF標(biāo)志位在加法運(yùn)算中的作用:第一章基礎(chǔ)知識(shí)無(wú)符號(hào)數(shù)

帶符號(hào)數(shù)S

11111111255-1S11111111例:用ADD、ADC指令執(zhí)行兩個(gè)雙字加法運(yùn)算

計(jì)算:0002F360H+0005E020H=0008D380H設(shè)執(zhí)行指令前:

(DX)=0002H,(AX)=F360H,(BX)=0005H,(CX)=E020HADDAX,CXADCDX,BX

執(zhí)行第一條指令A(yù)DD:

F360H

+E020H(AX)=D380H,SF=1,ZF=0CF=1,OF=0執(zhí)行第二條指令A(yù)DC:

0002H+0005H+1H(CF)

(DX)=0008H,SF=0,ZF=0CF=0,OF=0對(duì)于雙字加法,用ADC指令:低位字加法的進(jìn)位—>高位字1←D380H0008H0~255127~-1288位數(shù)為例分析ADD(1)帶符號(hào)數(shù)和無(wú)符號(hào)數(shù)都不溢出(2)帶符號(hào)數(shù)不溢出和無(wú)符號(hào)數(shù)溢出

8位數(shù)為例分析ADD(3)帶符號(hào)數(shù)溢出和無(wú)符號(hào)數(shù)不溢出(4)帶符號(hào)數(shù)和無(wú)符號(hào)數(shù)都溢出第一章基礎(chǔ)知識(shí)減法的CF值反映無(wú)符號(hào)數(shù)運(yùn)算中的借位情況,因此當(dāng)作為無(wú)符號(hào)數(shù)運(yùn)算時(shí),若減數(shù)>被減數(shù),此時(shí)有借位則CF=1,否則CF=0。減法的OF位的設(shè)置方法為:若兩個(gè)數(shù)的符號(hào)相反,而結(jié)果的符號(hào)與減數(shù)相同則OF=1,除上述情況外OF=0。OF=1說(shuō)明帶符號(hào)數(shù)的減法溢出,結(jié)果是錯(cuò)誤的。第一章基礎(chǔ)知識(shí)第一章基礎(chǔ)知識(shí)例:求補(bǔ)指令舉例NEGAL

設(shè)執(zhí)行指令前:(AL)=02H執(zhí)行指令時(shí):計(jì)算0FFH-(AL)+111111111B-00000010B等效求反4)求補(bǔ)指令NEGNEG opr(opr)←0FFH-(opr)+1(字節(jié)操作)

或(opr)←0FFFFH-(opr)+1(字操作)

11111101BFEH的原碼十進(jìn)制值是-211111101B+00000001B(AL)=FEH

11111110B加1FFH–(AL)等效求補(bǔ)NEG指令的功能:改變操作數(shù)的符號(hào)

可用于取操作數(shù)的絕對(duì)值

例.SUB[SI十14H],0136H如指令執(zhí)行前(DS)=3000H,(S1)=0040H.(30054H)=4336H則指令執(zhí)行后:所以,(30054H)=4200H,SF=0,ZF=O,CF=0,0F=0例SUBDH,[BP十4]如指令執(zhí)行前(DH)=4lH,(SS)=0000H,(BP)=00E4H,(000E8)=5AH則指令執(zhí)行后所以,(DH)=0E7H,SF=1,ZF=0,CF=1,OF=0

例設(shè)X,Y,Z均為雙精度數(shù),它們分別存放在地址為X,X十2;Y,Y十2;Z,Z+2的存儲(chǔ)單元中,存放時(shí),高位字在高地址中,低位字在低地址中。下列指令序列實(shí)現(xiàn):并用W和W+2單元存放運(yùn)算結(jié)果。5)比較指令CMPCMP opr1,opr2(oprl)-(opr2)

:比較指令CMP舉例設(shè)指令為:CMPAX,CX

ZF=CF=指令執(zhí)行后如何判別AX和CX的大小關(guān)系(以無(wú)符號(hào)數(shù)為例)?

1即(AX)=(CX)

(AX)-(CX)=00即(AX)

(CX)

(AX)-(CX)

01即(AX)<(CX)

有借位0即(AX)>(CX)

無(wú)借位CMP指令僅僅做減法并設(shè)置標(biāo)志位判別大小關(guān)系由條件轉(zhuǎn)移指令完成(后邊介紹)。

CMP和SUB的差別?(操作與用途)第一章基礎(chǔ)知識(shí)乘法指令

兩條:無(wú)符號(hào)數(shù)乘法指令和帶符號(hào)數(shù)乘法指令MUL src

字節(jié)操作:(AX)←(AL)*(src)

字操作:(DX(高位字),AX(低位字))←(AX)*(src)

2)帶符號(hào)數(shù)乘法指令I(lǐng)MUL

IMUL src

1)無(wú)符號(hào)數(shù)乘法指令

標(biāo)志位:影響CF和OF,其它標(biāo)志位無(wú)定義。

操作與MUL相似,不同處是操作數(shù)為帶符號(hào)數(shù)。MUL指令和IMUL指令的使用條件是由數(shù)的格式?jīng)Q定的。很明顯(11111111b)*(11111111b)當(dāng)把它看作無(wú)符號(hào)數(shù)時(shí)應(yīng)為255d×255d=65025d;而把它看作帶符號(hào)數(shù)時(shí)則為(一1)×(一1)=1。因此必須根據(jù)所要相乘數(shù)的格式來(lái)決定選用哪一種指令。如果CF=OF=0:字節(jié)乘字節(jié)的積—>字節(jié)

字乘字的積—>字如果CF=OF=1:字節(jié)乘字節(jié)的積—>字

字乘字的積—>雙字CF和OF

標(biāo)志位可判定乘積的數(shù)據(jù)類型:

對(duì)于MUL指令,如果乘積的高一半為0、即字節(jié)操作的(AH)或字操作的(DX)為0,則CF和OF均為0;否則(即字節(jié)操作時(shí)的(AH)或字操作時(shí)的(Dx)≠0)則CF和OF均為1。這樣的條件碼設(shè)置可以用來(lái)檢查字節(jié)相乘的結(jié)果是字節(jié)還是字,或者可以檢查字相乘的結(jié)果是字還是雙字。對(duì)于IMUL指令,如果乘積的高一半是低一半的符號(hào)擴(kuò)展則CF和OF均為0,否則就均為1。指令中的源操作數(shù)可以使用除立即數(shù)方式以外的任一種尋址方式。

例.如(AL)=0B4H,(BL)=11H求執(zhí)行指令

IMULBL和MULBL后的乘積值。

(AL)=0B4H為無(wú)符號(hào)數(shù)的180D,帶符號(hào)數(shù)的一76D(BL)=11H為無(wú)符號(hào)數(shù)的17D,帶符號(hào)數(shù)的17D

執(zhí)行IMUL的結(jié)果為:(AX)=0FAF4H==-1292D

執(zhí)行MUL的結(jié)果為:(AX)=0BF4H=3060DCF=OF=1。

除法指令

(無(wú)符號(hào)數(shù)和帶符號(hào)數(shù)除法指令)1)無(wú)符號(hào)數(shù)除法指令DIV src

字節(jié)操作:(AL)←(AX)/(src)的商

(AH)←(AX)/(src)的余數(shù)字操作:(AX)←(DX,AX)/(src)的商

(DX)←(DX,AX)/(src)的余數(shù)

2)帶符號(hào)數(shù)除法指令I(lǐng)DIVsrc

(操作同DIV,但操作數(shù)必須是帶符號(hào)數(shù),商和余數(shù)也均為帶符號(hào)數(shù),且余數(shù)的符號(hào)和被除數(shù)的符號(hào)相同。

)注意:除法指令的尋址方式與乘法指令相同。其目的操作數(shù)必須存放在AX或DX中。其源操作數(shù)可以用除立即數(shù)以外的任何尋址方式。除法指令對(duì)所有條件碼均無(wú)定義。

如果操作數(shù)不滿足除法指令的要求,怎么辦?例:93H/45H,被除數(shù)不是16位,應(yīng)當(dāng)擴(kuò)展為16位,如何擴(kuò)展?簡(jiǎn)便起見,以3為例,討論二進(jìn)制數(shù)位的擴(kuò)展問題:8位的二進(jìn)制3—>00000011擴(kuò)展為16位00000000000000118位的二進(jìn)制-2—>11111110擴(kuò)展為16位1111111111111110數(shù)據(jù)位擴(kuò)展方法:用符號(hào)位進(jìn)行數(shù)位的擴(kuò)展。上述能保持符號(hào)的數(shù)據(jù)位擴(kuò)展方法稱為:符號(hào)擴(kuò)展3)字節(jié)轉(zhuǎn)換為字指令CBW

執(zhí)行操作:將(AL)的符號(hào)擴(kuò)展到AH,構(gòu)成字(AX)(AL)7=0(AH)=00H1(AH)=FFH4)字轉(zhuǎn)換為雙字指令CWD執(zhí)行操作:將(AX)的符號(hào)擴(kuò)展到DX,方法類似這兩條指令都不影響條件碼。例.設(shè)(AX)=0400H,(DL)=0B4H即(AX)為無(wú)符號(hào)數(shù)的1024D,帶符號(hào)數(shù)的十1024D(DL)為無(wú)符號(hào)數(shù)的180D,帶符號(hào)數(shù)的一76D

執(zhí)行DIVBL

的結(jié)果是:

(AH)=7CH=124D余數(shù)

(AL)=05H=5D商

IDIVBL

的結(jié)果是:

(AH)=24H=36D余數(shù)

(AL)=0F3H=-13D商例.算術(shù)運(yùn)算綜合舉例,計(jì)算

(V一(X*Y十Z一540))/X其中X、Y、X和V均為16位帶符號(hào)數(shù),已分別裝入X、Y、Z、V單元中,要求上式計(jì)算結(jié)果的商存入AX,余數(shù)存入DX寄存器

前面提到的所有算術(shù)運(yùn)算指令都是二進(jìn)制數(shù)的運(yùn)算指令,但是人們最常用的是十進(jìn)制數(shù),這樣,當(dāng)用計(jì)算機(jī)進(jìn)行計(jì)算時(shí),必須先把十進(jìn)制數(shù)轉(zhuǎn)換成二進(jìn)制數(shù),然后再進(jìn)行二進(jìn)制數(shù)的計(jì)算,計(jì)算結(jié)果又轉(zhuǎn)換為十進(jìn)制數(shù)輸出。為了便于十進(jìn)制數(shù)的計(jì)算,計(jì)算機(jī)還提供了一組十進(jìn)制數(shù)調(diào)整指令,這組指令在二進(jìn)制計(jì)算的基礎(chǔ)上,給予十進(jìn)制調(diào)整,可以直接得到十進(jìn)制的結(jié)果。

十進(jìn)制調(diào)整指令BCD碼—>建立了二進(jìn)制與十進(jìn)制的聯(lián)系

算術(shù)運(yùn)算指令只能完成二進(jìn)制運(yùn)算,十進(jìn)制數(shù)調(diào)整指令可對(duì)二進(jìn)制運(yùn)算結(jié)果進(jìn)行調(diào)整,得到用BCD碼表示的十進(jìn)制數(shù)。BCD碼有壓縮和非壓縮兩種格式:壓縮的BCD碼:4位二進(jìn)制數(shù)—>1位十進(jìn)制數(shù)(95:10010101)BCD

非壓縮的BCD碼:8位二進(jìn)制數(shù)—>1位十進(jìn)制數(shù)(95:0000100100000101)BCD

8位非壓縮BCD碼的高4位可以是任意值

,因此數(shù)字字符的ASCII碼—>看成一種非標(biāo)準(zhǔn)的壓縮的BCD碼例:

5

的ASCII碼為35H(00110101)BCD—>5

(非壓縮的BCD碼)

(一)壓縮的BCD碼調(diào)整指令

DAA加法的十進(jìn)制調(diào)整指令DAS減法的十進(jìn)調(diào)調(diào)整指令我們知道,機(jī)器所提供的ADD、ADC以及SUB、SBB指令只適用于二進(jìn)制加、減法,但壓縮的BCD碼卻是一個(gè)字節(jié)含有兩個(gè)十進(jìn)制數(shù)值的二進(jìn)制數(shù)。在使用加、減法指令對(duì)BCD碼運(yùn)算后必須經(jīng)調(diào)整后才能得到正確的結(jié)果。

加法的調(diào)整規(guī)則是;任意兩個(gè)用BCD碼表示的十進(jìn)制數(shù)位相加的結(jié)果,如數(shù)值在10l0和1111之間或者產(chǎn)生了向高位的進(jìn)位,則在其上加6就可得到正確的結(jié)果。

第一章基礎(chǔ)知識(shí)DAA加法的十進(jìn)制調(diào)整指令:

執(zhí)行的操作:把從AL中的和調(diào)整到壓縮的BCD格式,這條指令之前必須執(zhí)行ADD或ADC指令,加法指令必須把兩個(gè)壓縮的BCD碼相加,并把結(jié)果存放在AL寄存器中。本指令的調(diào)整方法是;

如果AF標(biāo)志(輔助進(jìn)位位)為1,或者AL寄存器的低4位是十六進(jìn)制的A–F,則AL寄存器內(nèi)容加06H,且將AF位置入1。如果CF標(biāo)志為1,或者AL寄存器的高4位是十六進(jìn)制的A–F,則AL寄存器內(nèi)容加60H,并將CF位置1。

DAA指令對(duì)OF標(biāo)志無(wú)定義,但影響所有其它條件標(biāo)志。

例如可見第一次得到的1101不是BCD碼,根據(jù)調(diào)整規(guī)則應(yīng)在其上加6,得到個(gè)位為3,并向高位進(jìn)位的正確結(jié)果。28H+36H5EH分析:

例1:十進(jìn)制計(jì)算28+36=64用指令進(jìn)行二進(jìn)制加法運(yùn)算的結(jié)果為:

寫成BCD碼為

:(00101000

)BCD+(00110110

)BCD=(01100100

)BCD

問題:逢十六進(jìn)位解決方法:加6補(bǔ)償5EH+6H

64H(01100100

)BCD例2:

十進(jìn)制計(jì)算28+69=97=(10010111

)BCD=97H28H+69H91H問題:逢十六進(jìn)位解決方法:加6補(bǔ)償91H+6H

97H(10010111

)BCD例.ADDAL,BLDAA如指令執(zhí)行前,(AL)=28,(BL)=6828001010006801101000+10010000執(zhí)行ADD指令后(AL)=90,CF=0,AF=1執(zhí)行DAA指令時(shí).因AF=1而做(AL)〈一(AL)+06得(AL)=96,CF=0,AF=1結(jié)果正確。第一章基礎(chǔ)知識(shí)例如(BCDl)=1834,(BCD2)=2789要求執(zhí)行(BCD3)〈—(BCDl)十(BCD2)BCDl和BCD2均為用壓縮的BCD碼表示的十進(jìn)制數(shù),由于它們都是4位數(shù),所以每個(gè)數(shù)占有2個(gè)字節(jié),高位數(shù)占有高位字節(jié),其存放方式為

(BCDl)=34,(BCDl十1)=18;

(BCD2)=89,(BCD2十1)=27??蓪懗鲋噶钚蛄腥缦拢?/p>

第—組四條指令把低位字節(jié)相加經(jīng)調(diào)整后存入BCD3,其中ADD指令后(AL)=34+89=BDH,CF=0,AF=0;經(jīng)DAA調(diào)整后,(AL)=23,CF=1,AF=1。第二組四條指令把高位字節(jié)相加經(jīng)調(diào)整后存入BCD3十1。其中ADC指令后(AL)=8十27十CF=40,CF=0,AF=1;經(jīng)DAA調(diào)整后(AL)=46,CF=0,AF=1;最后(DCD3)=4623結(jié)果正確。

第一章基礎(chǔ)知識(shí)DAS減法的十進(jìn)制調(diào)整指令

執(zhí)行操作:把AL中的差調(diào)整到壓縮的BCD格式。這條指令之前必須執(zhí)行SUB或SBB指令,減法指令必須把兩個(gè)BCD碼相減、并把結(jié)果存放在AL寄存器中。

調(diào)整方法是:

如果AF標(biāo)志為l,或者AL寄存器的低4位是十六進(jìn)制的A—F,則使AL寄存器的內(nèi)容減去06H.并將AF位置1。如果CF標(biāo)志為1,或者AL寄存器的高4位是十六進(jìn)制的A—F,則使AL寄存器的內(nèi)容減去60H,并將CF位置l。

DAS指令對(duì)OF標(biāo)志無(wú)定義,但影響所有其它條件標(biāo)志。

第一章基礎(chǔ)知識(shí)例.SUBAL,AHDAS如指令執(zhí)行前,(AL)=86,(AH)=078610000110-0700000111↓↓8610000110(-7)補(bǔ)11111001+01111111

執(zhí)行SUB指令后,(AL)=7FH,CF=0,AF=1執(zhí)行DAS指令時(shí)。因AF=1,需做:(AL)=(AL)–06而得(AL)=79,CF=0,AF=1,結(jié)果正確。

第一章基礎(chǔ)知識(shí)例.如(DCD1)=1234,(BCD2)=4612,試寫出指令序列完成(BLD3)〈—(BCD1)-(BCD2)。BCDl和BCD2均為用壓縮的BCD碼表示的十進(jìn)制數(shù),由于它們都是4位數(shù),所以每個(gè)數(shù)占有2個(gè)字節(jié),高位數(shù)占有高位字節(jié),其存放方式為

(BCDl)=34,(BCDl十1)=12;

(BCD2)=12,(BCD2十1)=46。指令序列如下:第一組:四條指令把低位字節(jié)相減經(jīng)十進(jìn)制調(diào)整后存入BCD3。其中SUB指令后(AL)=22,CF=0,AF=0,所以DAS并未做什么操作而把結(jié)果送往BCD3。第二組四條指令把高位字節(jié)相減經(jīng)十進(jìn)制調(diào)整后存入BCD3+1。其中SBB指今后,(AL)=CCH,CF=1,AF=1經(jīng)DAS調(diào)整后(AL)=66,CF=1,AF=1;最后(BCD3)=6622,到這里,會(huì)說(shuō)結(jié)果錯(cuò)了,其實(shí),結(jié)果是對(duì)的、6622是一3378的十的補(bǔ)碼。用BCD碼表示十進(jìn)制數(shù)的符號(hào)問題:使用十的補(bǔ)碼來(lái)表示,如十進(jìn)制數(shù)的位數(shù)為n、則任意整數(shù)d的十的補(bǔ)碼定義為10n-d,數(shù)位為n的十進(jìn)制數(shù)的表數(shù)范圍為一5×10n-1一5×10n-1-1。如n=8,則可用二個(gè)字(32位)來(lái)表示一個(gè)十進(jìn)制數(shù),其表數(shù)范圍為-50000000-49999999。n=4,用16位表示一個(gè)帶符號(hào)數(shù),此時(shí)的表數(shù)范圍是-5000一十4999,所以6622應(yīng)表示一個(gè)負(fù)數(shù).它是-3378。第一章基礎(chǔ)知識(shí)AAA加法的ASCII碼調(diào)整指令:

執(zhí)行的操作:

把AL中的和調(diào)整到非壓縮的BCD格式,(AH)=(AH)十調(diào)整產(chǎn)生的進(jìn)位值。這條指令之前必須執(zhí)行ADD或ADC指令,加法指令必須把兩個(gè)非壓縮的BCD碼相加,并把結(jié)果存放在AL寄存器中本指令的調(diào)整方法是;

(1)如AL寄存器的低4位在0一9之間,且AF位為0,則跳過(guò)第(2)步,執(zhí)行第(3)步;

(2)如AL寄存器的低4位在十六進(jìn)制數(shù)A—F之間或AF為1,則AL寄存器的內(nèi)容加6,AH寄存器的內(nèi)容加1,并將AF位置1。

(3)清除AL寄存器的高4位:

(4)AF位的值送CF位。AAA指令除影響AF和CF標(biāo)志外,其余標(biāo)志位均無(wú)定義。第一章基礎(chǔ)知識(shí)例.ADDAL,BLAAA如指令執(zhí)行前,(AX)=0535H,〔BL〕=39H,可見AL和BL寄存器的內(nèi)容分別為5和9的ASCII。35001101013900111001+01101110

第一條指令執(zhí)行完后,(AL)=6EH,AF=0;第二條指令進(jìn)行ASC調(diào)整的結(jié)果使(AX)=0604H,AF=1,CF=1。第一章基礎(chǔ)知識(shí)AAS減法的ASCII碼調(diào)整指令:

執(zhí)行的操作:

把AL中的差調(diào)整到非壓縮的BCD格式(AH)〈—(AH)一調(diào)整產(chǎn)生的借位值這條指令之前必須執(zhí)行SUB或SBB指令,減法指令必須把兩個(gè)非壓縮的BCD碼相減,并把結(jié)果存放在AL寄存器中。本指令的調(diào)整方法是;

(1)如AL寄存器的低4位在0一9之間,且AF位為0,則跳過(guò)第(2)步,執(zhí)行第(3)步。

(2)如AL寄存器的低4位在十六進(jìn)制數(shù)A—F之間或AF位為1,則把AL寄存器的內(nèi)容減去6,AH寄存器的內(nèi)容減1,并將AF位置1;

(3)清除AL寄存器的高4位;(4)AF位的值送CP位。AAS指令除影響AP和CF標(biāo)志外,其余標(biāo)志位均無(wú)定義第一章基礎(chǔ)知識(shí)例.編寫程序段實(shí)現(xiàn)下式(DX)〈—UPl十UP2一UP3其中參加運(yùn)算的數(shù)均為二位十進(jìn)制數(shù)。如要求計(jì)算25十48一19,每個(gè)十進(jìn)制數(shù)以非壓縮BCD格式存入存儲(chǔ)器,每個(gè)數(shù)占有一個(gè)字,所以(UP1)=0205H.(UP2)=0408H,(UP3)=0109H??蓪懗鲋噶钚蛄腥缦聢D所示。

第一章基礎(chǔ)知識(shí)AAM乘法的ASC調(diào)整指令:

執(zhí)行的操作:

把AL中的積調(diào)整到非壓縮的BCD格式。這條指令之前必須執(zhí)行MUL指令把兩個(gè)非壓縮的BCD碼相乘(此時(shí)要求其高4位為0),結(jié)果放在AL寄存器中。本指令的調(diào)整方法是;把AL寄存器的內(nèi)容除以0AH,商放在AH寄存器中,余數(shù)保存在AL寄存器中。本指令根據(jù)AL寄存器的內(nèi)容設(shè)置條件碼SF、ZF和PF,注意:OF,CF和AF位無(wú)定義。第一章基礎(chǔ)知識(shí)例MULAL,BLAAM如指令執(zhí)行前,(AL)=07H,(BL)=09H執(zhí)行MUL后,(AL)=3FH執(zhí)行AAM后,

(AH)=06H,(AL)=03H第一章基礎(chǔ)知識(shí)AAD除法的ASCII調(diào)整指令:

執(zhí)行的操作:

前面所述的加法、減法和乘法的ASC調(diào)整指令都是用加法、減法和乘法指令對(duì)兩個(gè)非壓縮的BCD碼運(yùn)算以后,再使用AAA、AAS、AAM指令來(lái)對(duì)運(yùn)算結(jié)果進(jìn)行十進(jìn)制調(diào)整的。除法的情況卻不同,它是針對(duì)以下情況而設(shè)立的。如果被除數(shù)是存放在AX寄存器中的二位非壓縮BCD數(shù)。AH中存放十位數(shù),AL中存放個(gè)位數(shù),而且要求AH和AL中的高4位均為0。除數(shù)是一位非壓縮的BCD數(shù),同樣要求高4位為0,在把這兩個(gè)數(shù)用DIV指令相除以前,必須先用AAD指

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論