匯編語(yǔ)言程序設(shè)計(jì)_第1頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)_第2頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)_第3頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)_第4頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩99頁(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)介

第4章匯編語(yǔ)言程序設(shè)計(jì)機(jī)械系統(tǒng)計(jì)算機(jī)控制2007機(jī)電學(xué)院7/27/20231匯編語(yǔ)言程序設(shè)計(jì)匯編語(yǔ)言語(yǔ)句匯編語(yǔ)言源程序結(jié)構(gòu)數(shù)據(jù)程序設(shè)計(jì)7/27/202324.18086匯編語(yǔ)言的語(yǔ)句

語(yǔ)句類型:

指令語(yǔ)句——指令性語(yǔ)句偽指令語(yǔ)句——指示性語(yǔ)句7/27/202334.18086匯編語(yǔ)言的語(yǔ)句

指令性語(yǔ)句格式

[標(biāo)號(hào):]助記符域〔操作碼段〕[操作數(shù)1][,操作數(shù)2][,……][;注釋]7/27/202344.18086匯編語(yǔ)言的語(yǔ)句

指示性語(yǔ)句格式[名字域〔標(biāo)識(shí)符〕]偽指令〔指示符〕操作數(shù)〔表達(dá)式〕[;注釋域]偽指令語(yǔ)句格式:

操作數(shù)——可以是常數(shù)、存放器、標(biāo)號(hào)、變量和序列。7/27/202354.18086匯編語(yǔ)言的語(yǔ)句

有關(guān)屬性

段值屬性——指存儲(chǔ)器操作數(shù)的段起始地址和標(biāo)號(hào)的CS值。段內(nèi)偏移量——16位無(wú)符號(hào)數(shù)。類型屬性——標(biāo)號(hào)的屬性和變量的類型屬性標(biāo)號(hào)的屬性用來(lái)指出該標(biāo)號(hào)在本段內(nèi)引用還是在其他段中引用,在段內(nèi)引用,稱為NEAR,指針長(zhǎng)度為2字節(jié);在段間引用,那么稱為FAR,指針長(zhǎng)度為4字節(jié)。變量的類型屬性用來(lái)指出該變量所保存的字節(jié)數(shù),主要是指BYTE〔字節(jié)型〕、WORD〔字型〕或DWORD〔雙字型〕。7/27/202364.28086匯編語(yǔ)言中的偽指令等值定義偽操作EQU指令格式<符號(hào)名字>EQU<表達(dá)式>不分配存儲(chǔ)單元不能用EQU屢次對(duì)同一符號(hào)賦值例如:DATAEQU15;定義為15TIMEEQUDATA*2;定義為30符號(hào)定義語(yǔ)句

7/27/202374.28086匯編語(yǔ)言中的偽指令等號(hào)賦值指令格式<符號(hào)名字>=<表達(dá)式>不分配存儲(chǔ)單元用=可屢次對(duì)同一符號(hào)賦值例如:VALUE=128;定義為128VALUE=VALUE+2;重定義為130符號(hào)定義語(yǔ)句

7/27/20238例:EQU、=賦值偽操作COUNT

EQU

25 COUNTER1 DB COUNT COUNTER2 DB COUNT TEMP=25 TEMP=TEMP+1……MOVAL,COUNT;AL=25MOVAH,COUNTER2;AH=25MOVBL,TEMP;BL=267/27/202394.28086匯編語(yǔ)言中的偽指令變量定義語(yǔ)句格式[<變量名>]<助記符><參數(shù)表>變量名代表參數(shù)表中第一個(gè)字節(jié)的偏移地址變量名后不跟冒號(hào)DB定義字節(jié),是唯一能定義字符串的偽操作.DW定義字〔兩個(gè)字節(jié)單元〕DD定義二個(gè)字單元〔四個(gè)字節(jié)單元〕DQ定義四個(gè)字單元〔八個(gè)字節(jié)單元〕DT定義五個(gè)字單元〔十個(gè)字節(jié)單元〕nDUP〔〕n重復(fù)項(xiàng)數(shù),不能單獨(dú)用。7/27/202310變量定義語(yǔ)句定義一組數(shù)據(jù)

例如:BUFFDW1234H,0ABCDH,8EH,-79DH定義BUFF為一個(gè)字型變量,共有5個(gè)參數(shù)。定義一串字符例如:STRDB‘Welcome!’字符以ASCII碼的形式存放在內(nèi)存中。注:只能定義為字節(jié)型,其他形式因存儲(chǔ)順序的問(wèn)題,將會(huì)存亂串的內(nèi)容。

7/27/202311變量定義語(yǔ)句定義保存存儲(chǔ)單元在程序設(shè)計(jì)中,如果希望將運(yùn)算結(jié)果保存到內(nèi)存中,那么在設(shè)計(jì)時(shí)就要預(yù)留一局部存儲(chǔ)單元。這些單元不需要事先賦值。例如:SUMDW?,?即從SUM偏移地址開(kāi)始,為2個(gè)字型數(shù)據(jù)保存了4個(gè)字節(jié)的內(nèi)存單元。7/27/202312變量定義語(yǔ)句復(fù)制操作

復(fù)制操作符DUP可以預(yù)置重復(fù)的數(shù)值,DUP之前的數(shù)字表示重復(fù)的次數(shù),DUP后面由括號(hào)將內(nèi)容括起來(lái)。

例如:APCDB5DUP(0)得到5個(gè)字節(jié)連續(xù)賦0。7/27/202313變量定義語(yǔ)句將已定義的地址存入內(nèi)存單元

定義過(guò)的標(biāo)號(hào)或用PROC定義過(guò)的過(guò)程都有段地址和偏移量。假設(shè)希望將變量、標(biāo)號(hào)或過(guò)程名的段地址和偏移量保存到存儲(chǔ)單元,可以用下面的方式完成:LITDDCYC……CYC:MOVAX,BX……7/27/202314變量定義語(yǔ)句將已定義的地址存入內(nèi)存單元

這樣就可以將標(biāo)號(hào)CYC的段地址和偏移量存放到變量LIT開(kāi)始的4個(gè)字節(jié)單元中。有時(shí)可以這樣的方法把程序中所有子程序的首地址列在一起,采用查表的方法動(dòng)態(tài)地轉(zhuǎn)入所需的子程序。LITDDCYC……CYC:MOVAX,BX……7/27/202315

;ListFileforDBExamples000019 DATA1 DB25 ;decimalnumber000189 DATA2 DB10001001B;binarynumber000212 DATA3 DB12H ;hexadecimalnumber0010 ORG 0010H ;theoffsetaddressis10h001032353931 DATA4 DB‘2591’ ;ASCIInumber0018 ORG 0018H ;theoffsetaddressis18h001800 DATA5 DB? ;setasideabyte0020 ORG 0020H ;theoffsetaddressis20h00204D79206E616D DATA6 DB‘MynameisJoe’;ASCIIcharacters65206973204A6F65002E0A1002313042 DATA7 DB10,10H,10B,‘10B’;differentdatatypes例:DB定義字節(jié)、字符7/27/202316例:DW定義字

;ListFileforDWExamples0070 ORG70H 007003BADATADW954 ;decimal00720954 DATA9DW0074253F DATA10DW253FH;hexadecimal0076FFFB DATA11DW-5 ;negative0080 ORG80H00800009FFFF0007000CDATA12DW9,-1,7,0CH,00100000B,100,‘HI’002000644849 008E00700076 DWDATA,DATA117/27/202317例:DD定義雙字

;ListFileforDDExamples00A0 ORG00A0H00A0000003FF DATA13DD1023;decimal00A40008965C DATA14DD00A85C2A57F2 DATA15DD5C2A57F2H;hexadecimal00AC0000002300034789 DATA16DD23H,34789H,65533;miscellaneous0000FFFD7/27/202318例:DQ和DTDQ定義4字DT為壓縮的BCD數(shù)據(jù)分配存儲(chǔ)單元

;ListFileforDQ,DTExamples00C0 ORG00C0H00C0C223450000000000 DATA17DQ4523C2H;hexadecimal00C84948000000000000 DATA18DQ‘HI’;ASCIIcharacters00D00000000000000000DATA19DQ? ;nothing00E0 ORG00E0H00E02998564379860000 DATA20DT867943569829;BCD000000EA0000000000000000 DATA21DT? ;nothing00007/27/202319例:DUP

按照給定的次數(shù)來(lái)復(fù)制某個(gè)(某些)操作數(shù)

;ListFileforDUPExamples0100 ORG0100H01000020[ DATA22 DB

32DUP(?);setaside32bytes?? ]0120 ORG0120H01200005[ DATA23 DB5DUP(2DUP(99));fill10byteswith99 0002[ 63 ] ]012A0008[ DATA24DW8DUP(?) ;setaside8words ???? ]7/27/202320段定義語(yǔ)句格式:<段名>SEGMENT[定位類型][組合類型][‘類別’]段模塊……<段名>ENDSSEGMENT和ENDS必須成對(duì)出現(xiàn),在它們之間是匯編語(yǔ)言中的各種指令。1.段定義語(yǔ)句格式

7/27/202321段定義語(yǔ)句1〕定位類型〔1〕PAGE段的首地址能被256整除,即段地址的低8位為0?!?〕PARA段的首地址能被16整除,即段地址的低4位為0。為默認(rèn)值。〔3〕WORD段的首地址能被2整除,即段起始于偶地址,最低位為0?!?〕BYTE段的起始地址為任何地方。7/27/202322段定義語(yǔ)句2〕組合類型向連接程序提供本段同其他段的組合關(guān)系?!?〕NONE表示本段與其他段邏輯上不發(fā)生關(guān)系,每段都有自己的基地址。是默認(rèn)連接方式?!?〕PUBLIC按LINK程序指定的次序相鄰地連接在一起,指定一個(gè)共同的段基地址,即連接成一個(gè)物理段。7/27/202323段定義語(yǔ)句2〕組合類型〔3〕STACK與PUBLIC同樣處理,但是作為堆棧段用的。程序中必須至少有一個(gè)STACK段。如果有多個(gè),那么初始化時(shí),SS指向第一個(gè)所遇到的STACK段?!?〕COMMON表示本段與不同模塊中同名、同類別的段有相同的段首地址,因而會(huì)相互覆蓋,段的長(zhǎng)度取各段中的最大長(zhǎng)度。7/27/202324段定義語(yǔ)句2〕組合類型〔5〕AT<表達(dá)式>表示本段裝在以表達(dá)式的值為開(kāi)始的地址處,但它不能用來(lái)指定代碼段。表達(dá)式可以是任意一個(gè)有效常數(shù)。這個(gè)類型可以方便地實(shí)現(xiàn)在某一固定的存儲(chǔ)區(qū)〔如ROM區(qū)、中斷向量區(qū)〕內(nèi)的某一固定偏移地址處定義標(biāo)號(hào)或變量,以便程序以標(biāo)號(hào)或變量的形式存取這些存儲(chǔ)單元。7/27/202325段定義語(yǔ)句2〕組合類型〔6〕MEMORY連接程序?qū)⒃摱味ㄎ辉诒贿B接在一起的各段的前面〔最高地址處〕。假設(shè)有多個(gè)指定MEMORY組合類型的段,那么遇到的第一個(gè)段作為MEMOIRY處理,其余的作為COMMON處理。7/27/202326段定義語(yǔ)句3〕類別就是用單引號(hào)括起來(lái)的字符串。字符串可以是任意的合法名字。在連接時(shí),將類別相同的所有段存入連續(xù)的存儲(chǔ)區(qū)中。先出現(xiàn)的在前,后出現(xiàn)的在后。并取字符串為合并段的名字。7/27/202327段定義語(yǔ)句例:有兩個(gè)模塊

;模塊1DATASEGMENTCOMMON﹕DATAENDSCODESEGMENTPUBLIC﹕CODEENDS;模塊2DATASEGMENTCOMMON﹕DATAENDSCODESEGMENTPUBLIC﹕CODEENDS兩個(gè)模塊匯編連接后的存儲(chǔ)區(qū)分配如下圖。7/27/202328段定義語(yǔ)句其中,DATA段為兩塊共同的數(shù)據(jù)覆蓋區(qū)。CODE段為兩個(gè)模塊中的CODE段的順序連接。塊1在高地址,塊2在低地址。7/27/202329段定義語(yǔ)句段分配偽指令說(shuō)明ASSUMECS:段名,DS:段名,SS:段名,ES:段名

作用:確定定義的段與段存放器的對(duì)應(yīng)關(guān)系段存放器名:CS、DS、SS、ES段名:編程者定義的段的名字2.段假設(shè)語(yǔ)句〔段分配指令〕7/27/202330段定義語(yǔ)句例如:DATASEGMENT….DATAENDSSTACKSEGNENT….STACKENDS CODESEGMENTASSUME

CS:CODE,DS:DATA,SS:STACK,ES:DATA…CODEENDS7/27/202331

一個(gè)簡(jiǎn)單程序?qū)嵗?/p>

;THEFORMOFANASSEMBLYLANGUAGEPROGRAM

STSEG SEGMENT

DB64DUP(?) STSEG ENDS;-

DTSEG SEGMENT

DATA1 DB36H DATA2 DB4BH SUM DB?

DTSEG ENDS

CDSEG SEGMENT

MAIN PROC FAR ;thisistheprogramentrypoint ASSUME CS:CDSEG,DS:DTSEG,SS:STSEG START: MOV AX,DTSEG ;loadthedatasegmentaddress MOV DS,AX ;assignvaluetoDS

MOV AL,DATA1 ;getthefirstoperand MOV BL,DATA2 ;getthesecondoperand ADD AL,BL ;addtheoperands MOV SUM,AL ;storeresultinlocationSUM MOV AH,4CH ;setupto INT 21H ;returntoDOS

MAIN ENDP

CDSEG ENDS END START ;thisistheprogramexitpoint 7/27/202332段定義語(yǔ)句ORG偽指令格式ORG<數(shù)值表達(dá)式>指定數(shù)據(jù)的存儲(chǔ)地址或代碼段的起始地址例:ORG100HDATA1DB100例:ORG100HSTART:MOVAX,BX

3.ORG偽指令與地址計(jì)數(shù)器$

表達(dá)式以65536〔FFFFH〕為模進(jìn)行計(jì)算?!?4K。7/27/202333段定義語(yǔ)句例如:DATASEGMENTORG6ADW1234HORG20BDW6789H……DATAENDS那么A存放地址的偏移地址值為6H,而B(niǎo)存放地址的偏移地址為14H〔20的十六進(jìn)制數(shù)〕。7/27/202334段定義語(yǔ)句地址計(jì)數(shù)器$也就是當(dāng)前所用存儲(chǔ)單元的偏移地址。指定數(shù)據(jù)的存儲(chǔ)地址或代碼段的起始地址例:ORG3000HXDW$+8,$-2;定義了2個(gè)字,〔X〕=3008H,〔X+2〕=3000H例:JNE$+6;轉(zhuǎn)向地址是JNE指令的首地址加上6。7/27/202335段定義語(yǔ)句1〕PUBLIC表示本模塊提供被其他模塊使用的信息。格式:PUBLIC名字[,……]“名字〞可以是模塊中定義的一個(gè)變量或標(biāo)號(hào),包括過(guò)程名。2〕EXTRN表示本模塊引用了在其他模塊中定義的信息。格式:EXTRN名字:類型[,……]4.PUBLIC和EXTRN偽指令

當(dāng)一個(gè)程序由多個(gè)模塊組成時(shí),必須通過(guò)該命令將各模塊連接成一個(gè)完整的、可執(zhí)行的程序。

7/27/202336過(guò)程定義語(yǔ)句程序結(jié)構(gòu)偽指令(續(xù))過(guò)程定義偽指令說(shuō)明過(guò)程名

PROC[NEAR/FAR]…過(guò)程名

ENDPNEAR:處于同一個(gè)段,段內(nèi)調(diào)用FAR:處于不同的段,段間調(diào)用對(duì)應(yīng)CALL和RET的NEAR和FAR屬性程序結(jié)束偽指令說(shuō)明

END[<代碼起始標(biāo)號(hào)>|<過(guò)程名>]表示源程序結(jié)束,匯編程序匯編源程序遇到END結(jié)束匯編。7/27/202337例:數(shù)據(jù)段定義圖示說(shuō)明數(shù)據(jù)定義偽指令語(yǔ)句VARDB12,–12H,3DUP〔0,F(xiàn)FH〕實(shí)現(xiàn)的內(nèi)存分配和預(yù)置數(shù)據(jù)。0CHF4H00HFFH00HFFH00HFFH7/27/202338例:數(shù)據(jù)段定義DATASEGMENTDATA1DB15,10;2個(gè)字節(jié)單元DATA2DW4,3;4個(gè)字節(jié)單元CHARDB〞Hello〞;5個(gè)字節(jié)單元MDB2DUP(3,2DUP(4));6個(gè)字節(jié)單元XDB2DUP(0,0);4個(gè)字節(jié)單元YDW100DUP(?);200個(gè)字節(jié)單元CTEQU$-X;CT=204DATAENDS7/27/202339例:數(shù)據(jù)段定義數(shù)據(jù)段定義如下,畫(huà)出數(shù)據(jù)的存儲(chǔ)分配圖。DATASEGMENTVER1DW1234HVER2DW2DUP(?),5COUNTEQU2VER3DB'HELLO'VER4DB2DUP('E',COUNTDUP(0))DATAENDS34H12HXXHXXHXXHXXH05H00H'H''E''L''L''O''E'00H00H'E'00H00H7/27/202340例:數(shù)據(jù)段定義數(shù)據(jù)段定義如下,畫(huà)出數(shù)據(jù)的存儲(chǔ)分配圖。DATASEGMENTVER1DW5VER2DW2DUP(1234H),2COUNTEQU2VER3DD12345678HVER4DB2DUP('E',COUNTDUP(0))DATAENDS05H00H34H12H34H12H02H00H78H56H34H12H45H00H00H45H00H00H7/27/202341例:數(shù)據(jù)段定義數(shù)據(jù)段定義如下,畫(huà)出數(shù)據(jù)的存儲(chǔ)分配圖。DATASEGMENTORG0020HVER1DWA1BCHVER2DW2DUP(?),5COUNTEQU2ADDRDWVER1DATAENDS0020BC0021A10022000023000024000025000026050027000028200029007/27/202342例:數(shù)據(jù)段定義數(shù)據(jù)段定義如下,畫(huà)出數(shù)據(jù)的存儲(chǔ)分配圖。DATASEGMENTORG3000HXDB5YDW2DUP(34H)COUNT=6ZDD12345678HWDWYDATAENDS300005300134300200300334300400300578300656300734300812300901300A307/27/2023434.38086匯編語(yǔ)言中的運(yùn)算符4.3.1常用運(yùn)算符和操作符算術(shù)運(yùn)算符邏輯運(yùn)算符關(guān)系運(yùn)算符分析操作符綜合運(yùn)算符7/27/2023444.38086匯編語(yǔ)言中的運(yùn)算符4.3.2運(yùn)算符的優(yōu)先級(jí)圓括號(hào),LENGTH,SIZEPTR,OFFSET,SEG,TYPE,THIS*,/,MOD+,-EQ,NE,LT,LE,GT,GENOTANDOR,XOR優(yōu)先級(jí)別從高到低排序?yàn)?/p>

7/27/2023454.4匯編語(yǔ)言程序設(shè)計(jì)一個(gè)好的程序應(yīng)該:滿足設(shè)計(jì)要求、實(shí)現(xiàn)預(yù)定功能;可讀性好、易維護(hù)——結(jié)構(gòu)化;可移植性好;執(zhí)行速度快;占用存儲(chǔ)空間少。7/27/2023464.4匯編語(yǔ)言程序設(shè)計(jì)4.4.1匯編語(yǔ)言程序設(shè)計(jì)根本步驟分析問(wèn)題、建立數(shù)學(xué)模型、確立算法;繪制流程圖,細(xì)化算法;分配存儲(chǔ)空間及工作單元,寫(xiě)程序;查找語(yǔ)法、邏輯錯(cuò)誤;上機(jī)調(diào)試。7/27/202347sample.asm編輯程序匯編程序連接程序sample.crfotherfiles.objsample.lstsample.objsample.mapsample.exe匯編程序編寫(xiě)、編譯步驟執(zhí)行程序7/27/202348建立,運(yùn)行匯編語(yǔ)言程序C:\>EDITsample.ASM<CR>C:\>MASMsample.ASM<CR>

Microsoft(R)MacroAssemblerVersion5.10Copyright(C)MicrosoftCorp1981,1988.Allrightsreserved.Objectfilename[SAMPLE.OBJ]:<CR>Sourcelisting[NUL.LST]:SAMPLE.LST<CR>Cross-reference[NUL.CRF]:<CR>47962+413345Bytessymbolspacefree0WarningErrors0SevereErrorsC:\>LINKsample.OBJ<CR>Microsoft(R)OverlayLinkerVersion3.64Copyright(C)MicrosoftCorp1983-1988.Allrightsreserved.RunFile[SAMPLE.EXE]:<CR>ListFile[NUL.MAP]:<CR>Libraries[.LIB]:<CR>LINK:warningL4021:nostacksegment

C:\>sample<CR>

7/27/202349建立,運(yùn)行匯編語(yǔ)言程序.EXE是可執(zhí)行文件,除了包含程序、數(shù)據(jù)等代碼外,還包含文件頭。文件頭也稱為程序段前綴PSP,占256個(gè)字節(jié)。DOS加載一個(gè)可執(zhí)行文件.EXE后的內(nèi)存分配見(jiàn)右圖。它首先為該程序建立一個(gè)PSP程序段前綴,然后把可執(zhí)行程序的程序代碼加載到PSP后續(xù)的地址上。即CS指向的地址。而DS、ES初始化在PSP的起始地址。

7/27/2023504.4匯編語(yǔ)言程序設(shè)計(jì)4.4.2匯編語(yǔ)言程序的根本結(jié)構(gòu)1.匯編語(yǔ)言源程序結(jié)構(gòu)〔程序框架的構(gòu)建〕每個(gè)程序至少必須有一個(gè)代碼段和END偽指令。還可以有堆棧段、數(shù)據(jù)段和附加數(shù)據(jù)段。每個(gè)段的排列順序是任意的,每種段都可以有多個(gè)。7/27/2023514.4匯編語(yǔ)言程序設(shè)計(jì)4.4.2匯編語(yǔ)言程序的根本結(jié)構(gòu)1.匯編語(yǔ)言源程序結(jié)構(gòu)〔程序框架的構(gòu)建〕NAME<模塊名>;可有可無(wú)TITLE<正文>;可有可無(wú)DATASEGMENT;定義數(shù)據(jù)段用DB、DW、DD,…等﹕DATAENDSEXTRASEGMENT;定義附加段用DB、DW、DD,…等﹕EXTRAENDS7/27/2023524.4匯編語(yǔ)言程序設(shè)計(jì)4.4.2匯編語(yǔ)言程序的根本結(jié)構(gòu)1.匯編語(yǔ)言源程序結(jié)構(gòu)〔程序框架的構(gòu)建〕STACKSEGMENTPARASTACK;定義堆棧段用DB、DW、DD,…等﹕STACKENDSCODESEGMENT;定義代碼段ASSUMECS:CODE,DS:DATA,ES:EXTRA,SS:STACKSTART:各種指令代碼﹕SUBTPROCFAR/NEAR;過(guò)程定義﹕RETSUBTENDPCODEENDS;代碼段結(jié)束ENDSTART;匯編程序結(jié)束7/27/202353.一個(gè)簡(jiǎn)單程序?qū)嵗?/p>

;THEFORMOFANASSEMBLYLANGUAGEPROGRAM

STSEG SEGMENT

DB64DUP(?) STSEG ENDS;-

DTSEG SEGMENT

DATA1 DB36H DATA2 DB4BH SUM DB?

DTSEG ENDS

CDSEG SEGMENT

MAIN PROC FAR ;thisistheprogramentrypoint ASSUME CS:CDSEG,DS:DTSEG,SS:STSEG START: MOV AX,DTSEG ;loadthedatasegmentaddress MOV DS,AX ;assignvaluetoDS

MOV AL,DATA1 ;getthefirstoperand MOV BL,DATA2 ;getthesecondoperand ADD AL,BL ;addtheoperands MOV SUM,AL ;storeresultinlocationSUM MOV AH,4CH ;setupto INT 21H ;returntoDOS

MAIN ENDP

CDSEG ENDS END START ;thisistheprogramexitpoint 7/27/202354例:分析操作符例:設(shè)標(biāo)號(hào)L1為FAR類型、L2為NEAR類型,變量DATA1、DATA2和ARRAY分別定義為:DATA1DW?DATA2DB45,107ARRAYDW100DUP(?)那么有:MOVBX,SEGL2;標(biāo)號(hào)L2所在段的首地址送BXMOVBX,OFFSETL2;標(biāo)號(hào)L2所在段的偏移量送BXMOVAX,TYPEDATA1;〔AX〕=2MOVAX,TYPEDATA2;〔AX〕=1MOVAX,TYPEL1;〔AX〕=-2MOVCX,LENGTHDATA1;〔CX〕=1MOVCX,LENGTHDATA2;〔CX〕=1MOVCX,LENGTHARRAY;〔CX〕=100MOVCX,SIZEDATA1;〔CX〕=2MOVCX,SIZEDATA2;〔CX〕=1MOVCX,SIZEARRAY;〔CX〕=200MOVAX,HIGH0A09H;〔AX〕=0AHMOVAX,LOW0A09H;〔AX〕=09H7/27/202355讀程題

TDATADB37H,54H..MOVAL,[TDATA]AL=()ADDAL,[TDATA+1]AL=(),AF=(),CF=()DAAAL=(),AF=(),CF=()本程序段作用()7/27/202356讀程題解答MOVAL,[TDATA]AL=37HADDAL,[TDATA+1]AL=CBH,AF=0,CF=0DAAAL=91H,AF=1,CF=0本程序段作用兩BCD數(shù)相加

7/27/202357讀程序例子一個(gè)有16個(gè)字的數(shù)據(jù)區(qū),它的起始地址為70A0:DDF6,請(qǐng)寫(xiě)出這個(gè)數(shù)據(jù)區(qū)首末字單元的物理地址。首地址:

H,末地址:

H解答:首地址:7E7F6H末地址:7E814H7/27/202358讀程序例子以下指令執(zhí)行后,寫(xiě)結(jié)果:ADDRDW1234H,5678H,0ABCDH ·LDSSI,ADDR+1程序執(zhí)行后,〔DS〕=____(SI)=___解答:〔DS〕=_0CD56H(SI)=7812H7/27/202359讀程序例子下述程序段執(zhí)行后,存放器的值填寫(xiě)在空白處:ORG0202H DA_WORDDW20H….MOVAX,DA_WORDMOVBX,OFFSETDA_WORD問(wèn):〔AX〕=____,(BX)=_____。解答:〔AX〕=0020H_,(BX)=_0202H_7/27/202360讀程序例子ORG0204H XYDW40H…MOVAX,XYMOVBX,OFFSETXY問(wèn):〔AX〕=____。(BX)=____。解答:〔AX〕=___0040H_(BX)=___0204H_7/27/2023614.4匯編語(yǔ)言程序設(shè)計(jì)4.4.2匯編語(yǔ)言程序的根本結(jié)構(gòu)2.根本編程結(jié)構(gòu)1〕順序結(jié)構(gòu)2〕分支結(jié)構(gòu)3〕循環(huán)結(jié)構(gòu)4〕子程序7/27/202362根本程序結(jié)構(gòu):順序結(jié)構(gòu)循環(huán)結(jié)構(gòu)……分支結(jié)構(gòu)子程序結(jié)構(gòu)復(fù)合結(jié)構(gòu):多種程序結(jié)構(gòu)的組合7/27/202363順序結(jié)構(gòu)CDSEG SEGMENTMAIN PROC FAR ;thisistheprogramentrypointASSUMECS:CDSEG,DS:DTSEG,SS:STSEGSTART: MOV AX,DTSEG;loadthedatasegmentaddress MOV DS,AX ;assignvaluetoDS

MOV AL,DATA1 ;getthefirstoperand MOV BL,DATA2 ;getthesecondoperand ADD AL,BL ;addtheoperands MOV SUM,AL ;storeresultinlocationSUM MOV AH,4CH ;setupto INT 21H ;returntoDOS

MAIN ENDP

CDSEG ENDS END START;thisistheprogramexitpoint7/27/202364分支結(jié)構(gòu)程序設(shè)計(jì)判定條件ABA

BX判定條件…(1)兩路分支結(jié)構(gòu)(2)多路分支結(jié)構(gòu)7/27/202365a)邏輯尺控制b)條件控制??case1case2case3case1case2casen常用方法7/27/202366c)地址跳轉(zhuǎn)表 TABLEDWONE,TWO,THREE

JMPTABLE[SI] …1000 ONE: …2000 TWO:…3000 THREE:…

d)根據(jù)關(guān)鍵字實(shí)現(xiàn)多路分支在跳轉(zhuǎn)表的每一個(gè)字地址或指令前開(kāi)辟一個(gè)關(guān)鍵字單元,用于存放轉(zhuǎn)到跳轉(zhuǎn)地址執(zhí)行的關(guān)鍵字。

7/27/202367例1.

設(shè)有數(shù)組x(x1,…,x10)和y(y1,…,y10),編程計(jì)算z1=x1+y1z2=x2+y2z3=x3-

y3z4=x4-

y4z5=x5-

y5z6=x6+

y6z7=x7-

y7z8=x8-

y8z9=x9+y9z10=x10+y10

邏輯尺:0011011100

1減法0加法7/27/202368xdwx1,x2,x3,x4,x5,x6,x7,x8,x9,x10ydwy1,y2,y3,y4,y5,y6,y7,y8,y9,y10zdwz1,z2,z3,z4,z5,z6,z7,z8,z9,z10logic_ruledw00dch ……

mov bx,0mov cx,10

mov dx,logic_rulenext:mov ax,x[bx]shr dx,1jc subtract

add ax,y[bx]jmp shortresult;向前引用subtract:sub ax,y[bx]

result:mov z[bx],axadd bx,2loop next7/27/202369例.根據(jù)AL存放器中哪一位為1〔從低位到高位〕把程序轉(zhuǎn)移到8個(gè)不同的程序分支去?!泊娣牌鏖g接尋址〕branch_tabledwroutine1

dwroutine2

dwroutine3

dwroutine4

dwroutine5

dwroutine6

dwroutine7

dwroutine8cmpal,0jecontinueleabx,branch_tableL

:shral,1;邏輯右移jncadd1;段內(nèi)直接轉(zhuǎn)移jmpwordptr[bx]

add1:addbx,2jmpLcontinue:……routine1:……routine2:…………7/27/202370循環(huán)程序設(shè)計(jì)

結(jié)

初始化

循環(huán)的初始狀態(tài)

循環(huán)體

循環(huán)的工作部分及修改部分

計(jì)數(shù)控制特征值控制地址邊界控制修改部分循環(huán)控制條件YN7/27/202371例.把BX中的二進(jìn)制數(shù)以十六進(jìn)制的形式顯示在屏幕上。BX12347/27/202372

movch,4rotate:movcl,4rolbx,clmoval,bl

andal,0fh

addal,30h;’0’-’9’ASCII30H-39Hcmpal,3ahjlprintit

addal,7h;’A’-’F’ASCII41H-46Hprintit:movdl,almovah,2int21h

decchjnzrotate7/27/202373例:將正數(shù)n插入一個(gè)已整序的字?jǐn)?shù)組的正確位置。算法:將數(shù)組中數(shù)逐個(gè)與n比較,SI為指針假設(shè)n<Ki,那么Ki下移一個(gè)單元假設(shè)nKi,那么插在Ki的下一個(gè)單元,并結(jié)束臨界條件:假設(shè)nKn,那么插入Kn的下一個(gè)單元假設(shè)n<K1,那么K1~Kn后移一個(gè)單元,n插在第一個(gè)單元7/27/202374例程〔續(xù)〕循環(huán)控制:計(jì)數(shù)控制元素個(gè)數(shù)=((字末地址-字首地址)/2)+1字?jǐn)?shù)=(字節(jié)末地址-字節(jié)首地址)+1字節(jié)數(shù)地址邊界控制結(jié)束地址為ARRAY_HEAD特征值控制:表示結(jié)束條件的值7/27/202375例2.

將正數(shù)n插入一個(gè)已整序的字?jǐn)?shù)組的正確位置。

xdw?array_headdw3,5,15,23,37,49,52,65,78,99array_enddw105ndw32movax,nmovarray_head-2,0ffffhmovsi,0compare:cmparray_end[si],axjleinsertmovbx,array_end[si]movarray_end[si+2],bxsubsi,2jmpshortcompareinsert:movarray_end[si+2],ax

-1

3

5

49

15

52

23

37

105

99

78

65

32xn(si)7/27/202376例3將首地址為A的字?jǐn)?shù)組從小到大排序〔氣泡算法,多重循環(huán)〕Adw32,85,16,15,8序號(hào)地址數(shù)比較遍數(shù)1234A322A+2853A+4164A+6155A+883216158851615832851581632858151632857/27/202377movcx,10deccxloop1:movdi,cxmovbx,0loop2:movax,A[bx]cmpax,A[bx+2]jlecontinuexchgax,A[bx+2]movA[bx],axcontinue:addbx,2looploop2

movcx,dilooploop17/27/202378子程序的設(shè)計(jì)方法過(guò)程〔子程序〕定義偽操作過(guò)程名PROCNEAR(FAR)……過(guò)程名ENDPNEAR屬性:調(diào)用程序和子程序在同一代碼段中(段內(nèi)調(diào)用〕FAR屬性:調(diào)用程序和子程序不在同一代碼段中〔段間調(diào)用〕7/27/202379子程序的設(shè)計(jì)方法(續(xù))保存與恢復(fù)存放器subtprocfarpushaxpushbxpushcxpushdx

popdxpopcxpopbxpopaxretsubtendp7/27/202380子程序的設(shè)計(jì)方法(續(xù))子程序的調(diào)用和返回子程序近調(diào)用:隱含使用堆棧保存返回地址callnearptrsubp(1)保存返回地址(2)轉(zhuǎn)子程序(IP)←subp的偏移地址

(IP)(SP)→7/27/202381子程序的設(shè)計(jì)方法(續(xù))子程序的調(diào)用和返回〔續(xù)〕子程序遠(yuǎn)調(diào)用:隱含使用堆棧保存返回地址callfarptrsubp(1)保存返回地址(2)轉(zhuǎn)子程序(CS)←subp的段地址(IP)←subp的偏移地址

(IP)(SP)→

(CS)7/27/202382子程序的設(shè)計(jì)方法(續(xù))子程序的調(diào)用和返回〔續(xù)〕中斷調(diào)用INTn〔n:中斷類型號(hào)〕(1)保存現(xiàn)場(chǎng)和返回地址〔FLAGS,CS,IP入棧〕(2)轉(zhuǎn)中斷處理程序(IP)←0000:(n*4)(CS)←0000:(n*4+2)(IP)(SP)→

(CS)(FLAGS)7/27/202383子程序的設(shè)計(jì)方法(續(xù))子程序的調(diào)用和返回〔續(xù)〕中斷調(diào)用INT21H〔DOS功能調(diào)用〕調(diào)用前首先要選擇功能號(hào)→AH根據(jù)規(guī)定,將相關(guān)數(shù)據(jù)送相關(guān)存放器INT21H詳見(jiàn)書(shū)上P.123有關(guān)例題。7/27/202384子程序的設(shè)計(jì)方法(續(xù))子程序的調(diào)用和返回〔續(xù)〕子程序返回:〔1〕ret〔返回地址出?!场?〕iret〔IP,CS,FLAGS出棧〕(IP)(SP)→

(CS)(FLAGS)7/27/202385子程序的設(shè)計(jì)方法(續(xù))子程序的參數(shù)傳送方法1〕通過(guò)存放器傳送參數(shù)2〕通過(guò)存儲(chǔ)區(qū)傳送參數(shù)子程序和調(diào)用程序在同一程序模塊中,那么子程序可直接訪問(wèn)模塊中的變量。子程序和調(diào)用程序不在同一程序模塊中,那么有兩種傳送方式:建立公共數(shù)據(jù)區(qū)和使用外部符號(hào)。3〕通過(guò)地址表傳送參數(shù)地址4〕通過(guò)堆棧傳送參數(shù)或參數(shù)地址7/27/202386DATASEGMENTBCDZDB00110100B;34DBINZDB?DATAENDSCODESEGMENT

ASSUMECS:CODE,DS:DATAmain proc far

MOVAX,

@DATA MOVDS,AX;設(shè)定數(shù)據(jù)段 MOVAL,BCDZ

CALLSUB1;102 MOVBINZ,AL

MOVAH,4CH INT21H;返回DOSmain ENDP例:將BCDZ中的2位壓縮BCD轉(zhuǎn)換成二進(jìn)制保存到BINZ單元〔通過(guò)存放器傳送變量〕7/27/202387

SUB1PROCNEAR;102 PUSHF PUSHBX

PUSHCX;保護(hù)現(xiàn)場(chǎng) MOVAH,AL;34→AH

ANDAH,0FH;AH=04H MOVBL,AH;BL=04H MOVCL,04 SHRAL,CL;AL=03H MOVBH,10 MULBH;AX=3*0AH=001EH ADD AL,BL;AL=22H POPCX POPBXPOPF;恢復(fù)現(xiàn)場(chǎng)

RETSUB1 ENDP CODEENDSEND7/27/202388datasegmentarydw1,2,3,4,5,6,7,8,9,10countdw10sumdw?dataendscodesegmentmainprocfarassumecs:code,ds:datastart:pushdssubax,ax例.累加數(shù)組中的元素〔直接訪問(wèn)變量〕7/27/202389pushaxmovax,datamovds,axcallnearptrproaddretmainendp例.累加數(shù)組中的元素〔直接訪問(wèn)變量〕7/27/202390proaddprocnearpushaxpushcxpushsi

leasi,arymovcx,countxorax,axnext:addax,[si]addsi,2loopnextmovsum,axpopsipopcxpopaxretproaddendpcodeendsendstart7/27/202391例.累加數(shù)組中的元素〔通過(guò)地址表傳送變量地址〕datasegmentarydw10,20,30,40,50,60,70,80,90,100countdw10sumdw?tabledw3dup(?);地址表dataendscodesegmentmainprocfarassumecs:code,ds:datastart: push ds sub ax,ax push ax mov ax,data mov ds,ax mov table,offsetary mov table+2,offsetcount mov table+4,offsetsum mov bx,offsettable call proadd retmain endp7/27/202392proaddprocnear

pushaxpushcxpushsipushdi

movsi,[bx]movdi,[bx+2]movcx,[di]movdi,[bx+4]

xorax,axnext:addax,[si]addsi,2loopnext

mov[di],ax

popdipopsipopcxpopax

retproaddendpcodeendsendstart

ary100000

200002

30

40

50

60

70

80

90

100

count100014

sum?0016

table

00000018(bx)00140016(si)(di)7/27/202393

datasegmentarydw10,20,30,40,50,60,70,80,90,100countdw10sumdw?dataendsstacksegmentdw100dup(?)toslabelwordstackends

例.累加數(shù)組中的元素〔通過(guò)堆棧傳送變量地址〕7/27/202394code1segmentmainprocfarassumecs:code1,ds:data,ss:stackstart:movax,stackmovss,axmovsp,offsettospushdssubax,axpushaxmovax,datamovds,ax

movbx,offsetarypushbxmovbx,offsetcountpushbxmovbx,offsetsumpushbxcallfarptrproaddretmainendpcode1ends7/27/202395code2segmentassumecs:code2proaddprocfar

pushbpmovbp,sp

pushaxpushcxpushsipushdi

movsi,[bp+0ah]movdi,[bp+8]movcx,[di]movdi,[bp+6]

(bp)+0a0000

(sp)(di)

(si)

(cx)

(ax)

(bp)(bp)

(ip)

(cs)

(bp)+60016

(bp)+80014

0

(ds)

xorax,axnext:addax,[si]addsi,2loopnext

mov[di],ax

popdi

popsipopcxpopax

popbp

ret6proaddendpcode2endsendstart7/27/202396例:編程例:假設(shè)從BLOCK〔其地址為3000H:2000H〕開(kāi)始的內(nèi)存緩沖

溫馨提示

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