匯編語言程序設(shè)計(jì)3_第1頁
匯編語言程序設(shè)計(jì)3_第2頁
匯編語言程序設(shè)計(jì)3_第3頁
匯編語言程序設(shè)計(jì)3_第4頁
匯編語言程序設(shè)計(jì)3_第5頁
已閱讀5頁,還剩122頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1第4章

匯編語言程序設(shè)計(jì)2主要內(nèi)容匯編語言源程序的結(jié)構(gòu)匯編語言語句格式偽指令功能調(diào)用匯編語言程序設(shè)計(jì)3§4.1

匯編語言源程序了解:概述匯編語言源程序的結(jié)構(gòu)匯編語言語句類型及格式1機(jī)器語言與匯編語言(MachineLanguageandAssemblyLanguage)

由二進(jìn)制代碼0,1表示的指令稱為機(jī)器指令,相應(yīng)的程序稱為機(jī)器語言程序

。用指令助記符表示的指令稱為匯編語言指令,對(duì)應(yīng)的程序稱為匯編語言程序。一

概述例4-1將4位二進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼字符。當(dāng)數(shù)在0000B-1001B時(shí),對(duì)應(yīng)的ASCII碼為‘0’~‘9’;當(dāng)數(shù)在1010B~1111B時(shí),對(duì)應(yīng)的ASCII碼為‘A’~‘F’。設(shè)待轉(zhuǎn)換的數(shù)據(jù)已在累加器AL中〔低4位〕。編制的機(jī)器語言程序與匯編語言程序如下表所示。地址機(jī)器代碼對(duì)應(yīng)的匯編指令E380:0000240FANDAL,0FHE380:00023C0ACMPAL,0AHE380:00047202JBNUME380:00060407ADDAL,07HE380:00080430NUM:ADDAL,30HE380:000AC3RET2.匯編語言與高級(jí)語言(AssemblyLanguageandComputer-independentLanguage)

匯編語言是一種依賴于計(jì)算機(jī)微處理器的語言

匯編語言一般不具有通用性和可移植性

進(jìn)行匯編語言程序設(shè)計(jì)必須熟悉機(jī)器的硬件資

源和軟件資源

高級(jí)語言是面向過程的語言

高級(jí)語言具有很好的通用性和可移植性

學(xué)習(xí)匯編語言的必要性

利用匯編語言可以設(shè)計(jì)出效率極高的核心底層程序。用匯編語言編寫的程序一般比用高級(jí)語言編寫的程序執(zhí)行得快,且所占內(nèi)存較少。匯編語言程序能夠直接有效地利用機(jī)器硬件資源。學(xué)習(xí)匯編語言對(duì)于理解和掌握計(jì)算機(jī)硬件組成及工作原理是十分重要的。

9二、匯編語言源程序結(jié)構(gòu)完整的匯編語言源程序例如。NAMECALSUM;*****************************************************MY_DATASEGMENT;數(shù)據(jù)段定義開始SUMDB?;為符號(hào)SUM保存一個(gè)字節(jié)MY_DATAENDS;數(shù)據(jù)段定義結(jié)束;*****************************************************;************************************************MY_CODESEGMENT;代碼段定義開始ASSUMECS:MY_CODE,DS:MY_DATA,;規(guī)定CS和DS的內(nèi)容PORT_VALEQU8;端口的符號(hào)名GO:MOVAX,MY_DATA;初始化DS段MOVDS,AXMOVSUM,0;SUM清零CMPSUM,10;SUM與10比較JNAENOT_DONE;假設(shè)未超過,那么跳轉(zhuǎn)MOVAL,SUM;假設(shè)超過,賦給ALOUTPORT_VAL,AL;通過AL輸出HLTNOT_DONE:INAL,PORT_VAL;輸入下一個(gè)字符ADDSUM,AL;求和JMPCYCLE;轉(zhuǎn)至CYCLEMY_CODEENDS;代碼段定義結(jié)束;*************************************************

ENDGO;程序結(jié)束

8086的匯編語言的源程序是分段的,由假設(shè)干個(gè)段形成一個(gè)源程序。源程序的一般格式為:NAME1SEGMENT語句┇語句NAME1ENDSNAME2SEGMENT語句┇語句NAME2ENDS┇END〈標(biāo)號(hào)〉要點(diǎn)總結(jié):匯編語言源程序由段結(jié)構(gòu)組成。一個(gè)段由“SEGMENT〞〔段定義開始〕和“ENDS〞〔段定義結(jié)束〕語句來定義。每個(gè)段都有唯一的段名,前后一致。不同段的段名不能相同。數(shù)據(jù)段、堆棧段和代碼段的作用各不相同。各個(gè)段都由一系列語句組成。語句包括指令語句和偽指令語句。15二、匯編語言語句類型及格式161.

匯編語言語句類型指令性語句指示性語句CPU執(zhí)行的語句,能夠生成目標(biāo)代碼CPU不執(zhí)行,而由匯編程序執(zhí)行的語句,不生成目標(biāo)代碼172.

匯編語言語句格式

指令性語句:

[標(biāo)號(hào):][前綴]助記符[操作數(shù)],[操作數(shù)][;注釋]指令的符號(hào)地址標(biāo)號(hào)后要有冒號(hào)操作碼注釋前加分號(hào)18指示性語句格式[名字]偽指令助記符操作數(shù)[,操作數(shù),…][;注釋]變量的符號(hào)地址其后不加冒號(hào)指示性語句中至少有一個(gè)操作數(shù)193.

標(biāo)號(hào)、名字標(biāo)號(hào)后有冒號(hào),在指令性語句前;名字后不加冒號(hào),在指示性語句前。英文字母、數(shù)字及專用字符組成,最大長度不能超過31個(gè),且不能由數(shù)字打頭,不能用保存字(如存放器名,指令助記符,偽指令)。 204.

操作數(shù)存放器存儲(chǔ)器單元常量變量或標(biāo)號(hào)表達(dá)式21常量數(shù)字常量字符串常量例:‘A’

MOVAL,’A’例:’ABCD’匯編時(shí)被譯成對(duì)應(yīng)的ASCII碼41H,42H,43H,44H用單引號(hào)引起的字符或字符串22變量代表內(nèi)存中的數(shù)據(jù)區(qū),程序中視為存儲(chǔ)器操作數(shù)變量的屬性:變量所在段的段地址變量單元地址與段首地址之間的位移量。字節(jié)型、字型和雙字型段值偏移量類型標(biāo)號(hào)(Label)

標(biāo)號(hào)是某條指令所存放單元的符號(hào)地址,可作為轉(zhuǎn)移指令或CALL指令的操作對(duì)象。標(biāo)號(hào)也有三種屬性: 段值總是在CS段存放器中, 偏移量概念與變量同, 類型分NEAR和FAR兩種。NEAR—表示標(biāo)號(hào)所在語句與轉(zhuǎn)移指令或調(diào)用指令在同一碼 段內(nèi),只需改變IP即可。FAR—標(biāo)號(hào)所在語句與轉(zhuǎn)移指令或調(diào)用指令不在同一碼段 內(nèi)。假設(shè)沒有對(duì)類型進(jìn)行說明,默認(rèn)為NEAR。標(biāo)號(hào)的屬性〔在CS段中定義〕AG:MOVAX,BUFFDECCXJNZAGJMPAG

段屬性偏移量屬性類型屬性標(biāo)號(hào)AG在CS段中定義匯編后,AG對(duì)應(yīng)確定的IP值假設(shè)標(biāo)號(hào)在段內(nèi)為NEAR類型、在段間為FAR類型25表達(dá)式算術(shù)運(yùn)算邏輯運(yùn)算*關(guān)系運(yùn)算取值運(yùn)算和屬性運(yùn)算其它運(yùn)算算術(shù)運(yùn)算符算術(shù)運(yùn)算符的功能

+加法運(yùn)算符-減法運(yùn)算符*乘法運(yùn)算符/除法運(yùn)算符MOD求余運(yùn)算符SHL左移運(yùn)算符SHR右移運(yùn)算符算術(shù)運(yùn)算符算術(shù)運(yùn)算符的使用特點(diǎn)

數(shù)值表達(dá)式中可使用所有算術(shù)運(yùn)算符地址表達(dá)式僅使用+、-算術(shù)運(yùn)算符算術(shù)運(yùn)算符不影響標(biāo)志位《例》:完成80H+90H解:MOVAL,80H+90H;使用數(shù)值表達(dá)式;〔AL〕=10H、CF=不變MOVAL,80HADDAL,90H;使用加法指令;〔AL〕=10H、CF=1邏輯運(yùn)算符邏輯運(yùn)算符的功能AND位與

OR位或

XOR位異或

NOT位非邏輯運(yùn)算符邏輯運(yùn)算符的使用特點(diǎn)

邏輯指令助記符與邏輯運(yùn)算符形同意不同

邏輯指令助記符出現(xiàn)在指令語句的開始

邏輯運(yùn)算符出現(xiàn)在指令語句的操作數(shù)段

AND

CX,00FFHAND10AEHANDCX,00FFHAND10AEH注:等價(jià)指令A(yù)NDCX,00AEH邏輯運(yùn)算符在匯編時(shí)完成計(jì)算;指令助記符在指令執(zhí)行時(shí)進(jìn)行計(jì)算。例:MOV CL,36HAND0FH經(jīng)匯編后:MOVCL,06H例:ANDDX,PORT_VAR AND0FEH后一個(gè)邏輯運(yùn)算符AND在匯編時(shí)進(jìn)行,假設(shè)PORT_VAR為81H,那么匯編后表達(dá)式算出為80H.執(zhí)行前一個(gè)指令助記符AND時(shí),將(DX)與80H相與,結(jié)果在DX中。關(guān)系運(yùn)算符關(guān)系運(yùn)算符的功能EQ相等關(guān)系

NE不相等關(guān)系

LT小于關(guān)系

GT大于關(guān)系

LE

小于或等于關(guān)系

GE大于或等于關(guān)系關(guān)系運(yùn)算符關(guān)系運(yùn)算符的使用特點(diǎn)MOVBL,〔PORTLT5〕AND20H假設(shè)PORT=2,〔PORTLT5〕=FFH,為真原式為MOVBL,20H假設(shè)PORT=7,〔PORTLT5〕=00H,為假原式為MOVBL,00H兩性質(zhì)相同的操作數(shù)間的比較假設(shè)關(guān)系正確為真〔T〕,有全1操作數(shù)假設(shè)關(guān)系錯(cuò)誤為假〔F〕,有全0操作數(shù)33取值運(yùn)算符取得其后變量或標(biāo)號(hào)的偏移地址取得其后變量或標(biāo)號(hào)的段地址TYPE取變量的類型LENGTH取所定義存儲(chǔ)區(qū)的長度SIZE取所定義存儲(chǔ)區(qū)的字節(jié)數(shù)用于分析存儲(chǔ)器操作數(shù)的屬性獲取變量的屬性值OFFSETSEG34取值運(yùn)算符例MOVAX,SEGDATAMOVDS,AXMOVBX,OFFSETDATA

LEABX,DATA等價(jià)于35取值運(yùn)算符例假設(shè)BUFFER存儲(chǔ)區(qū)用如下偽指令定義:BUFFERDW200DUP(0)那么:TYPE BUFFER 等于2LENGTHBUFFER 等于200SIZEBUFFER 等于40036屬性運(yùn)算符用于指定其后存儲(chǔ)器操作數(shù)的類型運(yùn)算符:PTR例:

MOVBYTRPTR[BX],12H37其它運(yùn)算符方括號(hào):[]段重設(shè)符段存放器名:[]方括號(hào)中內(nèi)容為操作數(shù)的偏移地址用于修改默認(rèn)的段基地址38§4.2

偽指令掌握:偽指令的格式及實(shí)現(xiàn)的操作偽指令的應(yīng)用39偽指令由匯編程序執(zhí)行的“指令系統(tǒng)〞作用:定義變量;分配存儲(chǔ)區(qū)定義邏輯段;指示程序開始和結(jié)束;定義過程等。40常用偽指令數(shù)據(jù)定義偽指令符號(hào)定義偽指令段定義偽指令結(jié)束偽指令過程定義偽指令宏命令偽指令41一、數(shù)據(jù)定義偽指令用于定義數(shù)據(jù)區(qū)中變量的類型及大小格式:[變量名]偽指令助記符操作數(shù),…;[注釋]符號(hào)地址定義變量類型定義變量值及區(qū)域大小421.數(shù)據(jù)定義偽指令助記符DB定義的變量為字節(jié)型DW定義的變量為字類型〔雙字節(jié)〕DD定義的變量為雙字型〔4字節(jié)〕DQ定義的變量為4字型〔8字節(jié)〕DT定義的變量為10字節(jié)型43數(shù)據(jù)定義偽指令例DATA1DB11H,22H,33H,44HDATA2DW11H,22H,3344HDATA3DD11H*2,22H,33445566H以上變量在內(nèi)存中的存放形式44數(shù)據(jù)定義偽指令例_變量在內(nèi)存中的分布DATA111223344DATA2224411000033DATA32200220000XX6655443345數(shù)據(jù)定義偽指令的幾點(diǎn)說明偽指令的性質(zhì)決定所定義變量的類型;定義字符串必須用DB偽指令例:DATA1DB‘ABCD’,66H‘A’‘B’‘C’‘D’41H42H43H44H66H462.

重復(fù)操作符作用:為一個(gè)數(shù)據(jù)區(qū)的各單元設(shè)置相同的初值目的:常用于聲明一個(gè)數(shù)據(jù)區(qū)格式:[變量名]偽指令助記符nDUP〔初值,…〕例:BW20DUP〔0〕M1DB10DUP〔0〕473.“?〞的作用表示隨機(jī)值,用于預(yù)留存儲(chǔ)空間MEM1DB34H,’A’,?DW20DUP〔?〕預(yù)留40個(gè)字節(jié)單元,每單元為隨機(jī)值隨機(jī)數(shù)占1個(gè)字節(jié)單元48數(shù)據(jù)定義偽指令例M1DB‘Howareyou?’M2DW3DUP(11H),3344HDB4DUP〔?〕M3DB3DUP〔22H,11H,?〕變量在內(nèi)存中的分區(qū)49數(shù)據(jù)定義偽指令例M1‘H’‘o’‘w’‘‘‘a(chǎn)’M211H11H00H44H33H‘r’‘e’‘‘‘y’‘o’‘u’‘?’11H00H00H隨機(jī)數(shù)M311H22H11H22H11H22HXXXXXXXXXXXXXX50二、符號(hào)定義偽指令1.等值語句EQU格式:符號(hào)名EQU 表達(dá)式操作:用符號(hào)名取代后邊的表達(dá)式,不可重新定義例: CONSTANT EQU 100VAREQU30H+99HEQU說明的表達(dá)式不占用內(nèi)存空間EQU的應(yīng)用特點(diǎn)DATASEGMENTARE1DB20HARE2EQU20HARE3DW4142HDATAENDSARE1ARE30000H0001H注:EQU定義的是常量,故不占存儲(chǔ)單元2.等號(hào)(Equalsign)語句=

此語句的功能與EQU語句類似,最大特點(diǎn)是能對(duì)符號(hào)進(jìn)行再定義。例: ┇

EMP=7 ;值為7 ┇ EMP=EMP+1 ;值為8EQU與=比較

格式

特點(diǎn)

符號(hào)

EQU

表達(dá)式符號(hào)=

表達(dá)式

EQU

不能重復(fù)定義

=

可重復(fù)定義注:符號(hào)而非變量,故用EQU、=定義的符號(hào)不占用存儲(chǔ)器單元

已用EQU定義的符號(hào),可用PURGE解除,再重新定義。例:PURGE NEW_PORTNEW_PORTEQU POTR_VAL+83.解除偽指令PURGE

55三、段定義偽指令說明邏輯段的起始和結(jié)束;說明不同程序模塊中同類邏輯段之間的聯(lián)系形態(tài)56段定義偽指令格式段名SEGMENT[定位類型][組合類型][’類別’]

┇段名ENDS說明邏輯段的起點(diǎn)說明不同模塊中同名段的組和連接方式57定位類型PARA:段的起點(diǎn)從節(jié)邊界開始〔16個(gè)字節(jié)為1節(jié)〕BYTE:段的起點(diǎn)從存儲(chǔ)器任何地址開始WORD:段的起點(diǎn)從偶地址開始PAGE:段的起點(diǎn)從頁邊界開始〔256個(gè)字節(jié)為1頁〕58組合類型與其它模塊中的同名段在滿足定位類型的前提下具有的組合方式:NONE:不組合PUBLIC:依次連接〔順序由LINK程序確定〕COMMON:覆蓋連接STACK:堆棧段的依次連接AT表達(dá)式:段定義在表達(dá)式值為段基的節(jié)邊界MEMORY:相應(yīng)段在同名段的最高地址處。59類別不同模塊連接時(shí)將相同類別的段放在連續(xù)的內(nèi)存區(qū)域中60段定義偽指令例DATASEGMENTMEM1DB11H,22HMEM2DB‘Hello!’MEM3DW2DUP〔?〕DATAENDS變量在邏輯段中的位置就代表了它的偏移地址表示變量所在邏輯段的段地址表示變量的類型61四、設(shè)定段存放器偽指令說明所定義邏輯段的性質(zhì)格式:ASSUME段存放器名:段名[,段存放器名:段名,…]ASSUME——段說明偽指令

代碼段名SEGMENT[相關(guān)約定]

ASSUMECS:段名,DS:段名,...

〈代碼段內(nèi)定義,指令集合〉代碼段名ENDS注:ASSUME

偽指令一般用在代碼段首行例

CODE SEGMENTASSUMECS:CODE,DS:DATA,SS:STACK,ES:NOTHINGMOV AX,DATA MOVDS,AX;設(shè)置DS MOVAX,STACK MOV SS,AX;設(shè)置SS

CODE ENDS需指出的一點(diǎn),ASSUME偽指令只是告知匯編程序有關(guān)段存放器與段的關(guān)系,并沒有給段存放器賦予實(shí)際的初值。故上例中MOV AX,DATAMOV DS,AX而代碼段不需要用戶裝,由初始化程序裝入。65五、結(jié)束偽指令表示源程序結(jié)束格式:END[標(biāo)號(hào)]66匯編語言源程序結(jié)構(gòu)數(shù)據(jù)段名SEGMENT

…數(shù)據(jù)段名ENDS附加段名SEGMENT

…附加段名ENDS堆棧段名

SEGMENT…堆棧段名

ENDS代碼段名

SEGMENT…代碼段名

ENDS

END

67一個(gè)完整源程序結(jié)構(gòu)例DSEGSEGMENTDATA1DB1,2,3DUP〔?〕DATA2DW1234HDSEGENDSESEGSEGMENTDB20DUP〔?〕ESEGENDSSSEGSEGMENTSTACK‘STACK’DB200DUP〔?〕SSEGENDS68一個(gè)完整源程序結(jié)構(gòu)例CSEGSEGMENTASSUMECS:CSEG,DS:DSEG,ES:ESEG,SS:SSEGSTART:MOVAX,DSEGMOVDS,AXMOVAX,ESEGMOVES,AXMOVAX,SSEGMOVSS,AX┇CSEGENDSENDSTART源程序代碼段存放器初始化——將段地址送相應(yīng)的段存放器69六、過程定義偽指令用于定義一個(gè)過程體格式:

過程名PROC[NEAR/FAR]┇RET過程名ENDPP157例過程入口的符號(hào)地址過程定義及調(diào)用例定義延時(shí)子程序DELAYPROCPUSHBXPUSHCX

MOVBL,2NEXT:MOVCX,4167W10M:LOOPW10MDECBLJNZNEXTPOPCXPOPBXRETDELAYENDP70調(diào)用延時(shí)子程序:

CALLDELAY71七、宏命令偽指令

源程序中由匯編程序識(shí)別的具有獨(dú)立功能的一段程序代碼格式:

宏命令名MACRO<形式參數(shù)>┇┇ENDM宏體宏宏定義偽指令的應(yīng)用用宏指令代替需要重復(fù)書寫的程序段具有接收參量的能力形式參量不僅可出現(xiàn)在操作數(shù)局部,也可以出現(xiàn)在操作碼局部宏定義偽指令的應(yīng)用

無參數(shù)宏定義及宏調(diào)用

有參數(shù)宏定義及宏調(diào)用定義:

SHIFMACROMOVCL,4SHLAX,CLENDM調(diào)用:MOVDX,2000HSHIFMOV[BX],AX定義:

SHIFMACROCN,RMOVCL,CNSHLR,CLENDM調(diào)用:MOVDX,2000HSHIF4,AXSHIF5,BLMOV[BX],AX形式參數(shù)不僅可出現(xiàn)在操作數(shù)局部,也可出現(xiàn)在操作碼局部 如:SHIFTMACROX,Y,ZMOVCL,XS&ZY,CLENDM在IBM宏匯編中規(guī)定,宏定義體的形式參數(shù)如沒有適當(dāng)?shù)姆指舴?,那么不被看作為形參,SZ之間無分隔符,故它不被看作形參,要定義為形參,用&ZSHIFT4,AL,AL-->MOVCL,4SALAL,CL

偽指令ORG規(guī)定了段內(nèi)的起始地址或偏移地址,其格式為:

ORG <表達(dá)式>

表達(dá)式的值即為段內(nèi)的起始地址或偏移地址,從此地址起連續(xù)存放程序或數(shù)據(jù)。例:ORG20HBUF1DB12H,34HBUF2DB56H,78H八、其它偽指令76其它偽指令NAME為目標(biāo)程序設(shè)定一個(gè)名字格式:NAME模塊名TITLE為程序清單指定打印標(biāo)題格式:

TITLE標(biāo)題名77§4.3

功能調(diào)用DOS功能調(diào)用BIOS功能調(diào)用78DOS功能調(diào)用包含多個(gè)子功能的功能包;用軟中斷指令調(diào)用,中斷類型碼固定為21H;各子功能采用功能號(hào)來區(qū)分。79DOS

功能調(diào)用設(shè)備管理目錄管理文件管理其它80DOS功能調(diào)用調(diào)用格式:MOVAH,功能號(hào)<置相應(yīng)參數(shù)>INT21H81一、單字符輸入調(diào)用方法:MOVAH,01INT21H輸入的字符在AL中82單字符輸入例GET_KEY:

MOV AH,1 INT 21H

CMP AL,’Y’

JZ YES CMP AL,’N’

JZ NO JMP GET_KEYYES:┇ NO: ┇交互式應(yīng)答程序83二、字符串輸入注意問題:調(diào)用格式字符輸入緩沖區(qū)的定義841.

調(diào)用格式

功能號(hào)OAH字符串在內(nèi)存中的存放地址INT21HAHDS:DX852.

定義字符緩沖區(qū)用戶自定義緩沖區(qū)格式:0DHN1N2整個(gè)緩沖區(qū)最大可鍵入字符數(shù)實(shí)際鍵入字符數(shù)存放鍵入的字符存放字符個(gè)數(shù):≤25586輸入字符串程序段DAT1DB20,?,20DUP〔?〕┇LEADX,DAT1MOVAH,0AHINT21H在數(shù)據(jù)段中定義87輸入緩沖區(qū)14H?20個(gè)字節(jié)定義后的輸入緩沖區(qū)初始狀態(tài):88三、單字符顯示輸出功能號(hào)O2H待輸出字符INT21HAHDL89單字符顯示輸出例MOV AH,02MOV DL,41HINT 21H

執(zhí)行結(jié)果:屏幕顯示A90四、字符串輸出顯示

功能號(hào)O9H待輸出字符串的偏移地址INT21HAHDS:DX91字符串輸出顯示被顯示的字符串必須以‘$’結(jié)束,且所顯示的內(nèi)容不應(yīng)出現(xiàn)非可見的ASCII碼92字符串輸出顯例如DATA SEGMENTMESS1DB‘InputString:’,0DH,0AH,’$’DATAENDSCODESEGMENT ┇MOV AH,09MOV DX,OFFSETMESS1INT 21H┇93§4.4

匯編語言程序設(shè)計(jì)設(shè)計(jì)步驟:根據(jù)實(shí)際問題抽象出數(shù)學(xué)模型確定算法畫程序流程圖分配內(nèi)存工作單元和存放器程序編碼調(diào)試94程序流程圖符號(hào)起始:功能:判斷:子過程:95匯編語言程序結(jié)構(gòu)順序結(jié)構(gòu)循環(huán)結(jié)構(gòu)先判定型后判定型分枝結(jié)構(gòu)單分枝多分枝子程序結(jié)構(gòu)編寫完整的匯編語言程序,用8086的16位無符號(hào)數(shù)乘法指令實(shí)現(xiàn)兩個(gè)32位無符號(hào)數(shù)的乘法運(yùn)算。

算法分析:8086沒有32位無符號(hào)數(shù)乘法指令,需借助于16位無符號(hào)數(shù)乘法指令做4次乘法,然后把局部積相加,如以下圖所示。ABB×DCDA×DB×CA×C+×部分積1部分積2部分積3部分積4最后乘積AB×CD

算術(shù)運(yùn)算程序設(shè)計(jì)完整的匯編語言程序如下:NAMEMULTIPLY_32BITDATASEGMENTMULNUMDW8000H,0001H,0FFFH,0001H,4DUP(?)DATAENDSSTACKSEGMENTPARASTACK‘STACK’DB100DUP(?)STACKENDS例如,求:00018000H*00010FFFH=0000000197FE8000H

ABCDCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTARTPROCFARBEGIN:PUSHDS;DS中包含的是程序段前綴的段地址MOVAX,0PUSHAX;設(shè)置返回至DOS的段值和偏移量MOVAX,DATAMOVDS,AX;置段存放器初值LEABX,MULNUMMULU32:MOVAX,[BX];B→AXMOVSI,[BX+4];D→SIMOVDI,[BX+6];C→DIMULSI ;B×DMOV[BX+8],AX ;保存局部積1MOV[BX+0AH],DXMOVAX,[BX+2] ;A→AXMULSI ;A×DADDAX,[BX+0AH]ADCDX,0;局部積2的一局部與局部

;積1的相應(yīng)局部相加MOV[BX+0AH],AXMOV[BX+0CH],DX;保存MOVAX,[BX];B→AXMULDI;B×CADDAX,[BX+0AH];與局部積3的相應(yīng)局部相加ADCDX,[BX+0CH]MOV[BX+0AH],AXMOV[BX+0CH],DXPUSHF;保存后一次相加的進(jìn)位標(biāo)志MOVAX,[BX+0AH];A→AXMULDI;A×CPOPFADCAX,[BX+0CH];與局部積4的相應(yīng)局部相加ADCDX,0MOV[BX+0CH],AXMOV[BX+0EH],DXRETSTARTENDPCODEENDSENDBEGIN程序中根據(jù)各種可能出現(xiàn)的情況及相應(yīng)的處理方法分成若干支路,運(yùn)行時(shí),根據(jù)不同情況有選擇地執(zhí)行相應(yīng)處理程序。例

試編寫程序段,實(shí)現(xiàn)符號(hào)函數(shù)。

當(dāng)x>0時(shí)當(dāng)x=0時(shí)當(dāng)x<0時(shí)

分支程序設(shè)計(jì)相應(yīng)的程序段為;SIGN:MOVAX,BUFFER;(BUFFER)=XANDAX,AX;做一次“與”運(yùn)算,以便把X

;的特征反映到標(biāo)志位

MOVBX,0;預(yù)置X=0的標(biāo)志0到BX JENEXT;若X確實(shí)為0,則轉(zhuǎn)NEXT JNSPLUS;X為正數(shù),則轉(zhuǎn)PLUSMOVBX,-1;X為負(fù)數(shù),則-1送BXJMPNEXTPLUS:MOVBX,1NEXT:…

…一段程序有時(shí)重復(fù)執(zhí)行屢次,就牽涉到循環(huán)程序結(jié)構(gòu),其組成局部為:1.循環(huán)體即要求重復(fù)執(zhí)行的程序段部分,包括循環(huán)工作部分和循環(huán)控制部分。2.循環(huán)初態(tài)循環(huán)開始時(shí)往往要置初態(tài),賦初值,包括循環(huán)工作部分初態(tài)和結(jié)束條件初態(tài)。

循環(huán)程序設(shè)計(jì)3.循環(huán)結(jié)束條件在循環(huán)程序中必須給出循環(huán)結(jié)束條件,否則就會(huì)進(jìn)入死循環(huán),結(jié)束條件有好多種,最常見的有:(1)用計(jì)數(shù)器控制循環(huán)(2)按問題的條件控制循環(huán)(3)用開關(guān)量控制循環(huán)分類統(tǒng)計(jì)字?jǐn)?shù)組ARRAY中正數(shù)、負(fù)數(shù)和零的個(gè)數(shù),并分別存入內(nèi)存字變量POST、NEGA和ZERO中,數(shù)組元素個(gè)數(shù)保存在數(shù)組的第一個(gè)字中。

分析:將字變量與0比較,然后判斷是大于0(JG)、等于0(JE)還是小于0(JL),以分別對(duì)相應(yīng)的計(jì)數(shù)器加1。(1)用計(jì)數(shù)器控制循環(huán)

DATASEGMENTARRAYDW8;元素個(gè)數(shù)

DW230,-1437,26,-31,0,3458,0,10POSTDW0NEGADW0ZERODW0DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXXORAX,AX;用AX作為正數(shù)的計(jì)數(shù)器

XORBX,BX;用BX作為負(fù)數(shù)的計(jì)數(shù)器

XORDX,DX;用DX作為零的計(jì)數(shù)器MOVCX,ARRAY;用CX來進(jìn)行循環(huán)計(jì)數(shù)JCXZDONE;考慮數(shù)組的元素個(gè)數(shù)為0的情況LEADI,ARRAY+2;用指針DI來訪問整個(gè)數(shù)組AGAIN:CMPWORDPTR[DI],0;與0做比較JGHIGH;大于0,為正數(shù)JEEQUAL;等于0INCBX;小于0,為負(fù)數(shù),負(fù)數(shù)個(gè)數(shù)增1JMPNEXTHIGH:INCAX;正數(shù)個(gè)數(shù)增1JMPNEXTEQUAL:INCDX;0的個(gè)數(shù)增1NEXT:INCDIINCDILOOPAGAINDONE:MOVPOST,AX;把各類的統(tǒng)計(jì)數(shù)保存到內(nèi)存單元中

MOVNEGA,BXMOVZERO,DXMOVAX,4C00H;結(jié)束程序返回DOSINT21HCODEENDSENDSTART

統(tǒng)計(jì)字變量VAL中0和1的個(gè)數(shù),并將統(tǒng)計(jì)結(jié)果分別送字單元X和Y中。分析:每次將最高位移入CF中進(jìn)行測(cè)試,若為0,則X單元加1;若為1,則Y單元加1。一個(gè)字有16位,故有16次循環(huán)。

(2)按問題的條件控制循環(huán)程序段如下:

MOVCX,16;16次循環(huán)

MOVSI,0;SI中存放0的個(gè)數(shù)

MOVDI,0;DI中存放1的個(gè)數(shù)

MOVAX,VALAGAIN:SHLAX,1JCNOZERO;為1,轉(zhuǎn)走

INCSI;為0,SI加1

JMPNEXTNOZERO:INCDI;為1,DI加1NEXT:LOOPAGAINMOVX,SIMOVY,DI

將表中數(shù)據(jù)從亂序25、46、3、75、5、30

到升序3、5、25、30、46、75排序問題(3)用開關(guān)量控制循環(huán)方法一——全比較法假設(shè)表數(shù)據(jù)項(xiàng)為N,要進(jìn)行N-1次排序操作第一次,經(jīng)比較將最小數(shù)放入表頂?shù)诙?,?jīng)比較將次小數(shù)放入表次頂.第N-2次,經(jīng)比較將次大數(shù)放入表次底第N-1次,經(jīng)比較將最大數(shù)放入表底注:每次找最小的數(shù)為內(nèi)循環(huán),比較N–M次,共需處理N–1次為外循環(huán)。方法二——標(biāo)志位識(shí)別法設(shè)排序標(biāo)志F假設(shè)標(biāo)志F=-1進(jìn)入比較排序程序(冒泡法〕假設(shè)標(biāo)志F=0數(shù)己排好,退出比較排序程序

注:對(duì)N項(xiàng)數(shù),外循環(huán)次數(shù)≤N-1汽泡圖〔從下向上比大小〕原數(shù)據(jù)第一次第二次第三次重排一次內(nèi)循環(huán)外循環(huán)流程圖標(biāo)志(BL)=-1開始(BL)=0結(jié)束(BL)=0

(CX)=N–1(SI)=N–1

j-1<jj-1?j(BL)=-1(SI)=(SI)-1(CX)=(CX)-1(CX)=0YYY數(shù)據(jù)段定義

DATSEGMENT

;段名DAT

BUFDB25,46,3,75,5,30

COUNTEQU$-BUF

;數(shù)據(jù)個(gè)數(shù)

DATENDS代碼段編程

CODSEGMENT;段名為CODEASSUMECS:COD,DS:DATSORDPROCFAR;過程名為SORDSTART:PUSHDSMOVAX,0PUSHAXMOVAX,DATMOVDS,AX;過程定義標(biāo)準(zhǔn)寫法代碼段編程

MOVBL,0FFH;標(biāo)志(BL)=-1AG0:CMPBL,0

;AG0為外循環(huán)JZEXITMOVBL,0

;假定此次排序無數(shù)據(jù)交換MOVCX,COUNT-1

;(CX)=N–1MOVSI,COUNT-1;SI指向表底

代碼段編程AG1:MOVAL,[SI];AG1為內(nèi)循環(huán)CMPAL,[SI-1];兩相鄰單元比較JAEUNCH;[SI]≥[SI-1]不交換XCHGAL,[SI-1];[SI-1]>[SI]交換MOV[SI],AL;[SI]?[SI-1]交換MOVBL,0FFH;有交換,未排好,;重排,〔BL〕=-1UNCH:代碼段編程UNCH:DECSI;內(nèi)循環(huán)中下一個(gè)相鄰數(shù)比較DECCXJNZAG1;一個(gè)數(shù)排好〔內(nèi)循環(huán)〕JMPAG0;所有數(shù)排好〔外循環(huán)〕EXIT:RET;過程返回SORDENDP;過程結(jié)束CODENDS;代碼段結(jié)束ENDSTART;匯編結(jié)束

子程序設(shè)計(jì)

子程序是程序設(shè)計(jì)中經(jīng)常使用的程序結(jié)構(gòu),通過把一些固定的、經(jīng)常使用的功能做成子程序的形式,可以使源程序及目標(biāo)程序大大縮短,提高程序設(shè)計(jì)的效率和可靠性。

在主程序與子程序中經(jīng)常要進(jìn)行參數(shù)傳遞。參數(shù)傳遞一般有三種方法:①利用存放器。這是一種最常見方法,把所需傳遞的參數(shù)直接放在主程序的存放器中傳遞給子程序。②利用存儲(chǔ)單元。主程序把參數(shù)放在公共存儲(chǔ)單元,子程序那么從公共存儲(chǔ)單元取得參數(shù)。③利用堆棧。主程序?qū)?shù)壓入堆棧,子程序運(yùn)行時(shí)那么從堆棧中取參數(shù)。例

編寫一個(gè)將單字節(jié)的二進(jìn)制數(shù)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論