




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
微機(jī)原理及應(yīng)用第六章匯編語(yǔ)言程序設(shè)計(jì)第九講匯編語(yǔ)言程序舉例好,我們已經(jīng)學(xué)習(xí)了絕大多數(shù)的偽指令這節(jié)課我們就嘗試著使用這些位指令來(lái)寫(xiě)一些簡(jiǎn)單的匯編語(yǔ)言程序首先來(lái)看兩個(gè)數(shù)求和的例子我們可以把程序分成幾塊來(lái)看這個(gè)程序有三大塊,分別對(duì)應(yīng)著三個(gè)邏輯段第一塊定義了一個(gè)數(shù)據(jù)段匯編語(yǔ)言程序舉例兩個(gè)數(shù)相加求和程序DSEGSEGMENT定義數(shù)據(jù)段DATA1DW0F865H定義被加數(shù)DATA2DW360CH定義加數(shù)DSEGENDS數(shù)據(jù)段結(jié)束ESEGSEGMENT定義附加段SUMDW2DUP(?)定義存放結(jié)果區(qū)ESEGENDS附加段結(jié)束CSEGSEGMENT定義代碼段ASSUMECS:CSEG,DS:DSEG,ES:ESEG數(shù)據(jù)段為什么是數(shù)據(jù)段呢?為什么是數(shù)據(jù)段?我們從ASSUME這條指令兩個(gè)數(shù)相加求和程序DSEGSEGMENT定義數(shù)據(jù)段DATA1DW0F865H定義被加數(shù)DATA2DW360CH定義加數(shù)DSEGENDS數(shù)據(jù)段結(jié)束ESEGSEGMENT定義附加段SUMDW2DUP(?)定義存放結(jié)果區(qū)ESEGENDS附加段結(jié)束CSEGSEGMENT定義代碼段ASSUMECS:CSEG,DS:DSEG,ES:ESEG我們從ASSUME這條指令可以判斷出這個(gè)段的性質(zhì)是數(shù)據(jù)段兩個(gè)數(shù)相加求和程序DSEGSEGMENT定義數(shù)據(jù)段DATA1DW0F865H定義被加數(shù)DATA2DW360CH定義加數(shù)DSEGENDS數(shù)據(jù)段結(jié)束ESEGSEGMENT定義附加段SUMDW2DUP(?)定義存放結(jié)果區(qū)ESEGENDS附加段結(jié)束CSEGSEGMENT定義代碼段ASSUMECS:CSEG,DS:DSEG,ES:ESEG判斷段的性質(zhì)在這個(gè)段中定義了兩個(gè)變量DATA1和DATA2這兩個(gè)變量都是雙字節(jié),而且每個(gè)變量都有一個(gè)初值兩個(gè)數(shù)相加求和程序DSEGSEGMENT定義數(shù)據(jù)段DATA1DW0F865H定義被加數(shù)DATA2DW360CH定義加數(shù)DSEGENDS數(shù)據(jù)段結(jié)束ESEGSEGMENT定義附加段SUMDW2DUP(?)定義存放結(jié)果區(qū)ESEGENDS附加段結(jié)束CSEGSEGMENT定義代碼段ASSUMECS:CSEG,DS:DSEG,ES:ESEG雙字節(jié),每個(gè)變量都有初值我們往下看下面又定義了一個(gè)附加段這個(gè)段的名字叫ESEG,它里面定義了一個(gè)變量這個(gè)變量有兩個(gè)操作數(shù),每個(gè)操作數(shù)的大小都是兩個(gè)字節(jié),所以這個(gè)變量相等于預(yù)留了四個(gè)字節(jié)的空間兩個(gè)數(shù)相加求和程序DSEGSEGMENT定義數(shù)據(jù)段DATA1DW0F865H定義被加數(shù)DATA2DW360CH定義加數(shù)DSEGENDS數(shù)據(jù)段結(jié)束ESEGSEGMENT定義附加段SUMDW2DUP(?)定義存放結(jié)果區(qū)ESEGENDS附加段結(jié)束CSEGSEGMENT定義代碼段ASSUMECS:CSEG,DS:DSEG,ES:ESEG一個(gè)變量:兩個(gè)操作數(shù)操作數(shù):兩個(gè)字節(jié)變量=四個(gè)字節(jié)空間最后一塊就是代碼段兩個(gè)數(shù)相加求和程序DSEGSEGMENT定義數(shù)據(jù)段DATA1DW0F865H定義被加數(shù)DATA2DW360CH定義加數(shù)DSEGENDS數(shù)據(jù)段結(jié)束ESEGSEGMENT定義附加段SUMDW2DUP(?)定義存放結(jié)果區(qū)ESEGENDS附加段結(jié)束CSEGSEGMENT定義代碼段ASSUMECS:CSEG,DS:DSEG,ES:ESEG代碼段代碼段中要做的第一件事就是用ASSUME偽指令定義段的性質(zhì)兩個(gè)數(shù)相加求和程序DSEGSEGMENT定義數(shù)據(jù)段DATA1DW0F865H定義被加數(shù)DATA2DW360CH定義加數(shù)DSEGENDS數(shù)據(jù)段結(jié)束ESEGSEGMENT定義附加段SUMDW2DUP(?)定義存放結(jié)果區(qū)ESEGENDS附加段結(jié)束CSEGSEGMENT定義代碼段ASSUMECS:CSEG,DS:DSEG,ES:ESEG用ASSUME偽指令定義段的性質(zhì)我們看到ASSUME偽指令定義了CSEG是代碼段,兩個(gè)數(shù)相加求和程序DSEGSEGMENT定義數(shù)據(jù)段DATA1DW0F865H定義被加數(shù)DATA2DW360CH定義加數(shù)DSEGENDS數(shù)據(jù)段結(jié)束ESEGSEGMENT定義附加段SUMDW2DUP(?)定義存放結(jié)果區(qū)ESEGENDS附加段結(jié)束CSEGSEGMENT定義代碼段ASSUMECS:CSEG,DS:DSEG,ES:ESEG代碼段DSEG是數(shù)據(jù)段,兩個(gè)數(shù)相加求和程序DSEGSEGMENT定義數(shù)據(jù)段DATA1DW0F865H定義被加數(shù)DATA2DW360CH定義加數(shù)DSEGENDS數(shù)據(jù)段結(jié)束ESEGSEGMENT定義附加段SUMDW2DUP(?)定義存放結(jié)果區(qū)ESEGENDS附加段結(jié)束CSEGSEGMENT定義代碼段ASSUMECS:CSEG,DS:DSEG,ES:ESEG數(shù)據(jù)段ESEG是附加段兩個(gè)數(shù)相加求和程序DSEGSEGMENT定義數(shù)據(jù)段DATA1DW0F865H定義被加數(shù)DATA2DW360CH定義加數(shù)DSEGENDS數(shù)據(jù)段結(jié)束ESEGSEGMENT定義附加段SUMDW2DUP(?)定義存放結(jié)果區(qū)ESEGENDS附加段結(jié)束CSEGSEGMENT定義代碼段ASSUMECS:CSEG,DS:DSEG,ES:ESEG附加段下面我們來(lái)仔細(xì)看一下代碼段的內(nèi)容
在代碼起始的位置定義了一個(gè)標(biāo)號(hào),代碼段START:MOVAX,DSEGMOVDS,AX初始化DSMOVAX,ESEGMOVES,AX初始化ESLEASI,SUMSUM偏移地址送SIMOVAX,DATA1取被加數(shù)ADDAX,DATA2兩數(shù)相加MOVES:[SI],AX和AX→ES:[SI]HLTCSEGENDS代碼段結(jié)束ENDSTART源程序結(jié)束于代碼起始位置定義標(biāo)號(hào)代碼段START,它說(shuō)明了程序起始的位置然后按照慣例,要先對(duì)各個(gè)段寄存器進(jìn)行賦初值的操作START:MOVAX,DSEGMOVDS,AX初始化DSMOVAX,ESEGMOVES,AX初始化ESLEASI,SUMSUM偏移地址送SIMOVAX,DATA1取被加數(shù)ADDAX,DATA2兩數(shù)相加MOVES:[SI],AX和AX→ES:[SI]HLTCSEGENDS代碼段結(jié)束ENDSTART源程序結(jié)束程序起始位置對(duì)段寄存器賦初值于是,你看程序用MOV指令分別為DS和ES賦了初值CS的初值匯編程序會(huì)自動(dòng)添加,不需要我們?cè)诔绦蛑袑?xiě)出來(lái)代碼段START:MOVAX,DSEGMOVDS,AX初始化DSMOVAX,ESEGMOVES,AX初始化ESLEASI,SUMSUM偏移地址送SIMOVAX,DATA1取被加數(shù)ADDAX,DATA2兩數(shù)相加MOVES:[SI],AX和AX→ES:[SI]HLTCSEGENDS代碼段結(jié)束ENDSTART源程序結(jié)束賦初值CS初值匯編程序自動(dòng)添加再下面是取SUM的地址到SI中代碼段START:MOVAX,DSEGMOVDS,AX初始化DSMOVAX,ESEGMOVES,AX初始化ESLEASI,SUMSUM偏移地址送SIMOVAX,DATA1取被加數(shù)ADDAX,DATA2兩數(shù)相加MOVES:[SI],AX和AX→ES:[SI]HLTCSEGENDS代碼段結(jié)束ENDSTART源程序結(jié)束取SUM地址到SI我們可以猜測(cè),程序要把求和的結(jié)果放到SI指向的單元中代碼段START:MOVAX,DSEGMOVDS,AX初始化DSMOVAX,ESEGMOVES,AX初始化ESLEASI,SUMSUM偏移地址送SIMOVAX,DATA1取被加數(shù)ADDAX,DATA2兩數(shù)相加MOVES:[SI],AX和AX→ES:[SI]HLTCSEGENDS代碼段結(jié)束ENDSTART源程序結(jié)束將結(jié)果放至SI指向單元下面就該計(jì)算兩數(shù)之和了首先,先取一個(gè)數(shù)DATA1到AX中代碼段START:MOVAX,DSEGMOVDS,AX初始化DSMOVAX,ESEGMOVES,AX初始化ESLEASI,SUMSUM偏移地址送SIMOVAX,DATA1取被加數(shù)ADDAX,DATA2兩數(shù)相加MOVES:[SI],AX和AX→ES:[SI]HLTCSEGENDS代碼段結(jié)束ENDSTART源程序結(jié)束計(jì)算兩數(shù)之和再取另一個(gè)數(shù)DATA2使用ADD指令,計(jì)算DATA1于DATA2的和代碼段START:MOVAX,DSEGMOVDS,AX初始化DSMOVAX,ESEGMOVES,AX初始化ESLEASI,SUMSUM偏移地址送SIMOVAX,DATA1取被加數(shù)ADDAX,DATA2兩數(shù)相加MOVES:[SI],AX和AX→ES:[SI]HLTCSEGENDS代碼段結(jié)束ENDSTART源程序結(jié)束ADD指令再取另一個(gè)數(shù)DATA2使用ADD指令,計(jì)算DATA1于DATA2的和和會(huì)保存在AX中代碼段START:MOVAX,DSEGMOVDS,AX初始化DSMOVAX,ESEGMOVES,AX初始化ESLEASI,SUMSUM偏移地址送SIMOVAX,DATA1取被加數(shù)ADDAX,DATA2兩數(shù)相加MOVES:[SI],AX和AX→ES:[SI]HLTCSEGENDS代碼段結(jié)束ENDSTART源程序結(jié)束ADD指令保存至AX保存至AX下一條指令就是將AX的內(nèi)容存儲(chǔ)在附加段中SI指向的存儲(chǔ)單元中代碼段START:MOVAX,DSEGMOVDS,AX初始化DSMOVAX,ESEGMOVES,AX初始化ESLEASI,SUMSUM偏移地址送SIMOVAX,DATA1取被加數(shù)ADDAX,DATA2兩數(shù)相加MOVES:[SI],AX和AX→ES:[SI]HLTCSEGENDS代碼段結(jié)束ENDSTART源程序結(jié)束將AX存儲(chǔ)在SI指向存儲(chǔ)單元最后用HLT表示程序停止用ENDSTART表示整個(gè)程序結(jié)束代碼段START:MOVAX,DSEGMOVDS,AX初始化DSMOVAX,ESEGMOVES,AX初始化ESLEASI,SUMSUM偏移地址送SIMOVAX,DATA1取被加數(shù)ADDAX,DATA2兩數(shù)相加MOVES:[SI],AX和AX→ES:[SI]HLTCSEGENDS代碼段結(jié)束ENDSTART源程序結(jié)束程序停止程序結(jié)束下面來(lái)一個(gè)稍微復(fù)雜一點(diǎn)的例子這個(gè)例子也是求和,只是不是兩個(gè)數(shù)的和,而是十個(gè)數(shù)的和求和12H23H34H45H56H67H78H89H9AHFDH求十個(gè)數(shù)的和我們要求10個(gè)數(shù)的和,大家想想可以怎么實(shí)現(xiàn)呢?求10個(gè)數(shù)的和怎么實(shí)現(xiàn)?對(duì),我們可以用循環(huán)指令假設(shè)這10個(gè)數(shù)就是圖示這些數(shù)求和12H23H34H45H56H67H78H89H9AHFDH循環(huán)指令我們首先來(lái)分析一下,要完成這個(gè)功能,程序需要怎么寫(xiě)首先,程序還是分塊來(lái)完成,我們可以將程序分成兩塊一塊是除了代碼段以外的其它段另一塊是代碼段在寫(xiě)代碼段的時(shí)候,先用ASSUME偽指令定于段的性質(zhì),然后給段寄存器賦初值在寫(xiě)算法的時(shí)候,建議大家可以畫(huà)一下流程圖,然后基于流程圖去寫(xiě)程序,就不容易出錯(cuò)。最后不要忘記用END語(yǔ)句結(jié)束程序當(dāng)程序書(shū)寫(xiě)完畢以后,要檢查一下,程序是否有錯(cuò)誤。求十個(gè)數(shù)的和定義除代碼段以外的其他段定義代碼段的開(kāi)始部分寫(xiě)真正的算法:1.畫(huà)流程圖;2.分段;3.填空檢查好,首先我們來(lái)定義除了代碼段以外其他的段求十個(gè)數(shù)的和定義除代碼段以外的其他段定義代碼段的開(kāi)始部分寫(xiě)真正的算法:1.畫(huà)流程圖;2.分段;3.填空檢查除代碼段以外其他段好,首先我們來(lái)定義除了代碼段以外其他的段DATASEGMENTTABLEDB12H,23H,34H,45H,56H,DB67H,78H,89H,9AH,0FDHSUMDW?DATAENDS除代碼段以外其他段那我們就定義一個(gè)數(shù)據(jù)段,它的名字是DATA定義除了代碼段以外的其他段DATASEGMENTTABLEDB12H,23H,34H,45H,56H,DB67H,78H,89H,9AH,0FDHSUMDW?DATAENDS數(shù)據(jù)段除代碼段以外其他段在這個(gè)段中,要定義一個(gè)變量Table,TABLE的操作數(shù)是十個(gè)立即數(shù),每個(gè)立即數(shù)都是一個(gè)字節(jié)的字長(zhǎng)DATASEGMENTTABLEDB12H,23H,34H,45H,56H,DB67H,78H,89H,9AH,0FDHSUMDW?DATAENDS十個(gè)立即數(shù)一個(gè)字節(jié)除代碼段以外其他段接下來(lái)了,再定義一個(gè)變量,用來(lái)存放和變量名用SUM表示,為了防止溢出,我們可以用更大的字長(zhǎng),比如兩個(gè)字節(jié)的字長(zhǎng)來(lái)存儲(chǔ)10個(gè)字節(jié)的和DATASEGMENTTABLEDB12H,23H,34H,45H,56H,DB67H,78H,89H,9AH,0FDHSUMDW?DATAENDS存放和兩個(gè)字節(jié)字長(zhǎng)存儲(chǔ)第二步是寫(xiě)代碼段的開(kāi)頭代碼段的開(kāi)頭CODESEGMENTASSUMEDB12H,23H,34H,45H,56H,STARTMOVAX,DATAMOVDS,AXCODEENDS
ENDSTART在開(kāi)頭的部分要用ASSUME指令定義邏輯段的性質(zhì)然后為DS賦初值代碼段的開(kāi)頭CODESEGMENTASSUMEDB12H,23H,34H,45H,56H,STARTMOVAX,DATAMOVDS,AXCODEENDS
ENDSTART定義段的性質(zhì)賦初值接下來(lái)就是寫(xiě)算法的部分我們先把前面寫(xiě)過(guò)的部分展示出來(lái)我們的算法就是循環(huán)的取加數(shù),然后讓它跟上一次加法的和相加,寫(xiě)算法DATASEGMENTTABLEDB12H,23H,34H,45H,56H,
DB67H,78H,89H,9AH,0FDHSUMDW?DATAENDSCODE
SEGMENTASSUMECS:CODE,DS:DATASTARTMOVAX,DATAMOVDS,AXLEASI,TABLE循環(huán)取加數(shù)與上次加法和相加首先,為了取到加數(shù),我們將table的偏移量保存在SI中,通過(guò)對(duì)SI加1,就可以按順序的取到其它的加數(shù)了寫(xiě)算法DATASEGMENTTABLEDB12H,23H,34H,45H,56H,
DB67H,78H,89H,9AH,0FDHSUMDW?DATAENDSCODE
SEGMENTASSUMECS:CODE,DS:DATASTARTMOVAX,DATAMOVDS,AXLEASI,TABLE取其加數(shù)對(duì)SI+1將偏移量保存在SI因?yàn)?,我們要用循環(huán)指令LOOP,所以要先把循環(huán)的次數(shù)賦值給CX,寫(xiě)算法MOVCX,10XORAX,AXNEXT
ADDAL,[SI]ADCAH,0;若有進(jìn)位加到AH中INCSI
LOOPNEXT MOVSUM,AXHLTCODEENDSENDSTART循環(huán)指令賦值我們每次取一個(gè)加數(shù),所以一共要取10次,因此cx為10然后將AX清0,因?yàn)锳X是用來(lái)保存求和的結(jié)果的寫(xiě)算法MOVCX,10XORAX,AXNEXT
ADDAL,[SI]ADCAH,0;若有進(jìn)位加到AH中INCSI
LOOPNEXT MOVSUM,AXHLTCODEENDSENDSTART保存求和結(jié)果CX為10清0下面從NEXT標(biāo)號(hào)開(kāi)始,進(jìn)行循環(huán)首先取SI指向的內(nèi)存單元的數(shù)與AL相加,相加的結(jié)果可能會(huì)溢出,于是用ADC將CF的值加到高位AH中,這樣就可以一直保留最高位向更高位的進(jìn)位了寫(xiě)算法MOVCX,10XORAX,AXNEXT
ADDAL,[SI]ADCAH,0;若有進(jìn)位加到AH中INCSI
LOOPNE
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版智能凈水系統(tǒng)安裝與維護(hù)服務(wù)合同范本
- 二零二五年度餐飲場(chǎng)地租賃及節(jié)假日促銷(xiāo)合同
- 2025版復(fù)雜多元化主題公園美陳設(shè)施租賃合同
- 2025版房地產(chǎn)項(xiàng)目投資買(mǎi)賣(mài)合伙人合作協(xié)議范本
- 二零二五版?zhèn)€人養(yǎng)老理財(cái)擔(dān)保合同
- 2025版網(wǎng)絡(luò)安全防護(hù)技術(shù)服務(wù)合同書(shū)
- 二零二五年度房產(chǎn)分割協(xié)議書(shū):父母房產(chǎn)分割與子女未來(lái)發(fā)展保障
- 二零二五年度建筑工程監(jiān)理補(bǔ)充協(xié)議范本(綠色環(huán)保材料專(zhuān)項(xiàng))
- 2025版電商企業(yè)客戶(hù)信息保密及網(wǎng)絡(luò)安全保護(hù)協(xié)議
- 二零二五年度企業(yè)領(lǐng)導(dǎo)力培訓(xùn)合同
- 檢驗(yàn)量檢具考試題及答案
- 一種基于ESP32嵌入式微處理器的WIFI智能小車(chē)設(shè)計(jì)9600字【論文】
- 主、被動(dòng)防護(hù)網(wǎng)施工方案-圖文
- 2025-2030年中國(guó)風(fēng)電塔筒行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- 光伏發(fā)電項(xiàng)目經(jīng)濟(jì)評(píng)價(jià)規(guī)范
- 茅臺(tái)招聘考試試題及答案
- 舞蹈機(jī)構(gòu)加盟協(xié)議合同
- (高清版)DB33∕T 310003-2021 長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)固定污染源廢氣現(xiàn)場(chǎng)監(jiān)測(cè)技術(shù)規(guī)范
- 管道防腐陰極保護(hù)施工合同8篇
- 吊籃安全施工方案交底
- 食品生產(chǎn)安全事故案例分析試題及答案
評(píng)論
0/150
提交評(píng)論