32位匯編語(yǔ)言 課件 第2、3章 數(shù)據(jù)表示和尋址、通數(shù)據(jù)處理指令_第1頁(yè)
32位匯編語(yǔ)言 課件 第2、3章 數(shù)據(jù)表示和尋址、通數(shù)據(jù)處理指令_第2頁(yè)
32位匯編語(yǔ)言 課件 第2、3章 數(shù)據(jù)表示和尋址、通數(shù)據(jù)處理指令_第3頁(yè)
32位匯編語(yǔ)言 課件 第2、3章 數(shù)據(jù)表示和尋址、通數(shù)據(jù)處理指令_第4頁(yè)
32位匯編語(yǔ)言 課件 第2、3章 數(shù)據(jù)表示和尋址、通數(shù)據(jù)處理指令_第5頁(yè)
已閱讀5頁(yè),還剩142頁(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)介

第2章數(shù)據(jù)表示和尋址2.1數(shù)據(jù)表示2.2常量表達(dá)2.3變量應(yīng)用2.4數(shù)據(jù)尋址方式第2章數(shù)據(jù)表示和尋址理解計(jì)算機(jī)的數(shù)據(jù)表達(dá)熟悉匯編語(yǔ)言的常量表達(dá)掌握匯編語(yǔ)言的變量定義和屬性掌握處理器指令的數(shù)據(jù)尋址方式32.1數(shù)據(jù)表示數(shù)據(jù)(Data):計(jì)算機(jī)處理的對(duì)象對(duì)應(yīng)指令操作的對(duì)象:操作數(shù)(Oprand)計(jì)算機(jī)中的數(shù)據(jù)要用二進(jìn)制的0和1組合表示進(jìn)入計(jì)算機(jī)的任何信息都要轉(zhuǎn)換成0和1數(shù)碼IA-32整數(shù)指令支持的基本數(shù)據(jù)類型8、16、32、64位無(wú)符號(hào)整數(shù)8、16、32、64位有符號(hào)整數(shù)ASCII字符、字符串和BCD碼42.1.1數(shù)制人習(xí)慣使用十進(jìn)制計(jì)數(shù)計(jì)算機(jī)使用二進(jìn)制進(jìn)行數(shù)據(jù)處理十六進(jìn)制數(shù)便于表達(dá)二進(jìn)制數(shù)二進(jìn)制數(shù)用后綴字母B十六進(jìn)制數(shù)用后綴字母H51.二進(jìn)制便于計(jì)算機(jī)存儲(chǔ)及物理實(shí)現(xiàn)特點(diǎn):逢二進(jìn)一,由0和1兩個(gè)數(shù)碼組成,基數(shù)為2,各個(gè)位權(quán)以2k表示二進(jìn)制數(shù):

anan-1…a1a0.b1b2…bm= an×2n+an-1×2n-1+…+a1×21+a0×20

+b1×2-1+b2×2-2+…+bm×2-m 其中ai,bj非0即1二進(jìn)制數(shù)的算術(shù)運(yùn)算:逢2進(jìn)1、借1當(dāng)2示意圖二進(jìn)制數(shù)的算術(shù)運(yùn)算返回2.邏輯運(yùn)算事件的假和真可用數(shù)碼0和1表示事件之間的關(guān)系可以利用二進(jìn)制表達(dá)數(shù)字電路的低高電平用數(shù)碼0和1表示數(shù)字信號(hào)之間的關(guān)系可以利用二進(jìn)制描述數(shù)碼0和1僅僅代表兩種狀態(tài)它們的運(yùn)算是邏輯運(yùn)算邏輯與AND: 1101

0011=0001邏輯或OR: 1101

0011=1111邏輯非NOT:

1101=0010邏輯異或XOR: 1101

0011=11103.十六進(jìn)制用于表達(dá)二進(jìn)制數(shù),相互轉(zhuǎn)換簡(jiǎn)單基數(shù)16,逢16進(jìn)位,位權(quán)為16k16個(gè)數(shù)碼:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F(xiàn)十六進(jìn)制數(shù):

anan-1…a1a0.b1b2…bm= an×16n+an-1×16n-1+…+a1×161+a0×160 +b1×16-1+b2×16-2+…+bm×16-m 其中ai,bj是0~F中的一個(gè)數(shù)碼十六進(jìn)制數(shù)的加減:逢16進(jìn)位1,借1當(dāng)16減法加法十六進(jìn)制數(shù)的加法運(yùn)算

23D9+94BEB8979+14=23=16(carry)+713+11+1(carry)=25=16(carry)+93+4+1(carry)=82+9=11=B返回十六進(jìn)制數(shù)的減法運(yùn)算

A59F-62B842E715-8=716(borrow)+9-11=14=E5-2-1(borrow)=210-6=4返回114.數(shù)制之間的轉(zhuǎn)換十進(jìn)制二進(jìn)制十六進(jìn)制BCD碼常用二進(jìn)制位權(quán)00000002-3=0.12510001112-2=0.2520010222-1=0.5300113320=1401004421=2501015522=4601106623=8701117724=16810008825=32910019926=64101010A27=128111011B28=256121100C29=512131101D210=1024141110E215=32768151111F216=6553612二進(jìn)制數(shù)或十六進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù)方法:按權(quán)展開(kāi)二進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù)

0011.1010B =1×21+1×20+1×2-1+0×2-2+1×2-3 =3.625十六進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù)

1.2H

=1×160+2×16-1

=1.12513十進(jìn)制整數(shù)轉(zhuǎn)換為二或十六進(jìn)制數(shù)整數(shù)部分轉(zhuǎn)換:用除法十進(jìn)制數(shù)整數(shù)部分不斷除以基數(shù)2或16,并記下余數(shù),直到商為0為止由最后一個(gè)余數(shù)起逆向取各個(gè)余數(shù),則為轉(zhuǎn)換成的二進(jìn)制和十六進(jìn)制數(shù)

126=01111110B 126=7EH示意圖14十進(jìn)制整數(shù)的轉(zhuǎn)換返回15十進(jìn)制小數(shù)轉(zhuǎn)換為二或十六進(jìn)制數(shù)小數(shù)部分轉(zhuǎn)換:用乘法分別乘以各自的基數(shù),記錄整數(shù)部分,直到小數(shù)部分為0為止

0.8125=0.1101B 0.8125=0.DH小數(shù)轉(zhuǎn)換會(huì)發(fā)生總是無(wú)法乘到為0的情況可選取一定位數(shù)(精度)將產(chǎn)生無(wú)法避免的轉(zhuǎn)換誤差示意圖16十進(jìn)制小數(shù)的轉(zhuǎn)換返回17二進(jìn)制和十六進(jìn)制數(shù)的相互轉(zhuǎn)換二進(jìn)制和十六進(jìn)制數(shù)之間具有對(duì)應(yīng)關(guān)系以小數(shù)點(diǎn)為基準(zhǔn)整數(shù)從左向右,小數(shù)從右向左每4個(gè)二進(jìn)制位對(duì)應(yīng)一個(gè)十六進(jìn)制位

00111010B=3AH F2H=11110010B182.1.2數(shù)值的編碼編碼:用文字、符號(hào)或者數(shù)碼來(lái)表示某種信息(數(shù)值、語(yǔ)言、操作指令、狀態(tài)等)的過(guò)程二進(jìn)制編碼:組合0和1數(shù)碼機(jī)器數(shù):計(jì)算機(jī)用0和1數(shù)碼組合表達(dá)的數(shù)值真值:現(xiàn)實(shí)中真實(shí)的數(shù)值數(shù)值的兩種編碼方式定點(diǎn)格式(第2章)浮點(diǎn)格式(第9章)191.定點(diǎn)整數(shù)定點(diǎn)格式:固定小數(shù)點(diǎn)的位置表達(dá)數(shù)值定點(diǎn)整數(shù):小數(shù)點(diǎn)固定在機(jī)器數(shù)的最右側(cè)定點(diǎn)小數(shù):小數(shù)點(diǎn)固定在機(jī)器數(shù)的最左側(cè)無(wú)符號(hào)整數(shù)(無(wú)符號(hào)數(shù))只表達(dá)0和正整數(shù)的定點(diǎn)整數(shù)N位無(wú)符號(hào)整數(shù)表達(dá)范圍:0~2N-1有符號(hào)整數(shù)(有符號(hào)數(shù)、帶符號(hào)數(shù))表達(dá)負(fù)整數(shù)、0和正整數(shù)的定點(diǎn)整數(shù)最高位表達(dá)數(shù)值正負(fù)符號(hào)位用0表示正數(shù)、1表示負(fù)數(shù)示意圖20定點(diǎn)整數(shù)格式返回212.補(bǔ)碼有符號(hào)整數(shù)在計(jì)算機(jī)中默認(rèn)采用補(bǔ)碼最高位表示符號(hào):正數(shù)用0,負(fù)數(shù)用1正數(shù)補(bǔ)碼:直接表示數(shù)值大?。ㄍ瑹o(wú)符號(hào)數(shù))負(fù)數(shù)補(bǔ)碼:將對(duì)應(yīng)正數(shù)補(bǔ)碼取反加1 [105]補(bǔ)碼=01101001B [-105]補(bǔ)碼=[01101001B]取反+1 =10010110B+1=10010111B8位二進(jìn)制補(bǔ)碼的數(shù)值范圍:-128~+12716位二進(jìn)制補(bǔ)碼的數(shù)值范圍:-215~+215-132位二進(jìn)制補(bǔ)碼的數(shù)值范圍:-231~+231-1N位二進(jìn)制補(bǔ)碼的數(shù)值范圍:-2N-1~+2N-1-122負(fù)數(shù)求補(bǔ)負(fù)數(shù)真值“取反加1”得機(jī)器數(shù)補(bǔ)碼負(fù)數(shù)補(bǔ)碼“取反加1”得到負(fù)數(shù)真值補(bǔ)碼:11100000B真值:-([11100000]求反+1)=-(00011111+1)=-00100000=-25=-32負(fù)數(shù)求補(bǔ)運(yùn)算,等效于用帶借位的0作減法真值:-8,補(bǔ)碼:[-8]補(bǔ)碼=00H-08H=F8H補(bǔ)碼:11111000,真值:-(00H-F8H)=-08H=-8+8= 00001000 11110111+ 1-8= 11111000

0= 00000000-(8= 00001000)-8= 11111000233.補(bǔ)碼運(yùn)算利用無(wú)符號(hào)數(shù)加法結(jié)合補(bǔ)碼表達(dá),實(shí)現(xiàn)無(wú)符號(hào)數(shù)加法無(wú)符號(hào)數(shù)減法有符號(hào)數(shù)加法有符號(hào)數(shù)減法無(wú)符號(hào)數(shù)加減運(yùn)算,需要利用進(jìn)位或借位有符號(hào)數(shù)加減運(yùn)算,注意避免出現(xiàn)溢出[X]補(bǔ)碼+[Y]補(bǔ)碼=[X+Y]補(bǔ)碼[X]補(bǔ)碼-[Y]補(bǔ)碼=[X]補(bǔ)碼+[-Y]補(bǔ)碼=[X-Y]補(bǔ)碼244.原碼和反碼正數(shù)的原碼、反碼和無(wú)符號(hào)數(shù)一樣求負(fù)數(shù)的原碼、反碼和補(bǔ)碼首先計(jì)算其對(duì)應(yīng)正數(shù)的編碼然后取反符號(hào)位(設(shè)置為1)成為原碼再取反其他位得到反碼最后加1就是補(bǔ)碼真值:32,機(jī)器數(shù):00100000B=20H真值:-32,機(jī)器數(shù):

[-32]原碼=10100000B=A0H [-32]反碼=11011111B=DFH [20H]補(bǔ)碼=11100000B=E0H252.1.3

字符的編碼在計(jì)算機(jī)中,各種字符需要用若干位的二進(jìn)制碼的組合表示,即字符的二進(jìn)制編碼由于字節(jié)為計(jì)算機(jī)的基本存儲(chǔ)單位,所以常以8個(gè)二進(jìn)制位為單位表達(dá)字符0123456789English漢字261.BCD(二進(jìn)制表達(dá)的十進(jìn)制)二進(jìn)制編碼的十進(jìn)制數(shù)一個(gè)十進(jìn)制數(shù)位用4位二進(jìn)制編碼來(lái)表示8421BCD碼:低10個(gè)4位二進(jìn)制編碼表示0~9壓縮BCD碼:一個(gè)字節(jié)表達(dá)兩位BCD碼非壓縮BCD碼:一個(gè)字節(jié)表達(dá)一位BCD碼(低4位表達(dá)數(shù)值,高4位常設(shè)置為0)BCD碼很直觀BCD碼:0100100101111000.000101001001十進(jìn)制真值: 4978.149BCD碼便于輸入輸出,表達(dá)數(shù)值準(zhǔn)確272.ASCII(美國(guó)標(biāo)準(zhǔn)信息交換碼)標(biāo)準(zhǔn)ASCII碼用7位二進(jìn)制編碼,有128個(gè)不可顯示的控制字符:前32個(gè)和最后一個(gè)回車CR:0DH

換行LF:0AH

響鈴BEL:07H可顯示和打印的字符:20H及以后的95個(gè)編碼數(shù)碼0~9:30H~39H大寫(xiě)字母A~Z:41H~5AH小寫(xiě)字母a~z:61H~7AH空格:20H擴(kuò)展ASCII碼:最高D7位為1,表達(dá)制表符號(hào)283.Unicode(統(tǒng)一碼)8位ASCII碼表達(dá)英文字符16位國(guó)標(biāo)碼表達(dá)漢字字符漢字機(jī)內(nèi)碼:國(guó)標(biāo)碼在計(jì)算機(jī)中使用的編碼國(guó)際信息交換碼Unicode16位編碼對(duì)世界上所有語(yǔ)言的大多數(shù)字符進(jìn)行編碼提供擴(kuò)展能力Unicode兼容ASCIIUnicode給每個(gè)字符提供了一個(gè)唯一的數(shù)字,不論是什么平臺(tái),不論是什么程序,不論是什么語(yǔ)言29什么是統(tǒng)一碼?WhatisUnicode?Unicodeprovidesauniquenumberforeverycharacter,

nomatterwhattheplatform,

nomatterwhattheprogram,

nomatterwhatthelanguage.Unicode給每個(gè)字符提供了一個(gè)唯一的數(shù)字, 不論是什么平臺(tái), 不論是什么程序, 不論是什么語(yǔ)言返回302.2

常量表達(dá)1.常數(shù)十、十六和二進(jìn)制形式表達(dá)的數(shù)值以后綴字母區(qū)分,十進(jìn)制數(shù)可以不加以字母A~F開(kāi)頭的十六進(jìn)制常數(shù),要加前導(dǎo)02.字符和字符串英文縮略號(hào)括起來(lái)的單個(gè)字符或多個(gè)字符數(shù)值是每個(gè)字符對(duì)應(yīng)的ASCII碼值3.符號(hào)常量使用標(biāo)識(shí)符表達(dá)一個(gè)數(shù)值符號(hào)定義偽指令:等價(jià)EQU,等號(hào)=4.數(shù)值表達(dá)式用運(yùn)算符連接各種常量構(gòu)成的算式算術(shù)運(yùn)算符:+(加)-(減)*(乘)/(除)常量具有確定數(shù)值31〔例2-1〕數(shù)據(jù)表達(dá)程序-100000000 6464

64

64

64const1 db100,100d,01100100b,64h,'d'00000005 017F8080FFFFconst2 db1,+127,128,-128,255,-10000000B 699720E032CEconst3 db105,-105,32,-32,32h,-32h00000011 303132333435 363738396162 6378797A4142 4358595Aconst4 db'0123456789','abcxyz','ABCXYZ'32〔例2-1〕數(shù)據(jù)表達(dá)程序-200000027 0D0A00crlf db0dh,0ah,0=0000000A

minint equ10

=000000FF

maxint

equ0ffh0000002A 0A0FFAF5const5 dbminint,minint+5,maxint-5,maxint-minint0000002E 105615EBconst6 db4*4,34h+34,67h-52h,52h-67h332.3

變量應(yīng)用變量(Variable)程序運(yùn)行中隨之發(fā)生變化的結(jié)果保存在可讀可寫(xiě)的主存空間實(shí)質(zhì)是主存單元的數(shù)據(jù),因而可以改變變量需要事先定義才能使用變量具有屬性方便應(yīng)用變量表達(dá)主存數(shù)據(jù),即存儲(chǔ)器操作數(shù)342.3.1

變量定義申請(qǐng)存儲(chǔ)空間,還可以進(jìn)行存儲(chǔ)單元初始化

變量名變量定義偽指令初值表變量名是用戶標(biāo)識(shí)符,表示首元素邏輯地址變量定義偽指令有DB(BYTE)、DW(WORD)、DD(DWORD)、DQ(QWORD)初值表是用逗號(hào)分隔的參數(shù)各種形式的常量“?”表示初值不確定,即未賦初值復(fù)制操作符DUP

重復(fù)次數(shù)DUP(重復(fù)參數(shù))351.變量定義偽指令助記符:DB變量類型:字節(jié)分配一個(gè)或多個(gè)字節(jié)單元;每個(gè)數(shù)據(jù)是字節(jié)量可用于定義字符串常量表示8位無(wú)符號(hào)數(shù)或有符號(hào)數(shù),字符的ASCII碼值助記符:DW變量類型:字分配一個(gè)或多個(gè)字單元;每個(gè)數(shù)據(jù)是字量、16位數(shù)據(jù)表示16位無(wú)符號(hào)或有符號(hào)數(shù)、16位段選擇器、16位偏移地址助記符:DD變量類型:雙字分配一個(gè)或多個(gè)雙字單元;每個(gè)數(shù)據(jù)是雙字量、32位數(shù)據(jù)表示32位無(wú)符號(hào)或有符號(hào)數(shù)、32位段基地址、32位偏移地址助記符:DQ變量類型:4個(gè)字分配一個(gè)或多個(gè)8字節(jié)單元;8字節(jié)量表示64位數(shù)據(jù)362.字節(jié)量數(shù)據(jù)DB定義8位、字節(jié)量變量數(shù)據(jù)可以表達(dá)無(wú)符號(hào)整數(shù)0~255補(bǔ)碼表示的有符號(hào)整數(shù):-128~+127一個(gè)字符(ASCII碼值)壓縮BCD碼:0~99非壓縮BCD碼:0~9……字符串定義使用字節(jié)變量定義DB37〔例2-2〕字節(jié)變量程序=0000000A minintequ1000000000 0080FF80007Fbvar1 db0,128,255,-128,0,+12700000006 01FF26DA38C8bvar2 db1,-1,38,-38,38h,-38h0000000C 00bvar3 db?0000000D 00000005[24]bvar4 db5dup('$')00000012 0000000A[00]0000000A[0A00]bvar5 dbminintdup(0),minintdup(minint,?)00000030 00000002[020300000002[04]]

db2dup(2,3,2dup(4))383.字量數(shù)據(jù)DW定義16位、字量變量數(shù)據(jù)可以表達(dá)16位無(wú)符號(hào)和有符號(hào)整數(shù)16位段選擇器,16位偏移地址16位數(shù)據(jù)含高低2個(gè)字節(jié),占2個(gè)連續(xù)的字節(jié)存儲(chǔ)單元小端方式(LittleEndian)低字節(jié)數(shù)據(jù)存放在低地址存儲(chǔ)單元高字節(jié)數(shù)據(jù)存放在高地址存儲(chǔ)單元大端方式(Big

Endian)低字節(jié)數(shù)據(jù)存放在高地址存儲(chǔ)單元高字節(jié)數(shù)據(jù)存放在低地址存儲(chǔ)單元39〔例2-3〕字變量程序-1=0000000A minintequ1000000000 00008000FFFF800000007FFFwvar1 dw0,32768,65535,-32768,0,+327670000000C 0001FFFF0026FFDA0038FFC8wvar2 dw1,-1,38,-38,38h,-38h00000018 0000 wvar3 dw?0000001A 20101020wvar4 dw2010h,1020h0000001E 00000005[000A0000]

dw5dup(minint,?)40〔例2-3〕字變量程序-200000032 31393832wvar6 dw3139h,3832h00000036 39313238bvar6 db39h,31h,32h,38h0000003A 00

db091289128運(yùn)行結(jié)果?414.雙字量數(shù)據(jù)DD定義32位、雙字量變量數(shù)據(jù)可以表達(dá)32位無(wú)符號(hào)和有符號(hào)整數(shù)32位偏移地址、線性地址或段基地址32位數(shù)據(jù)包含4個(gè)字節(jié),以“高對(duì)高、低對(duì)低”原則占用4個(gè)連續(xù)字節(jié)空間Howtoopenanegg,fromthelittleendorthebigend?示意圖42返回小端存儲(chǔ)方式43〔例2-4〕雙字變量程序-1=0000000A minintequ1000000000 0000000080000000FFFFFFFF 80000000000000007FFFFFFFdvar1 dd0,80000000h,0ffffffffh,-80000000h,0,7fffffffh00000018 00000001FFFFFFFF00000026 FFFFFFDA00000038FFFFFFC8dvar2 dd1,-1,38,-38,38h,-38h00000030 00000000dvar3 dd?00000034 0000201000001020

dd2010h,1020h44〔例2-4〕雙字變量程序-20000003C 0000000A[0000000A00000000]dvar5 ddminintdup(minint,?)0000008C 38323139dvar6 dd38323139h00000090 39313238bvar6 db39h,31h,32h,38h00000094 00 db091289128運(yùn)行結(jié)果!455.變量定位:指定偏移地址變量定義的存儲(chǔ)空間 按照書(shū)寫(xiě)的先后順序一個(gè)接著一個(gè)分配“ORG參數(shù)”控制存放的偏移地址

org100h ;從偏移地址100H處安排指令代碼也由匯編程序 按照語(yǔ)句的書(shū)寫(xiě)順序安排存儲(chǔ)空間定位偽指令也可以用于控制代碼的偏移地址465.變量定位:對(duì)齊地址邊界N字節(jié)數(shù)據(jù)起始于能夠被N整除的地址2字節(jié)、16位數(shù)據(jù)是被2整除的地址(偶地址)4字節(jié)、32位數(shù)據(jù)是被4整除的地址(模4地址)8字節(jié)、64位數(shù)據(jù)是被8整除的地址(模8地址)IA-32處理器允許不對(duì)齊邊界存放數(shù)據(jù),性能有下降“ALIGN

N”控制對(duì)齊N字節(jié)邊界

align

4

;對(duì)齊4字節(jié)地址邊界地址A對(duì)齊N字節(jié)邊界AmodN=0

(能夠被N整除的地址)47〔例2-5〕變量定位程序

org100h

0000010064

bvar1 db100

align2

000001020064 wvar2 dw100

align4

0000010400000000

dvar3 dd?

align4

0000010800000000

dvar4 dd?482.3.2

變量屬性變量定義分配存儲(chǔ)空間賦初值創(chuàng)建變量名變量名具有兩類屬性:⑴地址屬性:首個(gè)變量所在存儲(chǔ)單元的邏輯地址,含有段基地址和偏移地址⑵類型屬性:變量定義的數(shù)據(jù)單位字節(jié)量BYTE

字量WORD

雙字量DWORD

3字量FWORD4字量QWORD10字節(jié)量TBYTE49⒈地址操作符地址操作符用于獲取變量名的地址屬性[]括起的表達(dá)式作為存儲(chǔ)器地址指針$返回當(dāng)前偏移地址OFFSET變量名返回變量名所在段的偏移地址SEG變量名返回段基地址(實(shí)地址存儲(chǔ)模型)50〔例2-6〕變量地址屬性程序-1

;數(shù)據(jù)段00000000 1234bvar db12h,34h00000002

000100020003000400050006 000700080009000Aarray dw1,2,3,4,5,6,7,8,9,1000000016

5678wvar dw5678h=00000016

arr_sizeequ$-array=0000000B arr_lenequarr_size/200000018 9ABCDEF0dvar

dd9abcdef0h51〔例2-6〕變量地址屬性程序-2

;代碼段00000000 A000000000R

moval,[bvar]00000005 8A2500000001R

movah,[bvar+1]0000000B 66|8B1D 00000022R

movbx,wvar[2]00000012 B90000000B

movecx,arr_len00000017 BA00000017R

movedx,$0000001C BE00000022R

movesi,offsetdvar52〔例2-6〕變量地址屬性程序-300000021 8B3E

movedi,[esi]00000023 8B2D00000022R

movebp,[dvar]00000029 E800000000E

calldisprd運(yùn)行結(jié)果53⒉類型操作符類型操作符使用變量名的類型屬性類型名PTR變量名將變量名按照指定的類型使用TYPE變量名返回占用字節(jié)空間的字量數(shù)值LENGTHOF變量名返回整個(gè)變量的數(shù)據(jù)項(xiàng)數(shù)SIZEOF

變量名返回整個(gè)變量占用的字節(jié)數(shù)54〔例2-7〕變量類型屬性程序-1

;代碼段00000000 A10000000CR

moveax,dwordptr[array] ;獲得數(shù)據(jù)00000005 BB00000001

movebx,typebvar

;獲得字節(jié)類型值0000000A B900000002

movecx,typewvar

;獲得字類型值0000000F BA00000004

movedx,typedvar

;獲得雙字類型值55〔例2-7〕變量類型屬性程序-200000014 BE0000000A

movesi,lengthofarray

;獲得數(shù)據(jù)個(gè)數(shù)00000019 BF00000014

movedi,sizeofarray

;獲得字節(jié)長(zhǎng)度0000001E BD00000016

movebp,arr_size

;獲得字節(jié)長(zhǎng)度00000023 E800000000E

calldisprd

運(yùn)行結(jié)果562.4數(shù)據(jù)尋址方式指令有兩部分:操作碼和操作數(shù)操作碼:處理器要執(zhí)行哪種操作不可缺少,用助記符表示操作數(shù):指令執(zhí)行的參與者各種操作的對(duì)象,需要通過(guò)地址指示數(shù)據(jù)尋址方式:通過(guò)地址查找數(shù)據(jù)(操作數(shù))立即數(shù)尋址:數(shù)據(jù)在指令代碼中,用常量表達(dá)寄存器尋址:數(shù)據(jù)在寄存器中,用寄存器名表示存儲(chǔ)器尋址:數(shù)據(jù)在主存中,用存儲(chǔ)器地址指示572.4.1立即數(shù)尋址操作數(shù)緊跟操作碼,是機(jī)器代碼的一部分操作數(shù)從指令代碼中立即得到,即立即數(shù)(Immediate),用常量形式直接表達(dá)立即數(shù)尋址方式只用于源操作數(shù),常用來(lái)給寄存器和存儲(chǔ)單元賦值例如:MOVEAX,33221100H機(jī)器代碼:B800112233操作碼:B8立即數(shù):33221100示意圖58立即數(shù)尋址返回59〔例2-8〕立即數(shù)尋址程序-1

;數(shù)據(jù)段=00000040 const equ64000000008749 bvar db87h,49h00000002123456780000000C dvar dd12345678h,12

;代碼段00000000B012 moval,12h00000002B464 movah,'d'0000000466|BBFFFF

labl: movbx,-100000008B900000040

movecx,const60〔例2-8〕立即數(shù)尋址程序-20000000DBA00000040

movedx,const*4/typedvar00000012BE00000000R

movesi,offsetbvar00000017BF00000004R

movedi,labl0000001CC60500000000R4C

movbyteptr[bvar],01001100b00000023C70500000006R00000012

movdwordptr[dvar+4],12h612.4.2寄存器尋址操作數(shù)存放在處理器的內(nèi)部寄存器中用寄存器名表示它的內(nèi)容絕大多數(shù)指令采用通用寄存器尋址部分指令支持專用寄存器,例如段寄存器寄存器尋址方式簡(jiǎn)單快捷,最常使用例如:MOVEBX,EAX32位通用寄存器:EAXEBXECXEDX……16位通用寄存器:AXBXCXDX……8位通用寄存器:AHALBHBL……62〔例2-9〕寄存器尋址程序

;代碼段000000008AC4 moval,ah0000000266|8BD8 movbx,ax000000058BD8 movebx,eax0000000766|8CDA movdx,ds0000000A66|8EC2 moves,dx

movedi,sieg0209.asm(11):errorA2022:instructionoperandsmustbethesamesize出錯(cuò)了!632.4.3存儲(chǔ)器尋址操作數(shù)在主存中,通過(guò)存儲(chǔ)器地址指示編程時(shí),存儲(chǔ)器地址使用包含段選擇器和偏移地址的邏輯地址段選擇器(段寄存器)指示段基地址默認(rèn)規(guī)定:數(shù)據(jù)在DS指向的數(shù)據(jù)段;EBP或ESP作為基地址,數(shù)據(jù)在SS指向的堆棧段顯式說(shuō)明:使用段超越指令前綴,段寄存器名后跟英文冒號(hào)偏移地址由各種尋址方式計(jì)算常被稱為有效地址EA(EffectiveAddress)641.段寄存器的默認(rèn)和超越訪問(wèn)存儲(chǔ)器的方式默認(rèn)可超越偏移地址取指令CS無(wú)EIP堆棧操作SS無(wú)ESP一般數(shù)據(jù)訪問(wèn)DSCSESSSFSGS有效地址EAEBP基址的尋址方式SSCSESDSFSGS有效地址EA串操作的源操作數(shù)DSCSESSSFSGSESI串操作的目的操作數(shù)ES無(wú)EDI主存操作數(shù)常通過(guò)變量形式引用,一般不需要使用段超越前綴指令652.偏移地址的組成32位有效地址=基址寄存器+(變址寄存器×比例)+位移量基址寄存器:任何8個(gè)32位通用寄存器之一變址寄存器:除ESP外的任何32位通用寄存器之一比例:1,2,4或8位移量:8或32位有符號(hào)值變化出多種主存尋址方式663.直接尋址有效地址只有位移量部分,直接包含在指令代碼中常用于存取變量例如:

MOVECX,[COUNT]

;COUNT是變量

MOVECX,COUNT ;MASM支持

MOVECX,DS:[405000H]指令代碼:8B0D00504000操作碼和尋址方式:8B0D操作數(shù):有效地址00405000H示意圖67存儲(chǔ)器直接尋址返回68〔例2-10〕存儲(chǔ)器直接尋址程序-1

;數(shù)據(jù)段00000000

8749 bvar db87h,49h00000002

123456780000000C dvar dd12345678h,12

;代碼段00000000

8A0D00000000R movcl,[bvar]00000006

8B1500000002R movedx,[dvar]69〔例2-10〕存儲(chǔ)器直接尋址程序-20000000C883500000001R mov[bvar+1],dh0000001266|891500000004R movwordptr[dvar+2],dx00000019C70500000002R87654321 movdwordptr[dvar],87654321h

movdwordptr[dvar+4],dvareg0210.asm(13):errorA2070:invalidinstructionoperands出錯(cuò)了!704.寄存器間接尋址有效地址存放在寄存器中(寄存器內(nèi)容=偏移地址=有效地址)MASM用中括號(hào)括起寄存器可以方便地對(duì)數(shù)組的元素或字符串的字符進(jìn)行操作寄存器間接尋址沒(méi)有說(shuō)明存儲(chǔ)單元類型例如:movedx,[ebx]movcx,[esi]mov[edi],al71〔例2-11〕寄存器間接尋址程序-1 ;數(shù)據(jù)段srcmsg db'Tryyourbest,whynot.',0count equ$-srcmsg ;計(jì)算字符串字符個(gè)數(shù),賦給符號(hào)常量dstmsg dbcountdup(0) ;代碼段

movecx,count ;ECX=字符串字符個(gè)數(shù)

movesi,offsetsrcmsg ;ESI=源字符串首地址

movedi,offsetdstmsg ;EDI=目的字符串首地址72〔例2-11〕寄存器間接尋址程序-2again: moval,[esi] ;取源串一個(gè)字符送AL

mov[edi],al ;將AL傳送給目的串

addesi,1 ;源串指針加1,指向下一個(gè)字符

addedi,1 ;目的串指針加1,指向下一個(gè)字符

loopagain

;字符個(gè)數(shù)ECX減1,不為0,則轉(zhuǎn)到AGAIN標(biāo)號(hào)處執(zhí)行

moveax,offsetdstmsg

calldispmsg ;顯示目的字符串內(nèi)容735.寄存器相對(duì)尋址有效地址是寄存器內(nèi)容與位移量之和也可以方便地對(duì)數(shù)組的元素或字符串的字符進(jìn)行操作例如:

movesi,[ebx+4] ;位移量:4

movedi,[ebp-08h] ;位移量:-08H

movesi,count[esi] ;位移量:COUNT主存以字節(jié)為可尋址單位地址的加減是以字節(jié)為單位74〔例2-12〕寄存器相對(duì)尋址程序 ;數(shù)據(jù)段srcmsg db'Tryyourbest,whynot.',0count equ$-srcmsg ;計(jì)算字符串字符個(gè)數(shù),賦給符號(hào)常量dstmsg dbcountdup(0) ;代碼段

movecx,count ;ECX=字符串字符個(gè)數(shù)

movebx,0 ;EBX指向首個(gè)字符again: moval,srcmsg[ebx] ;取源串一個(gè)字符 movdstmsg[ebx],al ;傳送給目的串

addebx,1 ;加1,指向下一個(gè)字符

loopagain756.變址尋址使用變址寄存器尋址操作數(shù)便于支持兩維數(shù)組等數(shù)據(jù)結(jié)構(gòu)例如: ;基址變址尋址,功能:EDI=DS:[EBX+ESI]

movedi,[ebx+esi] movedi,[ebx][esi] ;相對(duì)基址變址尋址,功能:EAX=DS:[EBX+EDX+80H]

moveax,[ebx+edx+80h] moveax,80h[ebx+edx] moveax,80h[ebx][edx]767.帶比例的變址尋址變址寄存器內(nèi)容乘以比例1(可省略),2,4或8的變址尋址比例1、2、4和8對(duì)應(yīng)8、16、32和64位數(shù)據(jù)的字節(jié)個(gè)數(shù),便于以數(shù)組元素為單位尋址相應(yīng)數(shù)據(jù)例如:

moveax,[ebx*4] ;帶比例的變址尋址

moveax,[esi*2+80h] ;帶比例的相對(duì)變址尋址

moveax,[ebx+esi*4] ;帶比例的基址變址尋址

moveax,[ebx+esi*8-80h] ;帶比例的相對(duì)基址變址尋址772.4.4數(shù)據(jù)尋址的組合立即數(shù)尋址imm(通用)寄存器尋址reg存儲(chǔ)器操作數(shù)尋址mem第2章習(xí)題:數(shù)據(jù)表示和尋址2.1簡(jiǎn)答題(2、3、4、7、8)2.2

判斷題(2、4、8、9、10)2.3

填空題(1、2、3、8、9)2.10、2.14、2.15、2.17第3章通用數(shù)據(jù)處理指令3.1數(shù)據(jù)傳送類指令3.2算術(shù)運(yùn)算類指令3.3位操作類指令第3章通用數(shù)據(jù)處理指令熟悉IA-32處理器通用的基本指令:數(shù)據(jù)傳送指令、算術(shù)運(yùn)算指令邏輯運(yùn)算和移位操作指令掌握指令功能和編程應(yīng)用81學(xué)習(xí)指令的注意事項(xiàng)指令的功能——該指令能夠?qū)崿F(xiàn)何種操作。通常指令助記符就是指令功能的英文單詞或其縮寫(xiě)形式指令支持的尋址方式——該指令中的操作數(shù)可以采用何種尋址方式指令對(duì)標(biāo)志的影響——該指令執(zhí)行后是否對(duì)各個(gè)標(biāo)志位有影響,以及如何影響其他方面——該指令其他需要特別注意的地方,如指令執(zhí)行時(shí)的約定設(shè)置、必須預(yù)置的參數(shù)、隱含使用的寄存器等823.1數(shù)據(jù)傳送類指令數(shù)據(jù)傳送把數(shù)據(jù)從一個(gè)位置傳送到另一個(gè)位置計(jì)算機(jī)中最基本的操作程序設(shè)計(jì)中最常使用的指令除標(biāo)志寄存器傳送指令外,均不影響標(biāo)志位全面而準(zhǔn)確地理解每條指令的功能和應(yīng)用是編寫(xiě)匯編語(yǔ)言程序的關(guān)鍵也是理解處理器如何進(jìn)行數(shù)據(jù)處理的核心833.1.1通用數(shù)據(jù)傳送指令提供方便靈活的通用數(shù)據(jù)傳送操作主要有傳送MOV和交換XCHG指令源操作數(shù)src目的操作數(shù)dest30H30H被傳送的數(shù)據(jù)MOV指令的功能841.傳送指令MOV(move)MOVreg/mem,immMOVreg/mem/seg,regMOVreg/seg,memMOVr16/m16,seg把一個(gè)字節(jié)、字或雙字的操作數(shù) 從源位置傳送至目的位置段寄存器通用寄存器立即數(shù)主存儲(chǔ)器禁止85IA-32指令支持3種數(shù)據(jù)長(zhǎng)度8位(字節(jié))數(shù)據(jù),byte類型

moval,20016位(字)數(shù)據(jù),word類型

mov

ax,[ebx]32位(雙字)數(shù)據(jù),dword類型

mov

eax,[dvar]32位通用寄存器:EAXEBXECX…16位通用寄存器:AXBXCXDX…8位通用寄存器:AHALBHBL…16位段寄存器:DSCSSSES…

86寄存器reg 為目的操作數(shù)

moval,200 ;8位立即數(shù)i8

movax,200 ;16位立即數(shù)i16

moveax,200 ;32位立即數(shù)i32立即數(shù)傳送MOVreg/mem,imm存儲(chǔ)器mem 為目的操作數(shù)

mov[bvar],byte

ptr200 ;8位立即數(shù)i8

mov[ebx],word

ptr200 ;16位立即數(shù)i16

mov[esi+8],dwordptr200 ;32位立即數(shù)i3287MOVreg/mem/seg,reg存儲(chǔ)器mem 為目的操作數(shù)

mov[bvar],cl ;8位通用寄存器r8

mov[ebx],cx ;16位通用寄存器r16

mov[esi+8],edi ;32位通用寄存器r32寄存器傳送寄存器reg 為目的操作數(shù)

mov

al,ah ;8位通用寄存器r8

mov

ax,bx ;16位通用寄存器r16

mov

eax,edx ;32位通用寄存器r32段寄存器seg為目的操作數(shù)

mov

ds,bx88存儲(chǔ)器傳送MOVreg/seg,mem寄存器reg 為目的操作數(shù)

mov

dl,[bvar] ;8位儲(chǔ)存器m8

mov

dx,[ebx] ;16位存儲(chǔ)器m16

mov

edx,dvar[edi] ;32位存儲(chǔ)器m32段寄存器seg 為目的操作數(shù)

mov

ds,[wvar] ;16位存儲(chǔ)器m16

mov

es,[ebx] ;16位存儲(chǔ)器m16

movss,[ebp+8] ;16位存儲(chǔ)器m1689(16位)段寄存器傳送MOVr16/m16,seg寄存器r16 為目的操作數(shù)

mov

ax,ds

mov

dx,es

mov

si,fs

mov

di,gs存儲(chǔ)器m16 為目的操作數(shù)

mov[wvar],ds

mov[ebx],ss

mov[esi-8],cs

mov[ebp+8],cs90傳送指令MOV把一個(gè)字節(jié)、字或雙字的操作數(shù)從源位置傳送至目的位置MOVreg/mem,immMOVreg/mem/seg,regMOVreg/seg,memMOVreg/mem,seg并非任意傳送!無(wú)法翻譯就出錯(cuò)!段寄存器通用寄存器立即數(shù)主存儲(chǔ)器禁止91注意1:雙操作數(shù)必須類型一致MOVESI,DL ;錯(cuò)誤:類型不一致

;ESI為32位寄存器,DL為8位寄存器

movesi,edx ;正確:兩個(gè)32位寄存器傳送MOVAL,050AH ;錯(cuò)誤:類型不一致

;050AH超過(guò)了寄存器AL范圍

moveax,050ah ;正確:雙字量數(shù)據(jù)傳送92注意2:操作數(shù)必須有明確的類型MOV[EBX],255

;錯(cuò)誤:無(wú)明確類型

movbyteptr[ebx],255 ;正確:BYTEPTR說(shuō)明是字節(jié)操作

movwordptr[ebx],255 ;正確:WORDPTR說(shuō)明是字操作

movdwordptr[ebx],255 ;正確:DWORDPTR說(shuō)明是雙字操作93注意3:雙操作數(shù)不允許都是主存單元

;假設(shè)dbuf1和dbuf2是兩個(gè)雙字變量MOV[DBUF2],[DBUF1] ;錯(cuò)誤:兩個(gè)操作數(shù)都是存儲(chǔ)單元

moveax,[dbuf1] ;正確:EAX=DBUF1(將DBUF1內(nèi)容送EAX)

mov[dbuf2],eax

;正確:DBUF2=EAX(將EAX內(nèi)容送DBUF2)94注意4:不可隨意操作專用寄存器MOVDS,@DATA ;錯(cuò)誤:立即數(shù)不能直接傳送段寄存器

;(@DATA是數(shù)據(jù)段地址)

mov

ax,@data

mov

ds,ax ;正確:通過(guò)AX間接傳送給DS952.交換指令XCHG將源操作數(shù)和目的操作數(shù)內(nèi)容交換

XCHGreg,reg/mem

XCHGreg/mem,reg通用寄存器與通用寄存器之間通用寄存器或存儲(chǔ)器之間空操作指令NOP(=XCHGEAX,EAX)處理器執(zhí)行空操作該指令,需要化費(fèi)時(shí)間,在主存中也要占用一個(gè)字節(jié)空間實(shí)現(xiàn)短時(shí)間延時(shí)臨時(shí)占用代碼空間xchg

esi,edixchg

esi,[edi]xchg

al,[var]963.1.2堆棧操作指令“先進(jìn)后出FILO”存取的存儲(chǔ)區(qū)域,只有一個(gè)數(shù)據(jù)出入口,即當(dāng)前棧頂(不斷變化)兩種基本操作數(shù)據(jù)壓進(jìn)堆棧PUSH數(shù)據(jù)彈出堆棧操作POPSS指向堆棧段的起始位置ESP指定棧頂數(shù)據(jù)進(jìn)入堆棧,ESP逐漸減小數(shù)據(jù)依次彈出、ESP逐漸增大Word1Word2Word3Word4Word5StackPUSHPOP示意圖97IA-32處理器堆棧操作返回981.進(jìn)棧指令PUSH

PUSHr16/m16/i16/seg ①ESP=ESP-2②SS:[ESP]=r16/m16/i16/seg

PUSHr32/m32/i32 ①ESP=ESP-4②SS:[ESP]=r32/m32/i32先將ESP減小作為當(dāng)前棧頂后將源操作數(shù)(立即數(shù)、通用寄存器和段寄存器內(nèi)容或存儲(chǔ)器操作數(shù))傳送到當(dāng)前棧頂以字或雙字為單位操作進(jìn)棧雙字量數(shù)據(jù)時(shí),ESP減4進(jìn)棧字量數(shù)據(jù)時(shí),ESP減2pusheax示意圖99進(jìn)棧操作返回1002.出棧指令POP POPr16/m16/seg ①r16/m16/seg=SS:[ESP]②ESP=ESP+2

POPr32/m32 ①r32/m32=SS:[ESP]②ESP=ESP+4

先將棧頂數(shù)據(jù)傳送到目的操作數(shù)(通用寄存器、存儲(chǔ)單元或段寄存器)后ESP增加作為當(dāng)前棧頂以字或雙字為單位操作出棧雙字量數(shù)據(jù)時(shí),ESP加4出棧字量數(shù)據(jù)時(shí),ESP加2popeax示意圖101出棧操作返回102〔例3-1〕堆棧操作程序

;數(shù)據(jù)段ten equ10dvar dd67762000h,12345678h ;代碼段

moveax,[dvar+4]

;EAX=12345678H

pusheax

;將EAX內(nèi)容壓入堆棧

pushdwordptrten

;將立即數(shù)以雙字量壓入堆棧

pushdwordptr[dvar] ;變量DVAR第一個(gè)數(shù)據(jù)入堆

popeax

;棧頂數(shù)據(jù)彈出到EAX

popdwordptr[dvar+4] ;棧頂數(shù)據(jù)彈出到DVAR+4

movebx,[dvar+4]

;EBX=000000AH

popecx

;棧頂數(shù)據(jù)彈出到ECX1033.堆棧的應(yīng)用堆棧不可或缺,被很多指令使用:堆棧操作指令子程序調(diào)用CALL和返回RET,中斷調(diào)用INT和返回IRET等內(nèi)部異常、外部中斷等也利用堆棧堆棧可用來(lái)臨時(shí)存放數(shù)據(jù),以便隨時(shí)恢復(fù)它們常利用堆?;分羔楨BP,隨機(jī)讀寫(xiě)堆棧數(shù)據(jù)利用堆棧實(shí)現(xiàn)主、子程序間傳遞參數(shù)堆棧還常用于子程序的寄存器保護(hù)和恢復(fù)注意入棧和出棧的數(shù)據(jù)要成對(duì),保持堆棧平衡1043.1.3其他傳送指令針對(duì)特定需要設(shè)計(jì)的專用傳送指令地址傳送指令換碼指令標(biāo)志傳送指令……PUSHADPOPADPUSHFDPOPFD……LEA

LDSLES……XLATCLCSTCCMC……1051.地址傳送指令地址傳送指令獲取存儲(chǔ)器操作數(shù)的地址LEAr16/r32,mem

;r16/r32←mem的有效地址EA(不需類型一致)LEA指令類似的地址操作符OFFSET的作用LEA指令在指令執(zhí)行時(shí)計(jì)算出偏移地址OFFSET操作符在匯編階段取得變量的偏移地址OFFSET無(wú)需在執(zhí)行時(shí)計(jì)算、指令執(zhí)行速度更快LEA指令能獲取匯編階段無(wú)法確定的偏移地址leaesi,varmov

edi,offsetvar106〔例3-2〕地址傳送程序

;數(shù)據(jù)段dvar dd41424344h ;代碼段

moveax,[dvar]

;EAX=41424344H

leaesi,dvar

;ESI指向DVAR

movebx,[esi]

;EBX=41424344H

movedi,offsetdvar

;EDI指向DVAR

movecx,[edi]

;ECX=41424344H

leaedx,[esi+edi*4+100h]

;EDX=ESI+EDI×4+100H1072.換碼指令XLAT指令功能:AL←[EBX+AL]將EBX指定的緩沖區(qū)中AL指定的位移處的一個(gè)字節(jié)數(shù)據(jù)取出賦給AL換碼指令執(zhí)行前:在主存建立一個(gè)字節(jié)量表格,內(nèi)含要目的代碼表格首地址存放于EBXAL存放相對(duì)表格首地址的位移量換碼指令執(zhí)行后:將AL寄存器的內(nèi)容轉(zhuǎn)換為目標(biāo)代碼xlat108〔例3-3〕換碼顯示程序-1

;數(shù)據(jù)段num db6,7,7,8,3,0,0,0 ;被轉(zhuǎn)換數(shù)字 countequ$-num ;count等于數(shù)字個(gè)數(shù)tab db'0123456789' ;代碼表 ;代碼段 movecx,count movesi,offsetnum movebx,offsettab ;EBX指向代碼表again: moval,[esi] ;AL=要轉(zhuǎn)換的數(shù)字

xlat ;換碼

calldispc ;顯示

addesi,1 ;指向下一個(gè)數(shù)字

loopagain ;循環(huán)使用XLAT指令109〔例3-3〕換碼顯示程序-2 ;代碼段 movecx,count movesi,offsetnum movebx,offsettab ;EBX指向代碼表again: moveax,0 ;EAX=0

moval,[esi] ;AL=要轉(zhuǎn)換的數(shù)字

addeax,ebx ;EAX=EAX+EBX,指向?qū)?yīng)的字符

moval,[eax] ;換碼

calldispc ;顯示

addesi,1 ;指向下一個(gè)數(shù)字

loopagain ;循環(huán)不使用XLAT指令110〔例3-3〕換碼顯示程序-3 ;代碼段 movecx,count movesi,offsetnumagain: moveax,0 ;EAX=0

moval,[esi] ;AL=要轉(zhuǎn)換的數(shù)字

moval,tab[eax] ;換碼

calldispc ;顯示

addesi,1 ;指向下一個(gè)數(shù)字

loopagain ;循環(huán)寄存器相對(duì)尋址67783000運(yùn)行結(jié)果1113.標(biāo)志傳送指令直接操作標(biāo)志寄存器標(biāo)志位操作指令:直接改變CF、DF、IF標(biāo)志指令功能CLC復(fù)位進(jìn)位標(biāo)志:CF←0STC置位進(jìn)位標(biāo)志:CF←1CMC求反進(jìn)位標(biāo)志:原為0變?yōu)?,原為1變?yōu)?CLD復(fù)位方向標(biāo)志:DF←0,串操作后地址增大STD置位方向標(biāo)志:DF←1,串操作后地址減小CLI復(fù)位中斷標(biāo)志:IF←0,禁止可屏蔽中斷STI置位中斷標(biāo)志:IF←1,允許可屏蔽中斷1123.2算術(shù)運(yùn)算類指令算術(shù)運(yùn)算對(duì)數(shù)據(jù)進(jìn)行加減乘除基本的數(shù)據(jù)處理方法加減運(yùn)算有“和”或“差”的結(jié)果外,還有進(jìn)借位、溢出等狀態(tài)標(biāo)志,也是結(jié)果的一部分注意算術(shù)運(yùn)算類指令對(duì)標(biāo)志的影響掌握:加法和減法指令熟悉:乘法和除法指令理解:零位擴(kuò)展和符號(hào)擴(kuò)展+-*/+-×÷1133.2.1狀態(tài)標(biāo)志狀態(tài)標(biāo)志是處理器最基本的標(biāo)志一方面:作為加減運(yùn)算和邏輯運(yùn)算的輔助結(jié)果另一方面:構(gòu)成各種條件,實(shí)現(xiàn)程序分支8086的標(biāo)志OF111512DF10IF9TF8SF7ZF605AF403PF211CF0114進(jìn)位標(biāo)志CF(CarryFlag)當(dāng)加減運(yùn)算結(jié)果的最高有效位有進(jìn)位(加法)或借位(減法)時(shí),進(jìn)位標(biāo)志置1,即CF=1;否則CF=0針對(duì)無(wú)符號(hào)整數(shù),判斷加減結(jié)果是否超出表達(dá)范圍N個(gè)二進(jìn)制位表達(dá)無(wú)符號(hào)整數(shù)的范圍:0~2N-18位:0~+25516位:0~+6553532位:0~+232-1115進(jìn)位標(biāo)志CF:舉例8位二進(jìn)制數(shù)相加:

00111010+01111100=10110110十六進(jìn)制表達(dá):3A+7C=B6轉(zhuǎn)換成十進(jìn)制數(shù):58+124=182沒(méi)有產(chǎn)生進(jìn)位:CF=08位二進(jìn)制數(shù)相加:

10101010+01111100=[1]00100110十六進(jìn)制表達(dá):AA+7C=[1]26轉(zhuǎn)換成十進(jìn)制數(shù):170+124=294=256+38產(chǎn)生進(jìn)位:CF=10<182<255進(jìn)位1表達(dá)256116溢出標(biāo)志OF(OverflowFlag)有符號(hào)數(shù)加減結(jié)果有溢出,則OF=1;否則OF=0針對(duì)有符號(hào)整數(shù),判斷加減結(jié)果是否超出表達(dá)范圍N個(gè)二進(jìn)制位(補(bǔ)碼)表達(dá)有符號(hào)整數(shù)的范圍:-2N-1~2N-1-18位:-128~+12716位:-32768~+3276732位:-231~+231-1杯中水已滿,再加就溢出!117溢出標(biāo)志OF:舉例8位二進(jìn)制數(shù)相加:

00111010+01111100=10110110十六進(jìn)制表達(dá):3A+7C=B6轉(zhuǎn)換成十進(jìn)制數(shù):58+124=182超出范圍:OF=18位二進(jìn)制數(shù)相加:

10101010+01111100=[1]00100110十六進(jìn)制表達(dá):AA+7C=[1]26轉(zhuǎn)換成十進(jìn)制數(shù):-86+124=38沒(méi)有超出范圍:OF=0182>127補(bǔ)碼AAH表達(dá)-86118進(jìn)位和溢出的區(qū)別進(jìn)位標(biāo)志反映無(wú)符號(hào)整數(shù)運(yùn)算結(jié)果是否超出范圍有進(jìn)位,加上進(jìn)位或借位后運(yùn)算結(jié)果仍然正確溢出標(biāo)志反映有符號(hào)整數(shù)運(yùn)算結(jié)果是否超出范圍有溢出,運(yùn)算結(jié)果已經(jīng)不正確處理器按照無(wú)符號(hào)整數(shù)求得結(jié)果設(shè)置進(jìn)位標(biāo)志CF設(shè)置溢出標(biāo)志OF程序員決定操作數(shù)是無(wú)符號(hào)數(shù),關(guān)心進(jìn)位操作數(shù)是有符號(hào)數(shù),注意溢出119溢出標(biāo)志的判斷處理器硬件判斷規(guī)則最高位和次高位同時(shí)有進(jìn)位或同時(shí)無(wú)進(jìn)位,無(wú)溢出;最高位和次高位進(jìn)位狀態(tài)不同,有溢出人工判斷的簡(jiǎn)單規(guī)則只有當(dāng)兩個(gè)相同符號(hào)數(shù)相加(含兩個(gè)不同符號(hào)數(shù)相減),而運(yùn)算結(jié)果的符號(hào)與原數(shù)據(jù)符號(hào)相反時(shí),產(chǎn)生溢出;其他情況下,不會(huì)產(chǎn)生溢出

00111010+01111100

10110110正數(shù)正數(shù)負(fù)數(shù)最高位次高位120零標(biāo)志ZF(ZeroFlag)運(yùn)算結(jié)果為0,則ZF=1,否則ZF=0結(jié)果是0,ZF標(biāo)志不是0!舉例8位二進(jìn)制數(shù)相加:

00111010+01111100=10110110

結(jié)果不是0,ZF=08位二進(jìn)制數(shù)相加:

10000100+01111100=[1]00000000

結(jié)果是0,ZF=1結(jié)果進(jìn)位121符號(hào)標(biāo)志SF(SignFlag)運(yùn)算結(jié)果最高位為1,則SF=1;否則SF=0舉例8位二進(jìn)制數(shù)相加:

00111010+01111100=10110110

最高位=1:SF=18位二進(jìn)制數(shù)相加:

10000100+01111100=[1]00000000

最高位=0:SF=0結(jié)果進(jìn)位最高位=符號(hào)位=SF122奇偶標(biāo)志PF(ParityFlag)當(dāng)運(yùn)算結(jié)果最低字節(jié)中“1”的個(gè)數(shù)為零或偶數(shù)時(shí),PF=1;否則PF=0舉例8位二進(jìn)制數(shù)相加:

00111010+01111100=10110110

“1”的個(gè)數(shù)為5個(gè):PF=08位二進(jìn)制數(shù)相加:

10000100+01111100=[1]00000000

“1”的個(gè)數(shù)為0個(gè):PF=1結(jié)果進(jìn)位僅最低8位“1”的個(gè)數(shù)1233.2.2加法指令加法指令

ADD帶進(jìn)位加法指令

ADC增量指令I(lǐng)NC除INC不影響進(jìn)位標(biāo)志CF外其他指令按定義影響全部狀態(tài)標(biāo)志位按照運(yùn)算結(jié)果相應(yīng)設(shè)置各個(gè)狀態(tài)標(biāo)志為0或?yàn)?數(shù)據(jù)傳送類指令不影響(=不改變)狀態(tài)標(biāo)志加法和減法指令根據(jù)結(jié)果按定義改變狀態(tài)標(biāo)志1241.加法指令A(yù)DD目的操作數(shù)加上源操作數(shù),和送到目的操作數(shù)

ADDreg,imm/reg/mem ;reg←reg+imm/reg/mem

ADDmem,imm/reg ;mem←mem+imm/reg按照定義影響6個(gè)狀態(tài)標(biāo)志位moveax,0aaff7348h ;EAX=AAFF7348Haddal,27h;EAX=AAFF736FH,OF=0,SF=0,ZF=0,PF=1,CF=0addax,3fffh;EAX=AAFFB36EH,OF=1,SF=1,ZF=0,PF=0,CF=0addeax,88000000h;EAX=32FFB36EH,OF=1,SF=0,ZF=0,PF=0,CF=11252.帶進(jìn)位加法指令A(yù)DC兩個(gè)操作數(shù)相加,再加CF,結(jié)果送目的操作數(shù)ADCreg,imm/reg/mem ;reg←reg+imm/reg/mem+CFADCmem,imm/reg ;mem←mem+imm/reg+CF用于與ADD指令相結(jié)合實(shí)現(xiàn)多精度數(shù)的加法先將兩個(gè)操作數(shù)的低32位相加(用ADD指令)再加高位部分、并將進(jìn)位加到高位(用ADC指令)〔例3-4〕64位數(shù)據(jù)相加程序mov

eax,dword

ptr[qvar1] ;取低32位add

eax,dword

ptr[qvar2] ;加低32位,設(shè)置CFmov

edx,dword

ptr[qvar1+4] ;取高32位adc

edx,dword

ptr[qvar2+4] ;加高32位,同時(shí)加CF1263.增量指令I(lǐng)NC只有一個(gè)操作數(shù):寄存器或存儲(chǔ)單元對(duì)操作數(shù)加1(增量)再將結(jié)果返回原處INCreg/mem

;加1:reg/mem←reg/mem+1用于計(jì)數(shù)器和地址指針的調(diào)整不影響進(jìn)位CF標(biāo)志,影響其他狀態(tài)標(biāo)志位例如incecxincdword

ptr[ebx]incword

ptr[wvar]1273.2.3減法指令減法指令SUB帶借位減法指令SBB減量指令DEC求補(bǔ)指令

NEG比較指令CMP除DEC不影響CF標(biāo)志外其他按定義影響全部狀態(tài)標(biāo)志位數(shù)據(jù)傳送類指令不影響(=不改變)狀態(tài)標(biāo)志加法和減法指令根據(jù)結(jié)果按定義改變狀態(tài)標(biāo)志1281.減法指令SUB目的操作數(shù)減去源操作數(shù),差送到目的操作數(shù)

SUBreg,imm/reg/mem ;reg←reg-imm/reg/mem

SUBmem,imm/reg ;mem←mem-imm/reg按照定義影響6個(gè)狀態(tài)標(biāo)志位

moveax,0aaff7348h

;EAX=AAFF7348H

subal,27h;EAX=AAFF7321H,OF=0,SF=0,ZF=0,PF=1,CF=0

subax,3fffh;EAX=AAFF3322H,OF=0,SF=0,ZF=0,PF=1,CF=0

subeax,0bb000000h;EAX=EFFF3322H,OF=0,SF=1,ZF=0,PF=1,CF=11292.帶借位減法指令SBB目的操作數(shù)減去源操作數(shù),再減CF,結(jié)果送目的操作數(shù)SBBreg,imm/reg/mem ;reg←reg-imm/reg/mem-CFSBBmem,imm/reg ;mem←mem-imm/reg-CF用于與SUB指令相結(jié)合實(shí)現(xiàn)多精度數(shù)的減法先將兩個(gè)操作數(shù)的低32位相減(用SUB指令)然后減高位部分、并減去借位(用SBB指令)1303.減量指令DEC只有一個(gè)操作數(shù):寄存器或存儲(chǔ)單元對(duì)操作數(shù)減1(減量)再將結(jié)果返回原處

DECreg/mem

;減1:reg/mem←reg/mem-1用于計(jì)數(shù)器和地址指針的調(diào)整不影響進(jìn)位CF標(biāo)志,影響其他狀態(tài)標(biāo)志位例如dec

cxdecbyteptr[ebx]decwordptr[wvar]131〔例3-5〕大小寫(xiě)字母轉(zhuǎn)換程序

;數(shù)據(jù)段msg byte'welcome',0 countequ$-msg ;count等于字符個(gè)數(shù) ;代碼段

mov

ecx,count-1 ;ECX等于字符串長(zhǎng)度

movebx,0 ;EBX=0指向頭一個(gè)字母again: submsg[ebx],'a'-'A' ;小寫(xiě)字母減20H轉(zhuǎn)換為大寫(xiě)

incebx ;指向下一個(gè)字母

cmpebx,ecx ;指向下一個(gè)字母

jbeagain ;循環(huán)大寫(xiě)=小寫(xiě)-20H小寫(xiě)=大寫(xiě)+20H1324.求補(bǔ)指令NEG對(duì)操作數(shù)執(zhí)行求補(bǔ)運(yùn)算,即用零減去操作數(shù)

NEGreg/mem ;reg/mem←0-reg/mem對(duì)標(biāo)志的影響與用零作減法的SUB指令一樣可用于對(duì)負(fù)數(shù)求補(bǔ)碼或由補(bǔ)碼求其絕對(duì)值movax,0ff64hnegal

;AX=FF9CH,OF=0,SF=1,ZF=0,PF=1,CF=1subal,9dh ;AX=FFFFH,OF=0,SF=1,ZF=0,PF=1,CF=1negax

;AX=0001H,OF=0,SF=0,ZF=0,PF=0,CF=1decal

;AX=0000H,OF=0,SF=0,ZF=1,PF=1,CF=1negax

;AX=0000H,OF=0,SF=0,ZF=1,PF=1,CF=01335.比較指令CMP將目的操作數(shù)減去源操作數(shù),差值不回送目的操作數(shù),按照減法結(jié)果影響狀態(tài)標(biāo)志

CMPreg,imm/reg/mem ;reg-imm/reg/mem

CMPmem,imm/reg ;mem-imm/reg根據(jù)標(biāo)志狀態(tài)獲知兩個(gè)操作數(shù)的大小關(guān)系給條件轉(zhuǎn)移等指令使用其形成的狀態(tài)標(biāo)志SUB與CMP?ADD與ADC?INC與DEC?SUB與SBB?ADD與SUB?ADC與SBB?DEC與NEG?1343.2.4乘法和除法指令I(lǐng)A-32處理器的乘法和除法指令比較特殊針對(duì)無(wú)符號(hào)數(shù)和有符號(hào)數(shù)有各自的指令有符號(hào)數(shù)指令前用I(sIgned)表示隱含使用EAX(和EDX)寄存器加減指令只進(jìn)行無(wú)符號(hào)數(shù)運(yùn)算利用CF和OF區(qū)別無(wú)符號(hào)數(shù)和有符號(hào)數(shù)1351.乘法指令無(wú)符號(hào)數(shù)乘法指令MUL有符號(hào)數(shù)乘法指令I(lǐng)MUL計(jì)算二進(jìn)制數(shù)乘法:A5H×64H用

溫馨提示

  • 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)論