第03章 匯編基礎(chǔ)_第1頁(yè)
第03章 匯編基礎(chǔ)_第2頁(yè)
第03章 匯編基礎(chǔ)_第3頁(yè)
第03章 匯編基礎(chǔ)_第4頁(yè)
第03章 匯編基礎(chǔ)_第5頁(yè)
已閱讀5頁(yè),還剩208頁(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)介

微型計(jì)算機(jī)原理

與接口技術(shù)

21世紀(jì)高等學(xué)校計(jì)算機(jī)規(guī)劃教材人民郵電出版社第3章匯編語(yǔ)言基礎(chǔ)

3.1數(shù)據(jù)定義與傳送3.2匯編語(yǔ)言上機(jī)操作3.3數(shù)據(jù)運(yùn)算3.4數(shù)據(jù)的輸入和輸出3.5移位和處理器控制進(jìn)位計(jì)數(shù)制三個(gè)基本特征:有限個(gè)數(shù)字符號(hào):0,1,2,……,R-1,“R”稱為“基數(shù)”;“逢R進(jìn)1”;“權(quán)展開(kāi)式”:小數(shù)點(diǎn)向左各數(shù)字的“權(quán)”分別是R0,R1,R2,R3,……。小數(shù)點(diǎn)向右各數(shù)字的“權(quán)”分別是R-1,R-2,R-3,……。D=dn-1dn-2dn-3……d2d1d0.d-1d-2……d-m=dn-1×Rn-1+……+d1×R1+d0×R0+d-1×R-1+……+d-m×R-m補(bǔ)充:進(jìn)位計(jì)數(shù)制(可選)10個(gè)數(shù)字符號(hào):0,1,2,……,9;“逢十進(jìn)一”;小數(shù)點(diǎn)向左各數(shù)字的“權(quán)”是100,101,102,103,……小數(shù)點(diǎn)向右各數(shù)字的“權(quán)”是10-1,10-2,10-3,……。[例]:323.31=3×102+2×101+3×100+3×10-1+1×10-2。十進(jìn)制數(shù)用它原來(lái)的形式表示,如123,-36等,也可以在數(shù)值后面加上字母“D”或“d”,如123D,-36d等。1.

十進(jìn)制計(jì)數(shù)法計(jì)算機(jī)內(nèi)部采用“二進(jìn)制”表示數(shù)據(jù)。

2個(gè)數(shù)字符號(hào):0,1;

“逢二進(jìn)一”:用“進(jìn)位”的方法表示大于1的數(shù);

“權(quán)展開(kāi)式”:

小數(shù)點(diǎn)向左各數(shù)字的“權(quán)”是20,21,22,23,……。

小數(shù)點(diǎn)向右各數(shù)字的“權(quán)”是2-1,2-2,2-3,……。

二進(jìn)制數(shù)需要在數(shù)字的后面加上字母B。例:10110111B2.

二進(jìn)制計(jì)數(shù)法

十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)二進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù)(11011.101)2=1×24+1×23+0×22+1×21+ 1×20+1×2-1+0×2-2+1×2-3=(27.625)10

3.

八進(jìn)制和十六進(jìn)制計(jì)數(shù)法八進(jìn)制:八進(jìn)制使用的數(shù)字符號(hào):0,1,2,3,4,5,6,7。一位8進(jìn)制數(shù)可以方便地轉(zhuǎn)換成3位二進(jìn)制數(shù)

(1101100.0101)2 =(1

101

100.010

1)2

=(001

101

100.010

100)2 =(154.24)8十六進(jìn)制十六進(jìn)制使用的數(shù)字符號(hào):0~9,A~F。書(shū)寫(xiě)十六進(jìn)制數(shù)時(shí),在它各位數(shù)字的后面加上“H”。如果十六進(jìn)制數(shù)以字母A~F開(kāi)始,還要在前面添加0。 例:3AFH,0FF3DH一位十六進(jìn)制數(shù)可以方便地轉(zhuǎn)換成4位二進(jìn)制數(shù)(1101100.0101)2 =(110

1100.0101)2 =(0110

1100.0101)2 =(6C.5)163.1數(shù)據(jù)定義與傳送

3.1.1計(jì)算機(jī)內(nèi)數(shù)據(jù)的表示

3.1.2數(shù)據(jù)的定義

3.1.3數(shù)據(jù)的傳送

3.1.4簡(jiǎn)化段格式數(shù)據(jù)組織無(wú)符號(hào)數(shù)的表示有符號(hào)數(shù)的表示字符編碼BCD碼3.1.1

計(jì)算機(jī)內(nèi)的數(shù)據(jù)表示數(shù)據(jù)組織計(jì)算機(jī)內(nèi)的信息按一定的規(guī)則組織存放。(1)位(bit)--最小信息表示單位(2)字節(jié)(Byte)--最小信息存儲(chǔ)單位(3)字(Word)和雙字(DoubleWord)無(wú)符號(hào)數(shù)的表示

用字節(jié)、字、雙字或者更多的字節(jié)來(lái)存儲(chǔ)和表示。用N位二進(jìn)制表示一個(gè)無(wú)符號(hào)數(shù)時(shí),最小的數(shù)是0,最大的數(shù)是2N-1(N位二進(jìn)制111……111)。無(wú)符號(hào)數(shù)需要增加它的位數(shù)時(shí),在它的左側(cè)添加若干個(gè)“0”,稱為“零擴(kuò)展”?!斑M(jìn)位標(biāo)志(CarryoutFlag,CF)”表示二個(gè)無(wú)符號(hào)數(shù)運(yùn)算結(jié)果的特征。如果CF=1,表示它們的加法有“進(jìn)位”,或者它們的減法有“借位”。CF=0,則沒(méi)有產(chǎn)生進(jìn)位或借位。-----正數(shù)和零的集合有符號(hào)數(shù)的表示(1)原碼最左邊一位二進(jìn)制表示這個(gè)數(shù)的符號(hào):“0”代表正,“1”代表負(fù)

后面是它的“有效數(shù)字”一個(gè)字節(jié)存儲(chǔ)有符號(hào)數(shù)原碼,有127個(gè)正數(shù)(1~127),127個(gè)負(fù)數(shù)(-1~-127)和2個(gè)“0”,“正”0:00000000,“負(fù)”0:10000000。原碼的表示規(guī)則簡(jiǎn)單,但是運(yùn)算規(guī)則比較復(fù)雜,不利于計(jì)算機(jī)高速運(yùn)算的實(shí)現(xiàn)。---原碼、補(bǔ)碼(2)補(bǔ)碼

用最高有效位(MSB)表示一個(gè)有符號(hào)數(shù)的符號(hào):

“1”表示負(fù),“0”表示正。其他二進(jìn)制位用來(lái)存儲(chǔ)這個(gè)數(shù)的有效數(shù)字:

正數(shù)的有效數(shù)字不變,負(fù)數(shù)的有效數(shù)字取反后最低位加1。用字節(jié)存儲(chǔ)一個(gè)有符號(hào)數(shù)時(shí),對(duì)于正數(shù)X=dn-2dn-3……d2d1d0,

[X]補(bǔ)

=X=0dn-2dn-3……d2d1d0。對(duì)于負(fù)數(shù)Y=-dn-2…d1d0,

[Y]補(bǔ)

=1(dn-2…d1d0)#+1=1111…111-|Y|+1

=2n-|Y|=2n+Y。一字節(jié)存儲(chǔ)有符號(hào)數(shù)補(bǔ)碼時(shí),有127個(gè)正數(shù)(1~127),

128個(gè)負(fù)數(shù)(-1~-128),1個(gè)“0”(00000000)。

其中,[-1]補(bǔ)=11111111,[-128]補(bǔ)=10000000。把一個(gè)數(shù)補(bǔ)碼的所有位(包括符號(hào)位)“取反加1”,得到這

個(gè)數(shù)相反數(shù)的補(bǔ)碼。稱為“求補(bǔ)”,[[X]補(bǔ)]求補(bǔ)=[-X]補(bǔ)。已知一個(gè)負(fù)數(shù)的補(bǔ)碼,求這個(gè)數(shù)自身(真值)時(shí),可以先求出這個(gè)數(shù)相反數(shù)的補(bǔ)碼。[例]:已知[X]補(bǔ)=10101110,求X的值:

[-X]補(bǔ)=[[X]補(bǔ)]求補(bǔ)=[10101110]求補(bǔ)=01010001+1=01010010

于是,-X=[+1010010]2=+82

于是,X=-82

真值(十進(jìn)制)二進(jìn)制表示原碼反碼補(bǔ)碼+127+1111111011111110111111101111111+1+0000001000000010000000100000001+0+0000000000000000000000000000000-0-0000000100000001111111100000000-1-0000001100000011111111011111111-2-0000010100000101111110111111110-127-1111111111111111000000010000001-128-10000000無(wú)無(wú)10000000部分?jǐn)?shù)的8位二進(jìn)制原碼、反碼和補(bǔ)碼一個(gè)補(bǔ)碼需要增加它的位數(shù)時(shí),對(duì)于正數(shù),需要在它的左側(cè)添加若干個(gè)“0”,對(duì)于負(fù)數(shù),需要在它的左側(cè)添加若干個(gè)“1”,

用它的符號(hào)位來(lái)填充增加的“高位”,稱為“符號(hào)擴(kuò)展”。(4)補(bǔ)碼的擴(kuò)展[例]:

[-5]補(bǔ)

=11111011(8位)=1111111111111011(16位)

[+5]補(bǔ)

=00000101(8位)=0000000000000101(16位)補(bǔ)碼的運(yùn)算遵循以下規(guī)則:

[X+Y]補(bǔ)=[X]補(bǔ)+[Y]補(bǔ)

[X-Y]補(bǔ)=[X]補(bǔ)+[-Y]補(bǔ)“溢出標(biāo)志(OverflowFlag,OF)”表示有符號(hào)數(shù)運(yùn)算特征。

OF=1,表示運(yùn)算結(jié)果超過(guò)了表示范圍,稱為“溢出”,

OF=0,沒(méi)有產(chǎn)生溢出。計(jì)算機(jī)自身用“雙進(jìn)位法”判斷是否產(chǎn)生“溢出”:

補(bǔ)碼最左邊2個(gè)位上的進(jìn)位相等,沒(méi)有溢出,反之有溢出。(5)補(bǔ)碼的運(yùn)算同號(hào)數(shù)和異號(hào)數(shù)相加使用相同的規(guī)則;有符號(hào)數(shù)和無(wú)符號(hào)數(shù)加法使用相同的規(guī)則減法可以用加法實(shí)現(xiàn)(對(duì)于電子計(jì)算機(jī)內(nèi)的開(kāi)關(guān)電路,

求補(bǔ)是十分容易實(shí)現(xiàn)的)補(bǔ)碼運(yùn)算規(guī)則的優(yōu)點(diǎn):上述特性可以用來(lái)簡(jiǎn)化運(yùn)算器電路,簡(jiǎn)化指令系統(tǒng)計(jì)算機(jī)內(nèi)的有符號(hào)數(shù)一般都用補(bǔ)碼表示,除非特別說(shuō)明?!癆SCII(AmericanStandardCodeforInformationInterchange,美國(guó)信息交換標(biāo)準(zhǔn)編碼)”。7位二進(jìn)制表示一個(gè)字母、數(shù)字或符號(hào),包含128個(gè)不同的編碼。一個(gè)字符的ASCII碼占用一個(gè)字節(jié),低7位是它的ASCII碼,最高位置“0”,或者用作“校驗(yàn)位”。字符編碼ASCII編碼的前32個(gè)(編碼00H~1FH)用來(lái)表示“控制字符”,例如CR(“回車”,編碼0DH),LF(“換行”,編碼0AH)。ASCII編碼30H~39H用來(lái)表示數(shù)字字符“0”~“9”。它們的高3位為011,低4位就是這個(gè)數(shù)字字符對(duì)應(yīng)的二進(jìn)制表示。ASCII編碼41H~5AH用來(lái)表示大寫(xiě)字母“A”~“Z”,它們的高2位為01。ASCII編碼61H~7AH用來(lái)表示小寫(xiě)字母“a”~“z”,它們的高2位為10。小寫(xiě)字母的編碼比對(duì)應(yīng)的大寫(xiě)字母編碼大20H。用一組四位二進(jìn)制來(lái)表述一位十進(jìn)制數(shù),組間仍然按照“逢十進(jìn)一”的規(guī)則進(jìn)行,稱為“BCD碼(BinaryCodedDecimal)”。壓縮的BCD碼用一個(gè)字節(jié)存儲(chǔ)2位十進(jìn)制數(shù),高4位二進(jìn)制表示高位十進(jìn)制數(shù),低4位二進(jìn)制表示低位十進(jìn)制數(shù)??梢杂孟嗤瑪?shù)字的十六進(jìn)制數(shù)表述。非壓縮的BCD碼用一個(gè)字節(jié)存儲(chǔ)1位十進(jìn)制數(shù),低4位二進(jìn)制表示該位十進(jìn)制數(shù),對(duì)高4位的內(nèi)容不作規(guī)定。BCD碼十進(jìn)制數(shù)25的壓縮BCD碼用25H表示。數(shù)字字符‘7’的ASCII碼37H就是數(shù)7的非壓縮BCD碼

41H: 有符號(hào)數(shù)+65的補(bǔ)碼 無(wú)符號(hào)數(shù)65

大寫(xiě)字母‘A’的ASCII碼

十進(jìn)制數(shù)41D的壓縮BCD碼計(jì)算機(jī)內(nèi)的一組二進(jìn)制編碼和它們的“原型”之間存在著

“一對(duì)多”的關(guān)系:知情者:定義、使用該數(shù)據(jù)的程序員數(shù)據(jù)段數(shù)據(jù)定義3.1.2

數(shù)據(jù)的定義數(shù)據(jù)段DATA SEGMENT

;在這里定義數(shù)據(jù);;……DATA ENDS

DATA: 程序員給這個(gè)段起的名字。

SEGMENT:保留字,說(shuō)明一個(gè)段從這里開(kāi)始。

ENDS: 保留字,說(shuō)明一個(gè)段到此結(jié)束。

; 分號(hào)后面的文字是“注釋”,不參加匯編數(shù)據(jù)定義數(shù)據(jù)定義偽指令:[變量名]數(shù)據(jù)定義偽操作數(shù)據(jù)[,數(shù)據(jù)]……數(shù)據(jù)定義偽操作:

DB(DefineByte):每個(gè)數(shù)據(jù)占用一個(gè)字節(jié)(8b)

DW(DefineWord):每個(gè)數(shù)據(jù)占用一個(gè)字(16b)

DD(DefineDoubleWord):每個(gè)數(shù)據(jù)占用一個(gè)雙字(32b)DQ(DefineQuartWord):每個(gè)數(shù)據(jù)占用8個(gè)字節(jié)(64b)DT(DefineTenByte):每個(gè)數(shù)據(jù)占用10個(gè)字節(jié)(80b)DATA SEGMENTX db -1,255,‘A’,3+2,? db ‘ABC’,0FFH,11001010BY db 3dup(?)DATA ENDS數(shù)據(jù)定義舉例(1):有符號(hào)數(shù)用它的補(bǔ)碼存儲(chǔ)字符用它的ASCII代碼存儲(chǔ)

db定義的數(shù)據(jù)在[-128~255]之內(nèi)變量名代表這個(gè)單元的地址

?表示一個(gè)尚未確定的值,用0先行填充

DUP表示重復(fù)定義DSEG SEGMENTZ DW-2,-32768,65535,‘AB’W DD12345678H,-400000 DWZ,W-ZDSEG ENDS數(shù)據(jù)定義舉例(2):

DW定義的數(shù)據(jù)在(-32768,+65535)內(nèi)出現(xiàn)在數(shù)據(jù)部分的變量名代表這個(gè)變量的偏

移地址多字節(jié)數(shù)據(jù)的高位存放在較高地址單元中變量X,Y,Z,W的屬性變量名段屬性SEG偏移地址OFFSET類型TYPE長(zhǎng)度LENGTH大小SIZEXDATA0000H111YDATA000AH133ZDSEG0000H212WDSEG0008H2123.1.3數(shù)據(jù)的傳送

指令格式

程序段

基本傳送指令

其他傳送指令

堆棧

操作數(shù)表達(dá)式匯編語(yǔ)言程序由若干“語(yǔ)句”組成,每個(gè)“語(yǔ)句”占用一行。三種類型語(yǔ)句:指令語(yǔ)句:包含一條符號(hào)指令,與一條機(jī)器指令相對(duì)應(yīng),

匯編以后成為這條機(jī)器指令的二進(jìn)制代碼,這

個(gè)代碼被稱為“目標(biāo)(Object)”;偽指令語(yǔ)句:一條說(shuō)明性的語(yǔ)句。有的偽指令語(yǔ)句匯編后

沒(méi)有“結(jié)果”,有的偽指令匯編后產(chǎn)生“目標(biāo)”。注釋行:書(shū)寫(xiě)說(shuō)明性文字,不進(jìn)行“匯編”,也不產(chǎn)生

“目標(biāo)”。指令格式(1)

8086指令格式[標(biāo)號(hào):]

程序員給這一行起的名字,后面跟上冒號(hào),代表這一行的地址。標(biāo)號(hào)用字母開(kāi)始,不要使用保留字作為標(biāo)號(hào)。操作碼是這條指令需要完成的操作,用指令助記符表示。[操作數(shù)]

是指令的操作對(duì)象,指令的操作數(shù)可以有0~3個(gè)。兩個(gè)操作數(shù)時(shí),右面的操作數(shù)稱為“源操作數(shù)”,左面的操作數(shù)稱為“目的操作數(shù)”。[;注釋]

用來(lái)添加一些說(shuō)明,例如說(shuō)明本行指令的功能。[標(biāo)號(hào):]操作碼

[操作數(shù)][;注釋](2)

操作數(shù)寄存器操作數(shù):包括段寄存器,通用數(shù)據(jù)、地址寄存器。例如:

MOV BX,AX功能:AX寄存器內(nèi)容送入BX寄存器。

AX是“源操作數(shù)”,寫(xiě)在右邊,指令執(zhí)行后,它的

內(nèi)容不會(huì)被改變。

BX是“目的操作數(shù)”,寫(xiě)在左邊,指令執(zhí)行后,它的

內(nèi)容將被改變。注意:寄存器IP和FLAGS不能作為操作數(shù)出現(xiàn)在指令中。立即數(shù)操作數(shù):二進(jìn)制/十進(jìn)制/十六進(jìn)制常數(shù),可求值的表

達(dá)式,字符,標(biāo)號(hào)等都可以用作操作數(shù)。假設(shè)已經(jīng)定義:X DW 150指令“MOV BX,X*2”是錯(cuò)誤的,“變量”的計(jì)算應(yīng)該在用戶程序執(zhí)行時(shí)進(jìn)行,“匯編程序”不能對(duì)“變量”進(jìn)行計(jì)算。常數(shù)300送入BX寄存器

MOV BX,300或者:MOV BX,150*2DATA段的段基址送DS MOV AX,DATA MOV DS,AX注意:立即數(shù)不能用作“目的操作數(shù)”。為了對(duì)存儲(chǔ)器的一個(gè)單元進(jìn)行訪問(wèn),需要給出這個(gè)單元的段基址和偏移地址。大多數(shù)情況下,指令使用DS寄存器的內(nèi)容作為操作數(shù)的段基址,指令中不需要再指出段基址。(3)

存儲(chǔ)器操作數(shù)指出偏移地址的方法有兩種:直接的和間接的。常常在程序開(kāi)始處把數(shù)據(jù)段的段基址裝入DS寄存器:

MOV AX,DATA MOV DS,AX直接(偏移)地址:在指令里直接寫(xiě)出存儲(chǔ)單元的偏移地址。DATA SEGMENTA DB 12,34,56ARRAYDW55,66,77,88,99DATA ENDS假設(shè)已把DATA代表的段基址裝入DS把變量(數(shù)組)A的前兩個(gè)數(shù)據(jù)送BL,BH寄存器:

MOVBL,A ;也可以寫(xiě)作MOVBL,[A]MOVBH,A+1;或MOVBH,[A+1],MOVBH,A[1]A代表數(shù)據(jù)“12”的偏移地址,A+1是數(shù)據(jù)“34”的偏移地址。錯(cuò)誤!MOVBX,A ;把變量[A]送BL,變量[A+1]送BH直接(偏移)地址:在指令里直接寫(xiě)出存儲(chǔ)單元的偏移地址。DATA SEGMENTA DB 12,34,56ARRAYDW55,66,77,88,99DATA ENDS假設(shè)已把DATA代表的段基址裝入DS,并且知道A的偏移地址是0000H,前面的指令可以寫(xiě)作:

MOVBL,[0000H];方括號(hào)不能省略

MOVBH,[0001H];方括號(hào)不能省略常數(shù)地址格式一般沒(méi)有實(shí)用價(jià)值。上面的兩條指令可以用一條指令代替,效果相同:MOVBX,[0000H];取地址0000H開(kāi)始的兩字節(jié),送入BL和BH間接(偏移)地址:把存儲(chǔ)單元的偏移地址先裝入某個(gè)寄存器,通過(guò)這個(gè)寄存器來(lái)找到這個(gè)存儲(chǔ)單元,稱為“寄存器間接尋址”。已經(jīng)定義:ADB12,34MOV SI,OFFSETA;把變量A的偏移地址裝入SI ;OFFSET是保留字,表示取出后面變量的偏移地址MOV BL,[SI] ;變量A的第一個(gè)值送BLMOV BH,[SI+1] ;第二個(gè)值送BH,等同于MOVBH,1[SI] 16位8086微處理器只有BX,BP,SI,DI這4個(gè)寄存器可以用來(lái)“間接尋址”。不另加說(shuō)明的話,使用BP時(shí)自動(dòng)用SS的值作為段基址,使用BX,SI,DI時(shí)自動(dòng)用DS的值作為段基址。已經(jīng)定義:ARRAY DW35,73,27,780,12,55

取出字?jǐn)?shù)組ARRAY的第3個(gè)元素送入AX:;方法1MOVAX,ARRAY[4]

;ARRAY代表數(shù)組首地址,位移量=4,直接尋址;也可以寫(xiě)作“MOVAX,ARRAY+4”;方法2MOVBX,OFFSETARRAY;數(shù)組首地址裝入BXMOVAX,[BX+4];第3個(gè)元素距數(shù)組首元素4個(gè)字節(jié);方法3MOVBX,4 ;第3個(gè)元素距數(shù)組首地址的位移量裝入BXMOVAX,ARRAY[BX]

;ARRAY代表數(shù)組首地址,BX中是位移量基址變址與相對(duì)尋址:用兩個(gè)寄存器聯(lián)合起來(lái)尋址。從(BX,BP)和(SI,DI)中

各選出一個(gè)使用。出現(xiàn)BP時(shí)使用SS作為段基址寄存器,其它情況用DS。MOVAX,ARRAY[4] ;直接尋址,偏移地址=ARRAY+4MOVAX,[BX] ;寄存器間接尋址MOVAX,[BX+2] ;寄存器相對(duì)尋址 ;BX中存放首地址,位移量2MOVAX,ARRAY[BX];寄存器相對(duì)尋址 ;ARRAY為首地址,BX中存放位移量MOVAX,[BX+SI] ;基址(BX)變址(SI)尋址MOVAX,[BX+DI+2] ;相對(duì)基址變址尋址程序段假設(shè)已定義數(shù)據(jù)段為“DATA”,程序段常見(jiàn)格式:CODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX ;其他指令

MOV AX,4C00H INT 21HCODE ENDS END START“ASSUME”偽指令用來(lái)指定段和段寄存器之間的對(duì)應(yīng)關(guān)系,供匯編程序使用。DATA SEGMENT A DB 55DATA ENDSDSEG SEGMENT X DB 10DSEG ENDSASSUMEDS:DATA,ES:DSEG MOV AX,DATA MOV DS,AX MOV AX,DSEG MOV ES,AX設(shè)變量A和X的偏移地址都是0000H。指令MOVAL,A自動(dòng)按照MOVAL,DS:[0000H]的格式

匯編,執(zhí)行后(AL)=55,結(jié)果正確。指令MOVDL,X自動(dòng)按照MOVDL,ES:[0000H]的格式

匯編,執(zhí)行后(DL)=10,結(jié)果正確。MOVSI,OFFSETA;A的偏移地址裝入SIMOVDI,OFFSETX;X的偏移地址裝入DIMOVAL,[SI] ;取A的值送ALMOVDL,[DI] ;取X的值送DL執(zhí)行的結(jié)果:(AL)=55正確,(DL)=55 錯(cuò)誤。為了得到正確結(jié)果,上面第4條指令改寫(xiě)為:MOV DL,ES:[DI] ;執(zhí)行后(DL)=10,結(jié)果正確這條指令“顯式”地指定了段基址,匯編出來(lái)的機(jī)器指令比MOVDL,[DI]多一個(gè)字節(jié),稱為“段跨越前綴”?!癝TART”是第一條指令的“標(biāo)號(hào)”。標(biāo)號(hào)出現(xiàn)在指令行前面,標(biāo)號(hào)與指令之間用冒號(hào)“:”分開(kāi)。本程序的執(zhí)行從標(biāo)有“START”的第一條指令開(kāi)始,它的地址稱為這個(gè)程序的“入口地址”。指令“INT21H”表示調(diào)用由操作系統(tǒng)提供的21H號(hào)服務(wù)程序。AH中為“功能號(hào)”,AH=4CH表示返回操作系統(tǒng)的操作。AL中的代碼稱為“返回代碼”,00H表示“正常返回”?;緜魉椭噶頜OV指令的一般格式:

(1)MOV(Move,傳送)指令MOV指令把源操作數(shù)(source)傳送到目的操作數(shù)(destination)MOV dest,src設(shè)指令執(zhí)行前,(AX)=2345H,(BX)=1111H。

指令“MOVAX,BX”執(zhí)行后,(AX)=1111H,(BX)=1111H。源操作數(shù)BX的內(nèi)容被復(fù)制到AX寄存器內(nèi),源操作數(shù)BX的內(nèi)容保持不變,目的操作數(shù)AX的原內(nèi)容被覆蓋。源操作數(shù)可以是:寄存器、存儲(chǔ)器、立即數(shù);目的操作數(shù)可以是:寄存器、存儲(chǔ)器。MOV指令的使用限制:源操作數(shù)與目的操作數(shù)可以是字節(jié)、字或雙字,但必須有

相同的類型;源操作數(shù)與目的操作數(shù)不能同時(shí)為存儲(chǔ)器操作數(shù);目的操作數(shù)不能是立即數(shù);

FLAGS、IP不能用作操作數(shù)。對(duì)于段寄存器作為操作數(shù)的MOV指令:

源操作數(shù)與目的操作數(shù)不能同時(shí)為段寄存器;目的操作數(shù)是段寄存器時(shí),源操作數(shù)只能是寄存器或存儲(chǔ)

器,不能是立即數(shù);

CS不能用作目的操作數(shù)。MOV CL,DH ;字節(jié)傳送指令,DH寄存器內(nèi)容送入CLMOV AX,CS ;字傳送指令,CS寄存器內(nèi)容送入AXMOV SS,CX ;字傳送指令,CX寄存器內(nèi)容送入SSMOV指令舉例(寄存器、寄存器操作數(shù)):正確:錯(cuò)誤:MOV CL,DX ;操作數(shù)類型不匹配MOV CS,AX ;CS寄存器不能作為目的操作數(shù)MOV DS,CS ;不能同時(shí)為段寄存器MOV AL,30H ;字節(jié)傳送指令,執(zhí)行后(AL)=30HMOV AX,30H ;字傳送指令,執(zhí)行后(AX)=0030HMOV AL,-5 ;字節(jié)傳送指令,執(zhí)行后(AL)=0FBHMOV AX,-5 ;字傳送指令,執(zhí)行后(AX)=0FFFBHMOV指令舉例(立即數(shù)、寄存器操作數(shù)):正確:錯(cuò)誤:MOV 30H,AL ;立即數(shù)不能用作目的操作數(shù)MOV AL,300 ;源操作數(shù)超出范圍MOV指令舉例(存儲(chǔ)器、寄存器操作數(shù)):正確:錯(cuò)誤:MOV [BP],BL ;字節(jié)傳送指令,BL寄存器內(nèi)容送SS:[BP]MOV [BX],AX ;字傳送指令,AL內(nèi)容送DS:[BX],

;AH內(nèi)容送DS:[BX+1]MOV DX,[SI] ;字傳送指令,DS:[SI]內(nèi)容送入DL, ;DS:[SI+1]內(nèi)容送入DH假設(shè)變量X_BYTE用DB定義MOV [DX],BL ;DX寄存器不能用來(lái)寄存器間接尋址MOVX_BYTE,AX ;操作數(shù)類型不匹配MOV指令舉例(存儲(chǔ)器、立即數(shù)操作數(shù)):正確:錯(cuò)誤:MOV X_BYTE,-5 ;字節(jié)傳送指令,-5(0FBH)送X_BYTEMOV Y_WORD,-5 ;字傳送指令,-5(0FFFBH)送Y_WORD假設(shè)變量X_BYTE用DB定義,變量Y_WORD用DW定義MOV X_BYTE,300 ;源操作數(shù)超出范圍MOV [BX],30H ;操作數(shù)類型不能確定錯(cuò)誤:MOV X_BYTE,[SI] ;不能同時(shí)為存儲(chǔ)器操作數(shù)MOV X_BYTE,K_BYTE ;不能同時(shí)為存儲(chǔ)器操作數(shù)MOV SS,DS ;不能同時(shí)為段寄存器操作數(shù)兩個(gè)操作數(shù)不能同時(shí)為存儲(chǔ)器操作數(shù)或段寄存器!MOV BYTEPTR[BX],20H ;1B立即數(shù)20H送DS:[BX]MOV WORDPTR[BX],20H ;立即數(shù)20H送DS:[BX],

;00H送DS:[BX+1]MOV DWORDPTR[BX],20H ;4B立即數(shù)0000

0020H送

;DS:[BX]開(kāi)始4個(gè)字節(jié)MOV BYTEPTR[Y_WORD],20H;立即數(shù)20H送變量

;Y_WORD的第一字節(jié)MOV AL,BYTEPTR[Y_WORD];變量Y_WORD的第一字節(jié)

;送AL寄存器MOV WORDPTR[X_BYTE],20H;2B立即數(shù)0020H送變量

;X_BYTE開(kāi)始的2字節(jié)可以用“類型PTR”指定,或強(qiáng)行改變操作數(shù)的類型:LEA把源操作數(shù)的偏移地址裝入目的操作數(shù)。它的一般格式:

LEAREG16,MEMREG16表示一個(gè)16b通用寄存器,MEM是一個(gè)存儲(chǔ)器操作數(shù)。上面指令把存儲(chǔ)器操作數(shù)的偏移地址存入指定的16位寄存器。(2)

LEA(LoadEffectiveAddress,裝載有效地址)指令假設(shè)變量X的偏移地址為048CH,(BP)=1820H,(SI)=0068H,

LEADX,X ;執(zhí)行后,(DX)=048CHLEABX,4[BP][SI] ;執(zhí)行后,(BX)=4+1820H+0068H

=188CH上面第一條指令等效于MOVDX,OFFSETX,但是它們是兩條不同的指令。[例3-1]編寫(xiě)程序,把4個(gè)元素的字節(jié)數(shù)組ARRAY清0。DATA SEGMENTARRAY DB 4DUP(0)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV ARRAY,0 ;第一個(gè)元素清零

MOV ARRAY+1,0 ;第二個(gè)元素清零

MOV ARRAY+2,0 ;第三個(gè)元素清零

MOV ARRAY+3,0 ;第四個(gè)元素清零

MOV AX,4C00H INT 21HCODE ENDS END STARTMOVAX,0LEABX,ARRAY ;數(shù)組ARRAY首地址裝入BXMOVWORDPTR[BX],AX;第一、第二個(gè)元素清零MOVWORDPTR[BX+2],AX;第三、第四個(gè)元素清零一次將兩個(gè)元素同時(shí)清零:MOVWORDPTRARRAY,0 ;第一、第二個(gè)元素清零MOVWORDPTRARRAY+2,0 ;第三、第四個(gè)元素清零使用立即數(shù)指令代碼較長(zhǎng)。把這個(gè)立即數(shù)事先存放在寄存器中:MOVAX,0MOVWORDPTRARRAY,AX ;第一、第二個(gè)元素清零MOVWORDPTRARRAY+2,AX;第三、第四個(gè)元素清零把數(shù)組ARRAY的首地址事先裝入地址寄存器,程序更簡(jiǎn)捷:其他傳送指令(1)

地址傳送指令LDS,LES[例]指令LDSSI,[BX]從DS:[BX]處取出32位二進(jìn)制,兩個(gè)低地址字節(jié)送入SI,兩個(gè)高地址字節(jié)送入DS寄存器。指令執(zhí)行后DS寄存器的內(nèi)容被刷新。這些指令不影響標(biāo)志位。地址傳送指令從存儲(chǔ)器取出4B,前面的2B送入指定的寄存器,

后面的2B送入由指令操作碼包含的段寄存器。LDS REG16,MEM32;從存儲(chǔ)器取出4B,送入REG16和DSLES REG16,MEM32;從存儲(chǔ)器取出4B,送入REG16和ESCBW ;將AL寄存器內(nèi)容符號(hào)擴(kuò)展成16b,送入AXCWD ;將AX寄存器內(nèi)容符號(hào)擴(kuò)展成32b,送入DX(高位)和AX(2)

擴(kuò)展傳送指令CBW,CWD擴(kuò)展傳送指令把8位的操作數(shù)擴(kuò)展為16位,或者把16位的操作數(shù)擴(kuò)展為32位,送入目的寄存器。設(shè)有(AX)=8060HCBW;(AX)=0060HCWD;(DX)=0FFFFH,(AX)=8060H(3)

交換指令XCHGXCHG REG/MEM,REG/MEM交換源、目的操作數(shù)的內(nèi)容,兩個(gè)操作數(shù)有相同的類型,不能同時(shí)為存儲(chǔ)器操作數(shù)。

例如,(AX)=5678HXCHG AH,AL ;(AX)=7856H(4)

換碼指令XLATXLAT MEM16

以MEM16對(duì)應(yīng)段寄存器為段基址,以BX為偏移地址查表XLAT ;AL←DS:[BX+AL]用AL寄存器的內(nèi)容查表,結(jié)果存回AL寄存器。表格的首地址事先存放在DS:BX中。TABLE DB “0123456789ABCDEF” ……PUSH DS ;保護(hù)DS寄存器內(nèi)容MOV BX,SEGTABLE ;取TABLE所在的段基址送BXMOV DS,BX ;從BX轉(zhuǎn)送入DSLEA BX,TABLE ;取TABLE的偏移地址MOVAL,00001011BXLAT ;查表,(AL)=01000010B(’B’)POP DS ;恢復(fù)DS寄存器內(nèi)容設(shè)(AL)=00001011B,下面程序執(zhí)行后,AL中的二進(jìn)制數(shù)改變?yōu)閷?duì)應(yīng)的十六進(jìn)制數(shù)字符的ASCII代碼01000010(’B’)。堆棧堆棧(STACK)是用戶使用的存儲(chǔ)器的一部分,用來(lái)存放臨時(shí)性的數(shù)據(jù)和其他信息,例如函數(shù)使用的局部變量、調(diào)用子程序的入口參數(shù)、返回地址等。堆棧的段基址必須放在SS中。堆棧段的“棧頂”地址(偏移地址)放在SP寄存器中。在SEGMENT偽指令中增加“STACK”表示該段是“堆?!?。這個(gè)程序裝入時(shí),操作系統(tǒng)把SSEG的段基址置入SS,堆棧段的字節(jié)數(shù)(“棧底”位置,本例中為12=0CH)置入SP。(1)堆棧段結(jié)構(gòu)

SSEGSEGMENTSTACK ;堆棧段開(kāi)始

DW 6DUP(?) ;大小為6個(gè)字

SSEGENDS ;堆棧段結(jié)束堆棧段的定義:從較大地址開(kāi)始分配和使用(數(shù)據(jù)段、代碼段從較小地址開(kāi)

始分配和使用);由SP中地址指出的存儲(chǔ)單元稱為“棧頂”,數(shù)據(jù)總是在“棧頂”

位置存入(稱為“壓入”)、取出(稱為“彈出”);最先進(jìn)入的數(shù)據(jù)最后被彈出(FirstInLastOut,FILO),

最后進(jìn)入的數(shù)據(jù)最先被彈出(LastInFirstOut,LIFO)堆棧段的特點(diǎn):壓入2B數(shù)據(jù)的操作

SP←(SP)-2SS:[SP]←數(shù)據(jù)

彈出2B數(shù)據(jù)的操作目的操作數(shù)←SS:[SP]SP←(SP)+2(2)8086CPU堆棧指令PUSH(壓棧)指令:把16b操作數(shù)壓入堆棧

PUSHREG16/MEM16/SEG指令的操作數(shù)是16b的寄存器、存儲(chǔ)器、段寄存器。指令執(zhí)行后,操作數(shù)的內(nèi)容不變。指令的操作數(shù)是16b的寄存器、存儲(chǔ)器、段寄存器(CS除外)。指令執(zhí)行后,操作數(shù)的內(nèi)容被更新。把CS寄存器內(nèi)容存入DS:POP(出棧)指令:從堆棧中彈出16b存入操作數(shù)

POPREG16/MEM16/SEGPUSH CSPOP DSPUSHFPOP AX ;AX←FlagsOR AX,0100H;將b8(TF位)置1PUSH AXPOPF ;Flags←AX

PUSHF指令把FLAGS寄存器內(nèi)容壓入堆棧。

PUSHFPOPF指令從堆棧彈出16b送入FLAGS寄存器,指令執(zhí)行后,各標(biāo)志位被刷新。POPF下面程序段把TF標(biāo)志位置位(置1):LAHF指令把FLAGS寄存器的低8位送入AH寄存器LAHFSAHF指令把AH寄存器內(nèi)容送入FLAGS寄存器的低8位,它的執(zhí)行刷新了SF,ZF,AF,PF,CF標(biāo)志位。SAHF操作數(shù)表達(dá)式指令中的操作數(shù),包括立即數(shù)和存儲(chǔ)器操作數(shù)都可以用一個(gè)表達(dá)式來(lái)代替,這個(gè)表達(dá)式在匯編成目標(biāo)的時(shí)候進(jìn)行計(jì)算,它的結(jié)果用來(lái)產(chǎn)生目標(biāo)代碼。設(shè)字節(jié)變量X的偏移地址為1020HMOV AL,XMOV AL,[1020H]MOV AL,X+5MOV AL,[1025H]匯編時(shí),對(duì)EQU定義的符號(hào)名用對(duì)應(yīng)的表達(dá)式進(jìn)行“替換”。例如,有以下定義:(1)

符號(hào)定義偽指令符號(hào)名 EQU 表達(dá)式NUM EQU 215MOD15ERR_MSG EQU “DataOverride”這些符號(hào)名使用的例子:MESSAGE DB ERR_MSG

;等價(jià)于MESSAGEDB“DataOverride”MOV CX,NUM+1

;等價(jià)于MOV CX,215MOD15+1POINTER EQU BUFFER[DI]WT EQU WORDPTRMOV BX,POINTER

;等價(jià)于MOVBX,BUFFER[DI]MOV WTPOINTER,0

;等價(jià)于MOVWORDPTRBUFFER[DI],0有以下定義:這些符號(hào)名使用的例子:

TIMES=0……TIMES=TIMES+1…… 使用“=”定義符號(hào)名時(shí),只能使用常數(shù)表達(dá)式,而且對(duì)一個(gè)符號(hào)名可以多次定義。一個(gè)新的定義出現(xiàn)后,原來(lái)的定義自動(dòng)終止。用EQU定義的符號(hào)名不允許重復(fù)定義?!癧

]”稱為“索引運(yùn)算符”,用來(lái)括起組成有效地址的一個(gè)分量,各分量相加,得到最后的有效地址。(2)

地址表達(dá)式+,-運(yùn)算符對(duì)構(gòu)成有效地址的各個(gè)分量進(jìn)行“加”、“減”操作。設(shè)變量X的偏移地址為1020H,存儲(chǔ)器操作數(shù)X+5產(chǎn)生EA=1025H指令“MOV BL,X-10H”產(chǎn)生EA=1010H。MOV AX,2[BX][DI]MOV AX,[BX+DI+2]MOV AX,BUFFER[BX][2]MOV AX,[BUFFER+BX+2](3)

立即數(shù)表達(dá)式立即數(shù)表達(dá)式在匯編源程序時(shí)進(jìn)行計(jì)算,它的結(jié)果用作指令中的立即數(shù)操作數(shù)。這種表達(dá)式中的運(yùn)算對(duì)象必須是“已知”的,否則無(wú)法進(jìn)行計(jì)算。用于產(chǎn)生立即數(shù)操作數(shù)的表達(dá)式有4類運(yùn)算符: 算術(shù)運(yùn)算符、邏輯運(yùn)算符、關(guān)系運(yùn)算符、地址運(yùn)算符。算術(shù)運(yùn)算符算術(shù)運(yùn)算符+(相加),-(相減),*(相乘),/(整除運(yùn)算),MOD(取余數(shù))(*,/)→(MOD)→(+,-)運(yùn)算優(yōu)先級(jí)從高到低依次為可以使用圓括號(hào)改變運(yùn)算順序MOV BX,32+13/6MOD332+((13/6)MOD3)MOVBX,0022H34=22H邏輯運(yùn)算符(SHL、SHR)→(NOT)→(AND)→(OR、XOR)30SHR1

15運(yùn)算優(yōu)先級(jí)從高到低依次為SHR(右移)、SHL(左移)、AND(邏輯與)OR(邏輯加)XOR(異或,半加)、NOT(邏輯非、取反)可以使用圓括號(hào)改變運(yùn)算順序關(guān)系運(yùn)算符GT(大于)、GE(大于或等于)、LT(小于)、

LE(小于等于)、EQ(等于)、NE(不等于)關(guān)系運(yùn)算符用于兩個(gè)數(shù)的比較,結(jié)果為“真(-1)”或“假(0)”MOVAX,6000HGE5000HMOVAX,0FFFFHMOVAX,–3GE2

MOVAX,0000H地址運(yùn)算符地址運(yùn)算符對(duì)變量名、標(biāo)號(hào)、地址表達(dá)式進(jìn)行計(jì)算,得到作為立即數(shù)的運(yùn)算結(jié)果設(shè)變量LIST定義在DATA段中,

下面三條指令都是把DATA段的段基址裝入AX:MOVAX,DATA ;DATA代表該段的段基址,是一個(gè)立即數(shù)MOVAX,SEGDATA;取DATA的段基址,結(jié)果是立即數(shù)MOVAX,SEGLIST;取LIST的段基址,結(jié)果是立即數(shù)

SEG取地址表達(dá)式所在段的段基址XDB “ABCDE” ;TYPE=1,LENGTH=1,SIZE=1YDW 3DUP(5),4DUP(-1) ;TYPE=2,LENGTH=3,SIZE=6ZDD 34,49,18 ;TYPE=4,LENGTH=1,SIZE=4OFFSET取地址表達(dá)式的偏移地址MOVAX,LIST ;取出變量LIST第一個(gè)元素送入AXMOVAX,OFFSETLIST ;取變量LIST的偏移地址送入AXTYPE、LENGTH、SIZE三個(gè)運(yùn)算符分別用于取變量、標(biāo)號(hào)的類型,取變量定義時(shí)的元素個(gè)數(shù),取變量占用的字節(jié)數(shù)。上面所有的表達(dá)式都必須是匯編期間可以求值的?!癕OVAX,BX+2”是一條錯(cuò)誤的指令,匯編時(shí)將報(bào)告錯(cuò)誤,原因在于BX的值是未知的,可變的,在匯編階段無(wú)法進(jìn)行相關(guān)的計(jì)算。需要把BX的值與常數(shù)2相加并存入AX的操作只能在程序執(zhí)行階段由以下兩條指令完成:MOV AX,BX ;BX寄存器值存入AX寄存器ADD AX,2 ;AX寄存器的值加上2,結(jié)果存入AX3.1.4簡(jiǎn)化段格式其中,帶有方括號(hào)的內(nèi)容不是必需的,可以根據(jù)需要選擇使用,也可以改變出現(xiàn)的次序。內(nèi)存模式說(shuō)明[數(shù)據(jù)段定義][堆棧段定義][代碼段定義]END入口標(biāo)號(hào)除了前面所述的匯編語(yǔ)言源程序格式之外,還有一種稱為簡(jiǎn)化段格式。整個(gè)源程序組成如下:內(nèi)存模式說(shuō)明內(nèi)存模式說(shuō)明的格式是:MODEL內(nèi)存模式可選擇的內(nèi)存格式模式如下:微型:tiny,整個(gè)程序中有一個(gè)段,供.COM使用。小型:small,程序由一個(gè)代碼段、一個(gè)數(shù)據(jù)段(包括堆棧段)組成中型:medium,有多個(gè)代碼段,但只有一個(gè)數(shù)據(jù)段。大型:large,有多個(gè)代碼段和數(shù)據(jù)段。平坦:flat,供編寫(xiě)32位微處理器的匯編語(yǔ)言源程序。數(shù)據(jù)段定義格式是:2.數(shù)據(jù)段定義.DATA.FARDATA[數(shù)據(jù)段段名]或者只有一個(gè)數(shù)據(jù)段時(shí),.DATA表示數(shù)據(jù)段的開(kāi)始,隨后可以定義各項(xiàng)數(shù)據(jù)。如果有些數(shù)據(jù)沒(méi)有初值,可以使用.DATA?來(lái)減少可執(zhí)行文件的大小。省略堆棧段大小時(shí),堆棧段自動(dòng)設(shè)置為1024B(1KB)。程序裝入執(zhí)行時(shí),根據(jù)所定義的堆棧段自動(dòng)裝載SS、SP寄存器。3.堆棧段定義堆棧段定義格式是:.STACK[堆棧段大小]只有一個(gè)代碼段時(shí)可以省略代碼段段名。4.代碼段定義代碼段定義格式是:.CODE[代碼段段名]

使用上述格式時(shí),一個(gè)段的開(kāi)始同時(shí)意味著上一個(gè)段的結(jié)束,也就是說(shuō),只需要申明段的開(kāi)始,不需要申明段的結(jié)束。使用簡(jiǎn)化格式后,不再需要ASSUME偽指令說(shuō)明各段與段寄存器的對(duì)應(yīng)關(guān)系。使用簡(jiǎn)化段定義格式重寫(xiě)[例3-1]如下:.MODELSMALL.DATAARRAYDB4DUP(0FFH).CODESTART:MOVAX,@DATA;@DATA代表.DATA定義的數(shù)據(jù)段段基址MOVDS,AX;裝載DS……;第1個(gè)元素清0……;……MOVAX,4C00HINT21HENDSTART3.2匯編語(yǔ)言上機(jī)操作

3.2.1編輯

3.2.2匯編

3.2.3連接

3.2.4運(yùn)行和調(diào)試匯編語(yǔ)言源程序編制完成后,在計(jì)算機(jī)上的操作過(guò)程分為四個(gè)階段:編輯、匯編、連接、運(yùn)行調(diào)試3.2.1編輯輸入源程序;對(duì)源程序進(jìn)行修改。編輯階段的主要任務(wù)是:一定要用“純文本”格式來(lái)儲(chǔ)存源程序文件,否則無(wú)法匯編。產(chǎn)生的源程序文件應(yīng)該以“.ASM”或“.TXT”為擴(kuò)展名,最好使用“.ASM”擴(kuò)展名。大多數(shù)的文字編輯軟件都可以用來(lái)輸入和修改匯編語(yǔ)言源程序,如記事本(Notepad)、寫(xiě)字板(Writer)、Word以及命令行方式下的Edit(推薦使用)。3.2.2匯編匯編階段的任務(wù)是把匯編語(yǔ)言源程序“翻譯”成為機(jī)器代碼(稱為“目標(biāo)”),產(chǎn)生二進(jìn)制的“目標(biāo)文件”。常用的匯編工具

Microsoft公司的MASM(MacroAssembler,宏匯編)

Borland公司的TASM(TurboAssembler)假設(shè)已經(jīng)產(chǎn)生了一個(gè)匯編語(yǔ)言源程序文件“MYPRG1.ASM”,

可以用如下命令進(jìn)行匯編:該命令正確執(zhí)行后,將產(chǎn)生一個(gè)同名的目標(biāo)文件MYPRG1.OBJ。TASM MYPRG1↙如果匯編語(yǔ)言源程序文件以“.TXT”為擴(kuò)展名,匯編時(shí)要使用這個(gè)文件的“全稱”:TASM MYPRG1.TXT↙Errormessages:NoneWaringmessage:NoneTASM命令執(zhí)行后,在屏幕上顯示相關(guān)信息。說(shuō)明這個(gè)程序已經(jīng)順利地通過(guò)了“匯編”,沒(méi)有發(fā)現(xiàn)錯(cuò)誤。**Error**EX2.ASM(14)Valueoutofrange……Errormessages:1表示匯編源程序EX2.ASM第14行有“數(shù)值超出范圍”的錯(cuò)誤,程序的錯(cuò)誤總數(shù)為1。/ZI產(chǎn)生用于程序調(diào)試的完整信息/L產(chǎn)生同名的列表文件完整的TASM命令行TASM[OPTION]SOURCE[,OBJECT][,LISTING][,XREF]↙[OPTION]這一部分可以給匯編過(guò)程提供一些可選擇的項(xiàng)目。常用的選項(xiàng)有:[,OBJECT]通過(guò)這個(gè)選項(xiàng)另外指定目標(biāo)文件名[,LISTING]用這個(gè)選項(xiàng)指定列表文件的名稱[,XREF]這個(gè)選項(xiàng)用來(lái)產(chǎn)生交叉引用文件對(duì)源程序“PRG.TXT”進(jìn)行匯編,產(chǎn)生名為“PRG1.OBJ”的目標(biāo)文件名為“PRG1.LST”的列表文件,同時(shí)產(chǎn)生程序調(diào)試所需要的完整信息(包含在目標(biāo)文件中)。關(guān)于TASM命令更詳細(xì)的信息,可以打入命令“TASM/?”獲得。TASM/ZIPRG.TXT,PRG1,PRG1↙3.2.3連接連接階段主要完成的操作是:把幾個(gè)程序模塊產(chǎn)生的目標(biāo)文件連接成一個(gè)完整的可執(zhí)行程序;把“子程序庫(kù)”中的子程序連接到程序中去。由單個(gè)程序文件組成的簡(jiǎn)單程序,連接命令如下

TLINKEX2↙對(duì)目標(biāo)文件“EX2.OBJ”進(jìn)行連接操作,產(chǎn)生同名的可執(zhí)行程序“EX2.EXE”。如果程序里沒(méi)有定義堆棧段,連接過(guò)程會(huì)產(chǎn)生警告信息“Nostack”。如果程序比較小,這個(gè)警告信息不影響連接產(chǎn)生的可執(zhí)行程序的使用。/t產(chǎn)生“.COM”格式的可執(zhí)行程序;/v產(chǎn)生的可執(zhí)行程序包含全部的符號(hào)調(diào)試信息(匯編時(shí)已使用

過(guò)“/ZI”選項(xiàng),否則該選項(xiàng)不起作用)。/3使用32位的尋址方式(例如,出現(xiàn)了指令“MOVAX,[EBX]”)可以在TLINK命令中增加一些選擇項(xiàng),常用的選擇項(xiàng):TLINKMYPRG1+MYPRG2,MYPRG,MYLIB↙關(guān)于TLINK命令更詳細(xì)的信息,可以打入命令“TLINK/?”獲得。把目標(biāo)文件MYPRG1.OBJ、MYPRG2.OBJ和子程序庫(kù)文件MYLIB.LIB中的部分子程序連接成為一個(gè)可執(zhí)行程序MYPRG.EXE。3.2.4運(yùn)行和調(diào)試由TLINK產(chǎn)生的“.EXE”或者“.COM”文件可以直接執(zhí)行?!癕YPRG1↙”擴(kuò)展名“.EXE”可以省略。如果同時(shí)存在文件MYPGM.EXE和MYPGM.COM,上面

的命令將執(zhí)行程序MYPRG.COM而不是MYPGM.EXE。

如果同時(shí)存在文件MYPGM.EXE和MYPGM.COM,執(zhí)行

程序MYPGM.EXE時(shí),需要在命令行打入它的全名。TASM5.0軟件包中,用于程序調(diào)試的軟件稱為“TD”

(TurboDebugger):調(diào)試(Debug):在操作者的控制下執(zhí)行這個(gè)程序,觀察程序每個(gè)階段的執(zhí)行結(jié)果,或者修改參數(shù)反復(fù)運(yùn)行程序,查找出程序中還存在的不正確的地方,或者驗(yàn)證程序的正確性。

TDEX201↙匯編語(yǔ)言程序不包含輸出結(jié)果的相關(guān)指令,操作者無(wú)法看到

程序的運(yùn)行結(jié)果。程序能夠運(yùn)行,但是不能得到預(yù)想的結(jié)果。發(fā)生以下兩種情況之一的,需要對(duì)程序進(jìn)行“調(diào)試”。調(diào)試程序“TD”的運(yùn)行界面TD的五個(gè)子窗口CPU子窗口:位于各窗口的左上方,占用面積最大,各列分別顯示代碼段的地址、內(nèi)容、對(duì)應(yīng)的符號(hào)指令(由代碼段中的二進(jìn)制機(jī)器指令“反匯編”得到)。數(shù)據(jù)子窗口:位于CPU子窗口的下方,顯示部分存儲(chǔ)器的內(nèi)容。寄存器子窗口:顯示各寄存器內(nèi)容??蛇x擇16/32位寄存器標(biāo)志位子窗口:顯示FLAGS寄存器內(nèi)各標(biāo)志位的當(dāng)前值。堆棧子窗口:顯示堆棧段棧頂附近各單元的地址和當(dāng)前值。除了上述子窗口以外,用戶還可以打開(kāi)其它的子窗口用F5鍵可以把這些子窗口充滿整個(gè)TD窗口。需要對(duì)某個(gè)窗口進(jìn)行操作時(shí),首先要“選中”這個(gè)窗口,方法是在全屏幕方式下用鼠標(biāo)單擊,或者用F6鍵選擇。在全屏幕方式下,在這個(gè)窗口里用鼠標(biāo)右擊,會(huì)彈出一個(gè)菜單,其中包含了最常用的操作命令。同時(shí)按下“Alt”和“Enter”鍵可以把TD窗口擴(kuò)展為全屏幕。在全屏幕方式下,可以用鼠標(biāo)進(jìn)行各項(xiàng)操作。各窗口的內(nèi)容都可以由操作者進(jìn)行修改。按兩次F7鍵,“DATA”的段基址“0ADEH”裝入DS

左擊選中數(shù)據(jù)窗口,右擊該窗口,在命令菜單中選擇“GOTO……”,在該命令的對(duì)話框中輸入“DS:0”,數(shù)據(jù)窗口顯示“DATA”段的內(nèi)容。可以看到ARRAY數(shù)組各元素的初始值;先后按4次F7鍵,從數(shù)據(jù)窗口可以看到,數(shù)組ARRAY的元素

逐個(gè)被清零;按2次F7鍵,彈出一個(gè)對(duì)話窗口,程序運(yùn)行結(jié)束?;镜倪\(yùn)行、調(diào)試命令:F7/F8:?jiǎn)尾竭\(yùn)行(每次執(zhí)行一條指令)F4:運(yùn)行到光標(biāo)處F9:連續(xù)運(yùn)行。以“EX301.EXE”為例,調(diào)試過(guò)程如下:3.3數(shù)據(jù)運(yùn)算

3.3.1算術(shù)運(yùn)算

3.3.2循環(huán)

3.3.3十進(jìn)制數(shù)運(yùn)算

本節(jié)的學(xué)習(xí)重點(diǎn):

數(shù)值計(jì)算與標(biāo)志位;

指針的使用;

循環(huán)程序基本結(jié)構(gòu);

數(shù)制轉(zhuǎn)換。

3.3.1算術(shù)運(yùn)算加法指令減法指令乘法和除法指令

(1)ADD(Addition):加法指令格式:ADD 目的操作數(shù),源操作數(shù)功能:目的操作數(shù)←目的操作數(shù)+源操作數(shù)目的操作數(shù):8/16位的寄存器/存儲(chǔ)器源操作數(shù):與目的操作數(shù)同類型的寄存器/存儲(chǔ)器/立即數(shù)例: ADD AX,SI ;AX←(AX)+(SI),16位運(yùn)算

ADD X,3 ;X←(X)+3,運(yùn)算位數(shù)由X的類型確定加法指令下面的指令無(wú)法確定操作數(shù)的類型,匯編時(shí)將報(bào)告錯(cuò)誤:

ADD [SI],5 ;兩個(gè)操作數(shù)都沒(méi)有明確類型如果目的操作數(shù)是DS:[SI]指向的字節(jié)存儲(chǔ)單元,可以修改如下:

ADD BYTEPTR[SI],5說(shuō)明:加法指令執(zhí)行后,狀態(tài)標(biāo)志CF,OF,ZF,SF,PF,AF按照運(yùn)算結(jié)

果被刷新;操作數(shù)可以是8位/16位,源操作數(shù)與目的操作數(shù)應(yīng)該有相

同的類型,不能同時(shí)為內(nèi)存操作數(shù)。

(2)ADC(AdditionwithCarry):帶進(jìn)位的加法指令格式:ADC 目的操作數(shù),源操作數(shù)功能:目的操作數(shù)←目的操作數(shù)+源操作數(shù)+CF目的操作數(shù):8/16位的寄存器/存儲(chǔ)器源操作數(shù):與目的操作數(shù)同類型的寄存器/存儲(chǔ)器/立即數(shù)說(shuō)明:該指令對(duì)標(biāo)志位的影響、對(duì)操作數(shù)的要求與ADD指令相同;主要用于對(duì)數(shù)據(jù)分段相加時(shí)高位的加法運(yùn)算。[例3-2]X=33445566H,Y=89ABCDEFH,

計(jì)算Z=X+Y(對(duì)應(yīng)的數(shù)據(jù)段已經(jīng)定義,變量X,Y,Z用DD定義)MOV AX,WORDPTRX ;取X的低16位,送入AXADD AX,WORDPTRY ;X,Y的低16位相加;(AX)=5566H+0CDEFH=2355H,CF=1MOV WORDPTRZ,AX ;低16位的和送Z的低16位MOV AX,WORDPTRX+2 ;取X的高16位,送入AXADC AX,WORDPTRY+2;X,Y的高16位及低位進(jìn)位相加;(AX)=3344H+89ABH+CF=0BCF0H,CF=0MOV WORDPTRZ+2,AX ;高16位的和送Z的高16位(3)INC(Increment):增量指令格式:INC 目的操作數(shù)功能:目的操作數(shù)←目的操作數(shù)+1目的操作數(shù):8/16位的寄存器/存儲(chǔ)器例: INC BX ;BX←(BX)+1,16位運(yùn)算

INC X ;X←(X)+1,運(yùn)算位數(shù)由X的類型確定

INC WORDPTR[BX]

;DS:[BX]←DS:[BX]+1,16位運(yùn)算說(shuō)明:增量指令執(zhí)行后,CPU的狀態(tài)標(biāo)志OF,ZF,SF,PF,AF按照

運(yùn)算結(jié)果被刷新,但是CF標(biāo)志不受影響;增量指令常常用來(lái)修改計(jì)數(shù)器和存儲(chǔ)器指針的值。(1)SUB(Subtract):減法指令格式:SUB 目的操作數(shù),源操作數(shù)功能:目的操作數(shù)←目的操作數(shù)-源操作數(shù)目的操作數(shù):8/16位的寄存器/存儲(chǔ)器源操作數(shù):與目的操作數(shù)同類型的寄存器/存儲(chǔ)器/立即數(shù)例:SUB AX,SI ;AX←(AX)-(SI),16位運(yùn)算

SUB Y,20H;Y←(Y)-20H,運(yùn)算位數(shù)由Y的類型確定

SUB WORDPTR[BP],5

;SS:[BP]←SS:[BP]-5,16位運(yùn)算說(shuō)明:該指令對(duì)標(biāo)志位的影響、對(duì)操作數(shù)的要求與ADD指令

相同。減法指令(2)SBB(SubtractwithBorrow):帶借位的減法指令格式:SBB 目的操作數(shù),源操作數(shù)功能:目的操作數(shù)←目的操作數(shù)-源操作數(shù)-CF目的操作數(shù):8/16位的寄存器/存儲(chǔ)器源操作數(shù):與目的操作數(shù)同類型的寄存器/存儲(chǔ)器/立即數(shù)說(shuō)明:該指令對(duì)標(biāo)志位的影響、對(duì)操作數(shù)的要求與ADD指令相同;主要用于對(duì)一個(gè)數(shù)據(jù)分段相減時(shí)高位的減法運(yùn)算(3)DEC(Decrement):減量指令格式:DEC 目的操作數(shù)功能:目的操作數(shù)←目的操作數(shù)-1目的操作數(shù):8/16位的寄存器/存儲(chǔ)器例:DECCX ;CX←(CX)-1,16位運(yùn)算

DECX ;X←(X)-1,運(yùn)算位數(shù)由X的類型確定

DECWORDPTR[DI]

;DS:[DI]←DS:[DI]-1,16位運(yùn)算說(shuō)明:減量指令執(zhí)行后,CPU的狀態(tài)標(biāo)志OF,ZF,SF,PF,AF按照

運(yùn)算結(jié)果被刷新,但是CF標(biāo)志不受影響;減量指令常常用來(lái)修改計(jì)數(shù)器和存儲(chǔ)器指針的值;(4)NEG(Negate):求補(bǔ)指令格式:NEG 目的操作數(shù)功能:目的操作數(shù)←0-目的操作數(shù)目的操作數(shù):8/16位的寄存器/存儲(chǔ)器例:NEGZ;Z←-Z,運(yùn)算位數(shù)由Z的類型確定由于有符號(hào)數(shù)均使用補(bǔ)碼表示,所以該指令的操作等效于:目的操作數(shù)←[目的操作數(shù)]求補(bǔ)(1)MUL(UnsignedMultiplication):無(wú)符號(hào)數(shù)乘法格式:MUL 源操作數(shù)源操作數(shù):8位/16位的寄存器/存儲(chǔ)器功能:8位源操作數(shù)時(shí):AX←(AL)×源操作數(shù)

16位源操作數(shù)時(shí):DX,AX←(AX)×源操作數(shù)說(shuō)明:兩個(gè)N位操作數(shù)相乘,得到2N位的乘積;如果乘積的高N位為0,則CF=OF=0,否則CF=OF=1。其余

標(biāo)志位無(wú)意義。乘法和除法指令(2)IMUL(SignedIntegerMultiplication):有符號(hào)數(shù)乘法格式:IMUL 源操作數(shù)源操作數(shù):8位/16位的寄存器/存儲(chǔ)器功能:8位源操作數(shù)時(shí):AX←(AL)×源操作數(shù)

16位源操作數(shù)時(shí):DX,AX←(AX)×源操作數(shù)說(shuō)明:兩個(gè)N位操作數(shù)相乘,得到2N位的乘積;源操作數(shù)不能為立即數(shù);如果乘積高N位為低N位的符號(hào)擴(kuò)展,則CF=OF=0,否則

CF=OF=1,其余標(biāo)志位無(wú)意義。相同的兩組二進(jìn)制代碼分別用MUL和IMUL運(yùn)算,可能得到不

同的結(jié)果:例如:(AL)=0FFH,(X)=2 MUL X ;(AX)=01FEH,(255×2=510)

IMUL X ;(AX)=0FFFEH,(-1×2=-2)(3)DIV(UnsignedDivision):無(wú)符號(hào)除法格式:DIV 源操作數(shù)源操作數(shù):8位/16位的寄存器/存儲(chǔ)器功能:8位源操作數(shù)時(shí):(AX)÷源操作數(shù),AL←商,AH←余數(shù)16位源操作數(shù)時(shí):(DX,AX)÷源操作數(shù),AX←商,DX←余數(shù)說(shuō)明: 兩個(gè)N位操作數(shù)相除,應(yīng)首先把被除數(shù)零擴(kuò)展為2N位;例如,要進(jìn)行除法(AX)÷(BX),假設(shè)AX、BX內(nèi)均為無(wú)符號(hào)數(shù):

MOV DX,0 ;32位被除數(shù)高16位清零

DIV BX ;(DX,AX)÷BX,AX←商,DX←余數(shù)如果(2N位)÷(N位)的商大于2N-1,會(huì)產(chǎn)生“除法溢出”錯(cuò)誤。源操作數(shù)不能為立即數(shù)例如,要進(jìn)行除法(AX)÷5,首先應(yīng)確定是16位÷8位還是

32位÷16位:如果能確定(AX)÷5的商小于255,可以執(zhí)行16位÷8位除法:

MOVBL,5 ;除數(shù)存入BL寄存器

DIVBL ;16位÷8位,AL←商,AH←余數(shù)如果不能確定(AX)÷5的商小于255,可以執(zhí)行32位÷16位除法:

MOVBX,5 ;除數(shù)存入BX寄存器

MOVDX,0 ;32位被除數(shù)高16位清零

DIVBX ;(DX,AX)÷BX,AX←商,DX←余數(shù)(4)IDIV(SignedIntegerDivision):有符號(hào)數(shù)除法格式:IDIV 源操作數(shù)源操作數(shù):8位/16位的寄存器/存儲(chǔ)器功能:8位源操作數(shù)時(shí):(AX)÷源操作數(shù),AL←商,AH←余數(shù)16位源操作數(shù)時(shí):(DX,AX)÷源操作數(shù),AX←商,DX←余數(shù)說(shuō)明:兩個(gè)N位操作數(shù)相除,應(yīng)首先把被除數(shù)符號(hào)擴(kuò)展為2N位;例如,要進(jìn)行除法(AX)÷(BX),AX、BX內(nèi)均為有符號(hào)數(shù)

CWD ;被除數(shù)AX符號(hào)擴(kuò)展到DX,AXIDIVBX ;(DX,AX)÷(BX),AX←商,DX←余數(shù)兩個(gè)有符號(hào)數(shù)相除,余數(shù)與被除數(shù)同號(hào):

–10IDIV–3 ;商=3,余數(shù)=–1–10IDIV3 ;商=–3,余數(shù)=–1如果(2N位)÷(N位)的商大于2N-1-1或者小于

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論