




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第三章 8088匯編語(yǔ)言程序設(shè)計(jì)本章的主要內(nèi)容是匯編語(yǔ)言語(yǔ)句行的構(gòu)成,源程序的結(jié)構(gòu),匯編語(yǔ)言程序設(shè)計(jì)方法。3.1 重點(diǎn)與難點(diǎn)本章的學(xué)習(xí)重點(diǎn)是結(jié)構(gòu)化程序設(shè)計(jì)思想,順序、分支、循環(huán)結(jié)構(gòu)的程序設(shè)計(jì),子程序結(jié)構(gòu)的設(shè)計(jì)與調(diào)用,中斷指令的應(yīng)用。另外,匯編語(yǔ)言偽指令的使用、源程序的結(jié)構(gòu)等也是必須掌握的。3.1.1 匯編語(yǔ)言語(yǔ)句行的構(gòu)成1.標(biāo)記(1)標(biāo)識(shí)符:由數(shù)字、字母和下劃線組成,且不能以數(shù)字開(kāi)頭,最大長(zhǎng)度不超過(guò)31個(gè)字符。(2)保留字:匯編語(yǔ)言中保留下來(lái)的具有特殊用途的字串,如指令、偽指令、寄存器名等都是保留字。保留字不可用作標(biāo)識(shí)符。(3)界符:程序或指令中兩個(gè)部分的分隔符號(hào)。匯編語(yǔ)言源程序中可用的界符:
2、 ; , : ? $ ( ) + - = * / ·(4)常量:數(shù)字常量,可以使用不同的進(jìn)制d、b、h、q;字符串常量,由引號(hào)引起來(lái)的字符串,相當(dāng)給出字符所對(duì)應(yīng)的ascii碼串。2.符號(hào)及其屬性(1)寄存器:8086/8088 cpu的寄存器可以作為指令的操作數(shù)。(2)變量:即內(nèi)存單元的符號(hào)地址。變量不能與保留字、段名重名。它有三個(gè)屬性:段屬性,指變量所在段的段地址;偏移量,指變量所在段的起始地址到變量地址之間的字節(jié)數(shù),即偏移(有效、邏輯)地址。類型,指指變量具有的字節(jié)數(shù),包括byte、word、dword、qword和tbyte等。(3)標(biāo)號(hào):即代碼段中某條指令的符號(hào)地址,由編程者
3、根據(jù)需要確定的。標(biāo)號(hào)不能與保留字重名,可使用字母、數(shù)字及下劃線,但不允許用數(shù)字開(kāi)頭,字符個(gè)數(shù)不超過(guò)31個(gè)。標(biāo)號(hào)作為符號(hào)地址也有三個(gè)屬性:段、偏移量和類型(near、far)。3.表達(dá)式表達(dá)式是作為語(yǔ)句的一個(gè)操作數(shù),在匯編時(shí)一個(gè)表達(dá)式得到一個(gè)值。(1)操作數(shù)數(shù)據(jù)常數(shù)、符號(hào)常量;存儲(chǔ)單元地址常用符號(hào)地址表示。(2)運(yùn)算符算術(shù)運(yùn)算符:+、-、*、/、mod。對(duì)地址的運(yùn)算僅有+(加)、-(減)運(yùn)算符。邏輯運(yùn)算符:and、or、not和xor。注意,不要將其和同樣名稱的指令操作碼相混淆。關(guān)系運(yùn)算符:eq、ne、lt、gt、le和ge。參與關(guān)系運(yùn)算的兩個(gè)操作數(shù)必須都是數(shù)值,或同一段中的兩個(gè)存儲(chǔ)單元地址,運(yùn)
4、算結(jié)果為0ffffh(真,true)或0(假,false)。分析運(yùn)算符:0ffset取一個(gè)標(biāo)號(hào)或變量的偏移地址;seg取一個(gè)標(biāo)號(hào)或變量所在段的段地址;type取變量和標(biāo)號(hào)的類型(byte、word、dword或near、far);size計(jì)算一個(gè)存儲(chǔ)區(qū)的字節(jié)總數(shù);length計(jì)算存儲(chǔ)區(qū)中數(shù)據(jù)單元的數(shù)目,只對(duì)數(shù)據(jù)定義中的dup操作有效。 綜合運(yùn)算符:ptr用于暫時(shí)改變變量或標(biāo)號(hào)的原有屬性,只在當(dāng)前語(yǔ)句中有效;this和ptr類似,用于改變存儲(chǔ)區(qū)的類型;short指定一個(gè)標(biāo)號(hào)為短標(biāo)號(hào)。4.語(yǔ)句指令語(yǔ)句:主要由cpu指令組成,每條語(yǔ)句在匯編過(guò)程中都會(huì)產(chǎn)生對(duì)應(yīng)的目標(biāo)代碼。偽操作或偽指令語(yǔ)句:為匯編程序
5、提供信息,讓匯編程序在匯編過(guò)程中執(zhí)行特定的功能。兩者本質(zhì)區(qū)別在于,偽指令在匯編過(guò)程中不形成任何代碼。這里僅對(duì)偽指令進(jìn)行總結(jié)。(1)符號(hào)定義偽指令(賦值語(yǔ)句)格式:符號(hào)常量 equ 表達(dá)式或 符號(hào)常量 表達(dá)式功能:把表達(dá)式的值賦給符號(hào)名。說(shuō)明:在程序中,用equ語(yǔ)句賦值的符號(hào)名不能被重新賦值,但用“”號(hào)賦值的符號(hào)名可以被重新賦值。若要重新賦值,必須使用解除偽指令purge。(2)內(nèi)存數(shù)據(jù)定義偽指令格式:變量名 數(shù)據(jù)定義 表達(dá)式或數(shù)據(jù)項(xiàng)表功能:可為數(shù)據(jù)項(xiàng)分配存儲(chǔ)單元,并根據(jù)需要設(shè)置其初值。還可用符號(hào)代表數(shù)據(jù)項(xiàng)。說(shuō)明:數(shù)據(jù)定義符有字節(jié)db、單字dw、雙字dd、8字節(jié)dq、10字節(jié)dt;dup()表示
6、數(shù)據(jù)重復(fù),“$”表示地址計(jì)數(shù)器當(dāng)前值,“?”用于預(yù)留存儲(chǔ)空間;數(shù)據(jù)項(xiàng)允許為字符串。(3)段定義偽指令格式:段名segment 定位方式連接方式類別名 段體段名 ends功能:為程序匯編和鏈接說(shuō)明了段名、分段的各種屬性以及分段的開(kāi)始和結(jié)束。段名是自定義符,開(kāi)始的段名與結(jié)束的段名必須相同。段的長(zhǎng)度不超過(guò)64kb。屬性參數(shù)定義:定位方式,指定段的起始地址邊界。有四種方式:頁(yè)邊界page、段邊界para(系統(tǒng)隱含)、字邊界word、字邊界byte。連接方式,告訴連接程序本段與其他段的連接方式。系統(tǒng)隱含為不寫,表示本段不與任何段鏈接。stack表示此段為堆棧段。類別名,是合法的自定義符,長(zhǎng)度不超過(guò)40。
7、凡是類別名相同的段在連接時(shí)均按先后順序連接在相鄰存儲(chǔ)區(qū)中。說(shuō)明:段名的命名規(guī)則和變量名以及標(biāo)號(hào)一樣;單模塊程序中屬性參數(shù)可省略不寫。 (4)段址寄存器說(shuō)明偽指令格式:assume 段寄存器:段定義名1,段寄存器:段定義名2,功能:告訴匯編程序在匯編時(shí),段寄存器cs、ds、ss和es應(yīng)具有的符號(hào)段基址。段寄存器實(shí)際值(cs除外)由傳送指令在執(zhí)行程序時(shí)賦值。(5)過(guò)程(子程序)定義偽指令格式:過(guò)程名 proc near(或far) 過(guò)程名 endp說(shuō)明:過(guò)程名是自定義符。調(diào)用格式為:call 過(guò)程名過(guò)程中的ret指令,實(shí)現(xiàn)從過(guò)程返回調(diào)用處。選near,過(guò)程是段內(nèi)調(diào)用,過(guò)程中的ret是段內(nèi)返回。選f
8、ar,過(guò)程是段間調(diào)用,過(guò)程中的ret是段間返回。系統(tǒng)默認(rèn)是近過(guò)程。(6)模塊開(kāi)始偽指令格式:name 模塊名功能:該偽指令指明程序模塊的開(kāi)始,并指出模塊名。模塊名是自定義符,不能與系統(tǒng)保留字同名。每次匯編只能出現(xiàn)一次。若該偽指令不寫,則取title語(yǔ)句中的頁(yè)標(biāo)題前6個(gè)字符;若沒(méi)有title語(yǔ)句,則取源程序文件名為模塊名。(7)建立標(biāo)題偽指令格式:title 標(biāo)題功能:建立每頁(yè)標(biāo)題。(8)模塊結(jié)束偽指令格式:end 啟動(dòng)標(biāo)號(hào)或過(guò)程名功能:告訴匯編程序源文件結(jié)束,并給出執(zhí)行程序的入口。僅用于主模塊才有意義。(9)定位偽指令格式:org 表達(dá)式功能:把該偽指令以下所定義的內(nèi)存數(shù)據(jù)或程序,從表達(dá)式的值
9、所指定的起點(diǎn)開(kāi)始連續(xù)存放,直至遇到新的org指令。表達(dá)式的值是一個(gè)無(wú)符號(hào)數(shù)。(10)系統(tǒng)隱含進(jìn)位制偽指令格式:radix 表達(dá)式功能:定義在源程序中書寫數(shù)據(jù)時(shí)隱含進(jìn)位制方式。表達(dá)式的值是216之間的十進(jìn)制數(shù),要遇到新的radix偽指令以后才改變隱含進(jìn)位制。3.1.2 匯編語(yǔ)言源程序的結(jié)構(gòu)1.源程序結(jié)構(gòu)8088匯編語(yǔ)言源程序采用分段結(jié)構(gòu)的形式,一個(gè)完整的匯編語(yǔ)言源程序通常由若干個(gè)邏輯段組成,包括數(shù)據(jù)段、附加數(shù)據(jù)段、堆棧段和代碼段。 2源程序基本框架dseg segment ;數(shù)據(jù)定義(db/dw/dd)dseg endseseg segment eseg endssseg segment sta
10、ckdw 512 dup(?);堆棧段大小為1024bsseg endscseg segment assume cs:cseg,ds:dseg,es:eseg;指定段寄存器與段之間的對(duì)應(yīng)關(guān)系start:mov ax,dseg mov ds,axmov ax,esdgmov es,ax;ds、es段寄存器初始化 ;程序部分mov ax,4c00h;8088/8086為mov ah,4chint 21h;程序結(jié)束,返回doscseg ends end start說(shuō)明:cs段寄存器的初值,由系統(tǒng)自動(dòng)指定為end后的地址; es段寄存器的初值,可以用類似ds的方法設(shè)置,或由系統(tǒng)指定為定義了stack屬
11、性的段。若未定義堆棧段,則系統(tǒng)默認(rèn)使用系統(tǒng)堆棧。3.1.3 匯編語(yǔ)言程序設(shè)計(jì)的方法1.順序結(jié)構(gòu)程序設(shè)計(jì)的方法順序結(jié)構(gòu)是最基本的結(jié)構(gòu)。其特點(diǎn)是cpu按指令排列的順序逐條執(zhí)行。2.分支(選擇)結(jié)構(gòu)程序設(shè)計(jì)的方法分支結(jié)構(gòu),根據(jù)不同的條件轉(zhuǎn)到不同的程序段執(zhí)行。3.循環(huán)結(jié)構(gòu)程序設(shè)計(jì)的方法循環(huán)結(jié)構(gòu),完成需要重復(fù)執(zhí)行的工作。通常由三部分組成:初始化部分,完成對(duì)地址指針寄存器、計(jì)寄存器等循環(huán)中用到的寄存器及存儲(chǔ)器置初值;循環(huán)體,完成需重復(fù)執(zhí)行的工作;循環(huán)控制,用于判斷循環(huán)是否結(jié)束,若結(jié)束則跳出循環(huán),未結(jié)束則修改地址指針和計(jì)數(shù)器值,為下一輪循環(huán)做準(zhǔn)備。4混合結(jié)構(gòu)程序設(shè)計(jì)方法混合結(jié)構(gòu)程序設(shè)計(jì)是指上述三種設(shè)計(jì)方法的
12、組合應(yīng)用,也是程序設(shè)計(jì)中最常用的方法, 5子程序的設(shè)計(jì)方法子程序(或過(guò)程)是完成某項(xiàng)特殊功能的程序模塊,可以在程序中的任何地方多次被調(diào)用。用call指令調(diào)用子程序,用ret指令返回主程序;用偽指令proc和endp定義子程序。主、子程序關(guān)系retcall子程序主程序 (1)參數(shù)傳遞方式通過(guò)寄存器傳遞,適用于傳遞參數(shù)個(gè)數(shù)少的情況;通過(guò)程序存儲(chǔ)器中的參數(shù)表傳遞,在主程序中把要傳送的參數(shù)直接放在調(diào)用指令的后面,而在子程序中到堆棧中取返回地址,以獲得參數(shù)。通過(guò)堆棧傳遞,適用于參數(shù)較多,且子程序有嵌
13、套、遞歸調(diào)用的情況。主程序?qū)⒁獋鬟f的參數(shù)壓入堆棧,子程序中再將這些參數(shù)從堆棧中彈出。(2)寄存器和存儲(chǔ)單元的內(nèi)容保護(hù)(保護(hù)現(xiàn)場(chǎng))在主程序中用到的寄存器或存儲(chǔ)單元,要在子程序里被用到,而主程序并不希望這些單元的內(nèi)容被修改,此時(shí)必須在子程序入口處將這些單元內(nèi)容壓入堆棧保護(hù)起來(lái)。6其它設(shè)計(jì)方法介紹(1)dos和bios中斷功能調(diào)用dos和bios為用戶提供了兩組系統(tǒng)服務(wù)程序,用戶可以采用軟中斷指令int n來(lái)調(diào)用。dos調(diào)用與bios調(diào)用相比,不依賴于硬件,通用性較好,但執(zhí)行效率較低。dos和bios中斷功能調(diào)用的使用方法如圖所示:置功能號(hào)n (ah)置入口參數(shù)執(zhí)行int 21h分析出口參數(shù)(2)宏
14、指令條件匯編條件偽操作的一般格式如下:if條件(語(yǔ)句組1)else;可選的(語(yǔ)句組2)endif如果條件為真,則匯編語(yǔ)句組1,否則如有else則匯編語(yǔ)句組2,如無(wú)else則不生成條件塊。endif表示結(jié)束條件匯編。下表給出了匯編語(yǔ)言的條件偽操作及其意義。 表3 條件偽操作及其意義 條件偽操作意義if表達(dá)式如果匯編程序求出的表達(dá)式非0,條件為真ife表達(dá)式如果匯編程序求出的表達(dá)式等于0,條件為真if1如果是第一遍掃描,條件為真if2如果是第二遍掃描,條件為真ifdef符號(hào)如果符號(hào)在程序中有定義或被說(shuō)明為extrn,條件為真if
15、ndef符號(hào)如果符號(hào)在程序中無(wú)定義或未用extrn說(shuō)明,條件為真ifb變?cè)绻冊(cè)强瞻追?,條件為真(變?cè)髱Ъ饫ㄌ?hào))ifnb變?cè)绻冊(cè)皇强瞻追?,條件為真ifidn變?cè)?,變?cè)?如果變?cè)?的字符串和變?cè)?的字符串相同,條件為真ifnidn變?cè)?,變?cè)?如果變?cè)?的字符串和變?cè)?的字符串不同,條件為真 3.2 例題解析1偽指令與指令的區(qū)別是什么?答:指令是在程序運(yùn)行期間由cpu執(zhí)行的,匯編后由對(duì)應(yīng)的機(jī)器代碼所代替。偽指令是不可執(zhí)行的,它只在源程序匯編期間由匯編器處理的命令,用來(lái)指示匯編器為數(shù)據(jù)分配內(nèi)存空間,或是為匯編器提供源程序結(jié)束或段定義等信息。二者本質(zhì)區(qū)別在于,偽指令在匯編過(guò)
16、程中不形成任何代碼。2.設(shè)有數(shù)據(jù)段如下:datasegment buf1db1, 6, 3, 90h,a,g,v buf2dw567, 9087, 100 dup(?), 1, 4, buf3dw100 dup(?)dataends試確定下列指令執(zhí)行后寄存器ax的值。(1)mov ax, type buf1(2)mov ax, type buf2(3)mov ax, size buf1(4)mov ax, size buf2(5)mov ax, size buf3(6)mov ax, length buf1(7)mov ax, length buf2(8)mov ax, length buf3
17、解: length運(yùn)算僅對(duì)數(shù)據(jù)定義中的dup操作有意義。(1)ax=1(2)ax=2(3)ax=7(4)ax=208(5)ax=200(6)ax=1(7)ax=1(8)ax=1003.已知數(shù)據(jù)段定義如下:data segment d01 dw 1580h d01_adr dw d01data ends請(qǐng)給出下列指令執(zhí)行后bx的值。xor si, simov bx, d01 ;(1) mov bx, d01+2 ;(2) mov bx, si+d01 ;(3) mov bx, offset d01;(4) lea bx, d01+2;(5)解:(1)bx=1580h (相當(dāng)于mov bx, 00
18、00)(2)bx=0000h (相當(dāng)于mov bx,0000+2)(3)bx=1580h (相當(dāng)于mov bx,si+0 (4)bx=0000h (5)bx=0002h 4.設(shè)有如下定義:var dw 10 dup(?) 分別用label、ptr、this和equ實(shí)現(xiàn)將var的第0字節(jié)置0。解:(1) var0 label byte var dw 10 dup(?) mov var0, 0(2) var dw 10 dup(?) mov byte ptr var, 0(3) var0 equ this byte var dw 10 dup(?) mov var0, 06采用查表法,實(shí)現(xiàn)一位16
19、進(jìn)制數(shù),轉(zhuǎn)換為ascii碼顯示。解:將0f的ascii碼順序存放在數(shù)據(jù)區(qū)中,一個(gè)十六進(jìn)制數(shù)本身恰好是其對(duì)應(yīng)的ascii碼在數(shù)據(jù)區(qū)中的偏移量。源程序如下:dseg segmentasc db 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h ;09的ascii碼db 41h,42h,43h,44h,45h,46h ;af的ascii碼hex db 04h,0ah ;設(shè)兩個(gè)數(shù)據(jù)dseg endscseg segment assume cs:cseg, ds:dsegstart: mov ax, dseg mov ds, axmov bx, offset asc;bx指
20、向ascii碼表mov al, hex;al取得一位16進(jìn)制數(shù),也是ascii碼表中的偏移and al, 0fh;只有低4位有效,高4位清0xlat;換碼:alds:bxalmov dl, al;入口參數(shù):dlalmov ah, 2;02號(hào)dos功能調(diào)用int 21h;顯示一個(gè)ascii碼字符mov al, hex+1;轉(zhuǎn)換并顯示下一個(gè)數(shù)據(jù)and al, 0fhxlatmov dl, almov ah, 2int 21hmov ah, 4chint 21hcseg ends end start7設(shè)內(nèi)存中有三個(gè)互不相等的無(wú)符號(hào)字?jǐn)?shù)據(jù),分別是放在da開(kāi)始的字單元,編制程序?qū)⑵渲凶畲笾荡嫒雖ax單元
21、。解: 數(shù)1和數(shù)2比較,將較大的數(shù)再與數(shù)3比較,就可以求三個(gè)無(wú)符號(hào)數(shù)中的最大值。源程序如下:dseg segmentda dw 348ah, 5612h, 490ehmax dw ?desg endscseg segment assume cs:cseg,ds:dsegstart: mov ax, dseg mov ds, axlea si, da mov ax, si;ax數(shù)1 mov bx, si+2;bx數(shù)2 cmp ax, bx ;比較ax、bx,確保ax較大的數(shù)jae max1mov ax, bxmax1: cmp ax, si+4jae max2 mov ax, si+4max2:
22、 mov max,axmov ah, 4chint 21hcseg ends end start8在數(shù)據(jù)段定義首地址為a的10個(gè)字符,將這10個(gè)字符以相反次序傳送到附加段首地址為b的內(nèi)存單元中。解:源程序如下:dseg segmenta db 0123456789b db 10 dup(?)dseg endscseg segment assume cs:cseg, ds:dseg, es:dsegstart: mov ax, dseg mov ds, ax mov es, axlea si, a;ds:si指向a數(shù)據(jù)區(qū)的首字符 lea di, b add di, 9;es:di指向b數(shù)據(jù)區(qū)的末
23、字符 mov cx, 10;循環(huán)次數(shù)為10次move: cld lodsb;按地址遞增方向讀取a數(shù)據(jù)區(qū)中的字符 std stosb;按地址遞減方向?qū)⒆址嫒隻數(shù)據(jù)區(qū)中 loop move mov ah, 4ch int 21h;結(jié)束程序,返回doscseg ends end start 9編寫程序,將無(wú)符號(hào)數(shù)10, 25, 16, 2, 18, 20, 3, 9, 11, 15由小到大排序。解:采用“冒泡法”排序。(1)第1輪,從第1個(gè)元素開(kāi)始,依次對(duì)相鄰的兩個(gè)元素進(jìn)行比較,使前一個(gè)元素不大于后一個(gè)元素。比較9次后,最大的1個(gè)元素就排到了最后。(2)第2輪,除掉最后1個(gè)元素,其他元素
24、依上述方法再進(jìn)行比較,比較8次后,得到次大的元素排在后面,即已有2個(gè)元素排好順序。(3)第9輪,除去第8輪后面已排好順序的8個(gè)元素,剩下的第1個(gè)元素和第2個(gè)元素進(jìn)行1比較,較大的排在后面,從而完成了整個(gè)排序過(guò)程。 這是一個(gè)循環(huán)次數(shù)已知的雙重循環(huán)程序。外層循環(huán)次數(shù)(即輪數(shù))為數(shù)據(jù)總數(shù)減1,每一輪的內(nèi)層循環(huán)次數(shù)等于當(dāng)前輪的剩余外循環(huán)次數(shù)。10個(gè)數(shù)據(jù),第1輪,外循環(huán)次數(shù)為9,內(nèi)循環(huán)次數(shù)為9;第2輪中外循環(huán)剩余8次,內(nèi)循環(huán)次數(shù)等于8,依次類推。源程序如下:dseg segmentarray db 10, 25, 16, 2, 18, 20, 3, 9, 11, 15count equ ($-array
25、)/(type array);計(jì)算元素的個(gè)數(shù)dseg endscseg segment assume cs:cseg, ds:dsegstart: mov ax, dseg mov ds, ax mov cx, count;cx數(shù)組元素個(gè)數(shù) dec cx ;外循環(huán)次數(shù)outlp:mov dx, cx ;dx內(nèi)循環(huán)次數(shù) mov bx, offset arrayinlp:mov al, bx ;取前一個(gè)元素 cmp al, bx+1;與后一個(gè)元素比較 jna next ;前一個(gè)不大于后一個(gè)元素,則不進(jìn)行交換 xchg al, bx+1;否則,進(jìn)行交換 mov bx, alnext: inc bx;
26、下一對(duì)元素 dec dx jnz inlp;內(nèi)循環(huán) loop outlp;外循環(huán) mov ah, 4ch int 21h ;結(jié)束程序,返回doscseg ends end start 3.3 習(xí)題與參考答案1. 設(shè)有數(shù)據(jù)段如下:datasegmentbuffer1db1,6,3,90h,a,g,vbuffer2dw567,9087,100 dup(?),1,4,buffer3dw100 dup(?)buffer4dw100 dup(?),45,65,100,2000hdataends試確定下列指令執(zhí)行后寄存器ax的值。(1)movax,type b
27、uffer1(2)movax,type buffer2(3)movax,size buffer1(4)movax,size buffer2(5)movax,length buffer1(6)movax,length buffer2(7)movax,length buffer3(8)movax,length buffer42. 設(shè)有數(shù)據(jù)段如下:datasegmentorg1000hval1db23,13,45h,5ahval2db51 dup(0)org1500hval3dw23,3fh,$-6,1,4,8,$+34,10dataends假定經(jīng)匯編和鏈接后,分配給data的實(shí)際段地址為3000h
28、。試確定下列指令執(zhí)行后寄存器bx的內(nèi)容。(1)movbx,offset val2(2)movbx,seg val3(3)movbx,val3+4(4)movbx,val3+123. 假設(shè)下列指令中的所有標(biāo)識(shí)符均是類型屬性為字的變量名,請(qǐng)指出下列指令中哪些是合法的,哪些是非法的?它們的錯(cuò)誤是什么?(1) movbp,al(2) movword_opbx+4*3di,sp(3) movword_op1,word_op2(4) movax,word_op1dx(5) movsave_word,ds(6) mov sp,ss:data_wordbxsi(7) movbxsi,2(8) movax,wo
29、rd_op1+word_op2(9) movax,word_op1-word_op2+100(10)movword_op1,word_op1-word_op24. 執(zhí)行下面的程序后,(a)= ?datasegment adw0 bdw0 cdw10,20,30dataendscodesegmentassumecs:code,ds:datastartprocfarpushdsxorax,axpushaxmovax,datamovds,axleabx,cmovax,bxmovb,axmovax,2bxaddax,bmova,axretstartendpcodeendsendstart5. 已知小寫
30、字母的ascii碼的d5=1,大寫字母的ascii碼的d5=0,閱讀下列程序,試說(shuō)明其完成的功能,并畫出程序流程圖。datsegsegment err1dbinput is error!,0dh,0ah,$datsegendscodsegsegmentassumecs:codseg,ds:datsegstart:movax,datsegmovds,axmovah,1int21hcmpal,ajbnextcmpal,zjanextandal,0dfhmovdl,almovah,2int21hnext:movdx,eer1movah,9int21hmovah,4chint21hcodsegends
31、endstart6. 已知以block為首地址的存儲(chǔ)區(qū)內(nèi)存放了100個(gè)帶符號(hào)的字?jǐn)?shù)據(jù),閱讀以下的程序,試說(shuō)明其完成的功能,并畫出程序流程圖。datsegsegmentblockdw0123h,0a65bh,7078h,9802h,8974h,countequ$-blockdatsegendscodsegsegmentassumecs:codseg,ds:datsegstart:movax,datsegmovds,axmovdx,countshrdx,1lop1:movcx,dxmovsi,0lop2:movax,blocksicmpax,blocksi+2jgenextxchgax,block
32、si+2movblocksi,axnext:addsi,2looplop2decdxjnzlop1movah,4chint21hcodsegendsendstart7. 自1000h單元開(kāi)始有一個(gè)100個(gè)字?jǐn)?shù)據(jù),若要把這批數(shù)據(jù)傳送到自2000h開(kāi)始的存儲(chǔ)區(qū)中,可以采用下列三種方法實(shí)現(xiàn),試分別編制程序段以實(shí)現(xiàn)數(shù)據(jù)串的傳送。(1)不用串處理指令;(2)用單個(gè)傳送的串處理指令;(3)用rep前綴與串處理指令配合。8. 編寫一個(gè)程序,把自1000h單元開(kāi)始的100個(gè)字節(jié)數(shù)據(jù)傳送到自1050h開(kāi)始的存儲(chǔ)區(qū)中去。(注意:數(shù)據(jù)區(qū)有重疊)9. 自0500h單元開(kāi)始,存有100個(gè)數(shù)。要求把它傳送到1000h開(kāi)始
33、的存儲(chǔ)區(qū)中去,但在傳送過(guò)程中要檢查數(shù)的值,遇到第一個(gè)零就停止傳送。10.在以array為首地址的字節(jié)數(shù)組中,有100個(gè)無(wú)符號(hào)數(shù)。編一個(gè)程序求這100個(gè)數(shù)據(jù)的偶數(shù)之和與奇數(shù)之和,并把兩個(gè)和分別放在sum_e與sum_o單元中(和用兩字節(jié)表示)。11.在以array為首地址的字?jǐn)?shù)組中,有100個(gè)帶符號(hào)數(shù)。編一個(gè)程序把其中的最大偶數(shù)挑出來(lái),存放在max單元中。12.編制一個(gè)程序,計(jì)算100個(gè)正整數(shù)(字?jǐn)?shù)據(jù))之和,如果不超過(guò)機(jī)器數(shù)的范圍(65535),則計(jì)算其平均值并存于result,否則顯示“overflow”。13.若在存儲(chǔ)器中有數(shù)a、b、c、d(它們連續(xù)存放),編一個(gè)程序?qū)崿F(xiàn)下面的運(yùn)算:(a
34、215;10+b)×10+c)×10+d(和65535)注:a×10=a×2+a×8,可用邏輯左移指令實(shí)現(xiàn)乘法運(yùn)算。14.設(shè)在變量x、y、z中存放有三個(gè)數(shù),若三個(gè)數(shù)都不為0,則將三個(gè)數(shù)之和存入u中;若有一個(gè)為0,則將其它兩個(gè)單元也清0。試編寫此程序。15.在緩沖區(qū)buffer連續(xù)放著100個(gè)學(xué)生的數(shù)學(xué)成績(jī),編程序統(tǒng)計(jì)其中85100、6084、60分以下者各有多少人,并把結(jié)果存到result開(kāi)始的三個(gè)字節(jié)單元。 參考答案:1.(1)1 (2)2 (3)7 (4)208 (5)1 (6)1 (7) 100(8) 1002.(1)1004h
35、 (2)3000h (3)14feh (4)152eh3.(1)錯(cuò)。數(shù)據(jù)類型不匹配。 (2)對(duì)。 (3)錯(cuò)。兩操作數(shù)必須有一個(gè)采用寄存器尋址方式。(4)錯(cuò)。dx不作變址用。(5)對(duì)。(6)對(duì)。(7)錯(cuò)。目的操作數(shù)應(yīng)為 word ptr bxdi,即必須指明其數(shù)據(jù)類型。(8)錯(cuò)。符號(hào)地址與符號(hào)地址不能相加,此處必須為立即數(shù)。(9)對(duì)。(10)對(duì)。4. (a)= 30yynn鍵盤輸入字符 (al)startend轉(zhuǎn)換: (al) dfh (al)(al)< a?(al) >z?屏幕顯示錯(cuò)誤信息屏幕輸出大寫字母5. 答:此程序的功能是,將鍵盤輸入的小寫字母轉(zhuǎn)換成大寫字母在屏幕上顯示出來(lái)。
36、其流程圖如下: 6.答:其功能是,采用冒泡法將100個(gè)數(shù)據(jù)從大到小排序。其流程圖如下: yynn初始化:指針si指向塊首塊長(zhǎng)度÷2送dxstartend(dx)(cx)(ax)下一數(shù)?(cx)= 0 ??jī)蓴?shù)交換(si)+2 (si)取一個(gè)16位數(shù)(ax)(cx)-1(cx)(dx)-1(dx)(dx)= 0 ?yn &
37、#160; 7. 解:編程如下:(1)不用串處理指令,程序段如下:mov si,1000hmov di,2000hmov cx,100again:mov ax,simov word ptr di,axadd si,2add di,2loop again(2)用單個(gè)傳送的串處理指令,程序段如下:mov si,1000hmov di,2000hmov cx,100cldagain:lodswstoswloop again(3) 用re
38、p前綴與串處理指令配合,程序段如下:mov si,1000hmov di,2000hmov cx,100cldrep movsw8.解:對(duì)于源區(qū)和目的區(qū)有重疊的數(shù)據(jù)快的搬運(yùn),應(yīng)從數(shù)據(jù)快的底部開(kāi)始,程序如下:datasegmentorg 1000hdata1db1,2,3,50 dup(?)dataendscodesegmentassumecs:code,ds:data,es:datastart:mov ax,datamov ds,axmov es,axmov cx,100lea si,data1+99lea di,data+149stdrep movsbmov ah,4chint 21hcod
39、eendsend start 9. 解:源程序如下:datasegmentorg0500hbuffer1dbx1,x2,x3,x100org1000hbuffer2db100 dup(?)dataendsstacksegmentparastackstackdb100 dup(?)stackendscodesegmentassumecs:code,ds:data,es:data,ss:stackstartprocfarbegin:pushdsmovax,0pushaxmovax,datamovds,axmoves,axmovax,stackmovss,axmovcx,100cldlea
40、si,buffer1leadi,buffer2again:lodsbcmpal,0jestopstosbloopagainstop:retstartendpcodeendsendbegin 10. 解:源程序如下:datasegmentarraydbx1,x2,x100sum_edb2 dup(0)sum_odb2 dup(0)dataendscodesegmentassumecs:code,ds:datastart:movax,datamovds,axmovsum_e,0movsum_e+1,0movsum_o,0movsum_o+1,0movcx,100movbx,0again:
41、moval,arraybxtestal,01hjnz oddaddsum_e,aladcsum_e+1,0jmpshort addrodd:addsum_o,aladcsum_o+1,0addr:incbxloopagainmovah,4chint21hcodeendsendstart 11.解:編程如下:datasegmentmemdwx1,x2,x100maxdw?dataendscodesegmentassumecs:code,ds:databegin:movax,datamovds,axleasi,memmovcx,100cldlodswmovmax,axdeccxnext:lodswtestax,0001hjnznnopcmpax,maxj
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度律師起草環(huán)境保護(hù)協(xié)議起草及審查收費(fèi)標(biāo)準(zhǔn)合同
- 2025年度合同主體變更審批流程與責(zé)任追究規(guī)范
- 2025年度養(yǎng)老服務(wù)行業(yè)退休人員勞務(wù)聘用合同
- 2025年度專業(yè)市場(chǎng)營(yíng)業(yè)場(chǎng)所租賃合同
- 2025年度文化創(chuàng)意產(chǎn)業(yè)投資合作協(xié)議書
- 2025年度個(gè)體戶雇工勞動(dòng)權(quán)益保護(hù)與晉升機(jī)制合同
- 2025年度房屋抵押借款合同風(fēng)險(xiǎn)預(yù)警與防范策略
- 2025年硫酸鐵行業(yè)現(xiàn)狀分析:全球硫酸鐵市場(chǎng)規(guī)模將達(dá)975.91億元
- 2025年包裝設(shè)備行業(yè)前景分析:包裝設(shè)備行業(yè)發(fā)展趨勢(shì)實(shí)現(xiàn)顯著提升
- 2025年貴州交通職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)審定版
- 《飛向太空的航程》基礎(chǔ)字詞梳理
- GB/T 144-2024原木檢驗(yàn)
- 追覓入職測(cè)評(píng)題庫(kù)
- 寧德時(shí)代入職測(cè)評(píng)試題答案
- 干粉滅火器的使用方法課件
- 2024年廣東省2024屆高三高考模擬測(cè)試(一)一模 化學(xué)試卷(含答案)
- 半導(dǎo)體行業(yè)質(zhì)量管理與質(zhì)量控制
- 2024年山東省春季高考技能考試汽車專業(yè)試題庫(kù)-下(判斷題匯總)
- 部編版道德與法治二年級(jí)下冊(cè)第三單元 綠色小衛(wèi)士 單元作業(yè)設(shè)計(jì)
- 戲曲鑒賞完整版剖析課件
- 熱化學(xué)儲(chǔ)熱耦合高溫相變儲(chǔ)熱多物理場(chǎng)協(xié)同調(diào)控機(jī)理
評(píng)論
0/150
提交評(píng)論