日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

汇编语言程序设计实验三

發(fā)布時間:2023/12/10 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 汇编语言程序设计实验三 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、實驗?zāi)康?/strong>

掌握匯編編程規(guī)范,熟悉編程環(huán)境。

二、實驗內(nèi)容

1、編寫子程序把字符串中的小寫字母轉(zhuǎn)變?yōu)榇髮懽帜?#xff08;參見教材實驗11)。
2、編寫0號中斷處理程序,使得在除法溢出發(fā)生時在屏幕中間顯示“divide error!”(參見教材實驗12)。(請預(yù)習(xí)第12章并完成實驗,時間不夠則在課后完成)

三、實驗步驟算法及關(guān)鍵代碼

題目一
1.實驗思路與算法

①思路:
本題其實沒有在程序思想上設(shè)置難度,但重點是子程序和轉(zhuǎn)變的問題,其中轉(zhuǎn)變問題在第七章其實已經(jīng)講到,只需要循環(huán)取出數(shù)據(jù)區(qū)域的字符,與11011111B進行與運算,將每個字符ASCII碼的第五位置置0,這樣就可以實現(xiàn)小寫轉(zhuǎn)大寫;子程序需要使用call語句與ret語句,其中在子程序中,由于有循環(huán)的產(chǎn)生且未給出既定的字符串長度,希望可以驗證字符串中0的存在,因此需要使用je語句當做高級程序中的break語句,判斷數(shù)據(jù)區(qū)的當前數(shù)據(jù)是否等于0,如果減0等于0,則跳出循環(huán)返回主程序;還需要使用jb,ja語句當做高級語言中的continue,這樣其實大體的框架就搭好了。

②相關(guān)設(shè)置與算法:
設(shè)置DS存儲數(shù)據(jù)區(qū)域的段地址datasg,設(shè)置SI存儲當前讀到的數(shù)據(jù)區(qū)的偏移地址;
子程序中需要進行字符串的大寫轉(zhuǎn)化:
取出一個數(shù)據(jù),首先判斷是否完成循環(huán),與AH進行CMP運算,使用JE語句驗證,如果ZF為一,則證明數(shù)據(jù)為0,由JE語句調(diào)到RET指令完成循環(huán);
如果未完成循環(huán),則進行字符判斷,將字符分別與61H(‘a(chǎn)’)與7BH(“z”)進行CMP運算,若ASCII碼范圍不在61H-7BH中則跳出本次循環(huán)。
否則,將數(shù)據(jù)進行與運算之后傳回原位置

子程序:

LETTERC:S:MOV AH,[SI]CMP AH,0JE S2CMP AH,61HJB S1CMP AH,7BHJA S1AND AH,11011111BMOV [SI],AHS1:INC SI LOOP S S2:RET

2.實驗代碼

ASSUME CS:CODESG DATASG SEGMENTDB "beginner's All-purpose Symbolic Instruction Code.",0 DATASG ENDS CODESG SEGMENT BEGIN:MOV AX,DATASGMOV DS,AXMOV SI,0CALL LETTERCMOV AH,4CHINT 21H LETTERC:S:MOV AH,[SI]CMP AH,0JE S2CMP AH,61HJB S1CMP AH,7BHJA S1AND AH,11011111BMOV [SI],AHS1:INC SILOOP SS2:RET CODESG ENDS END BEGIN

3.實驗結(jié)果




處理后

題目二
1.實驗思路與算法

①思路:
本題其實在教材中使用了大半個章節(jié)進行講解,具體的思路其實比較清晰
首先需要將中斷處理程序安裝到指定的0:200-0:2FF,然后設(shè)置中斷向量表,將0號中斷向量表中的IP與CS內(nèi)容指向0:200處;由于操作系統(tǒng)隨時可能調(diào)用中斷處理程序,所以需要將顯示的內(nèi)容“divide error!”也存到0:200-0:2FF中,這樣的話就需要在do0程序中使用jmp指令轉(zhuǎn)到真正需要使用的中斷處理程序。
安裝程序的方法需要使用串傳送指令,將代碼段中的do0程序直接傳送到0:200-0:2FF中;
中斷向量的設(shè)置其實就是將CS與IP傳到0號向量空間;
在中斷處理程序中,其實是將數(shù)據(jù)區(qū)的內(nèi)容復(fù)制到顯示緩沖區(qū)的相應(yīng)位置中即可
②相關(guān)設(shè)置與算法
見注釋

2.實驗代碼

ASSUME CS:CODES CODES SEGMENT START:;DS指向代碼段段地址(源地址)MOV AX,CSMOV DS,AX;SI指向代碼段的偏移地址(源地址)MOV SI,OFFSET DO0;ES指向目標段的段地址MOV AX,0MOV ES,AX;DI指向目標段的偏移地址MOV DI,200H;CX存儲DO0程序的長度MOV CX,DO0END-OFFSET DO0;設(shè)置傳輸方向為正CLD;按照Byte進行傳輸指令REP MOVSB;設(shè)置中斷向量表MOV AX,0MOV ES,AXMOV WORD PTR ES:[0],200HMOV WORD PTR ES:[2],0;除法溢出程序MOV AX,1000HMOV BH,1DIV BHMOV AX,4C00HINT 21H;由于需要讓目標字串存到內(nèi)存中防止程序結(jié)束后被修改,需要使用另一個標號指向真正的DO0: JMP SHORT DO0STARTDB "divide error!";由于到目標段時代碼段地址一定存儲著中斷處理程序段地址,所以將DS和CS一致DO0START: MOV AX,0MOV DS,AX;設(shè)置SI指向DB數(shù)據(jù)MOV SI,202H;設(shè)置ES指向顯示屏的中心位置MOV AX,0B800HMOV ES,AXMOV DI,12*160+36*2;設(shè)置CX為字符串長度,便于讀取MOV CX,13;讀取DB數(shù)據(jù)并挪到顯示屏內(nèi)存中進行顯示S:MOV AL,[SI]MOV ES:[DI],ALINC SIINC DIINC DILOOP SMOV AH,4CHINT 21H DO0END: NOP CODES ENDSEND START

3.實驗結(jié)果


四、實驗小結(jié)(簡單說明實驗過程中出現(xiàn)的問題和解決方法)

本次實驗分為兩道題,第一道題中考察了對之前學(xué)習(xí)的知識的整體運用,并使用CMP與JA,JB,JZ指令完成了條件循環(huán)與break,continue功能,從而完成對目標字符串中符合要求的字符進行處理的目的,同時復(fù)習(xí)了大小寫字母轉(zhuǎn)換的相關(guān)知識;而第二個題目對新學(xué)習(xí)的中斷處理程序與中斷向量表的知識進行了一定的應(yīng)用與設(shè)計,起初由于對CMP與條件指令的應(yīng)用不熟,在編程過程中碰到了比較多的問題,尤其是在子程序中對語句的跳轉(zhuǎn),一度無法編譯,最終發(fā)現(xiàn)是死循環(huán)的問題并進行了解決;而在第二道題中因為教材中其實有對實驗的講解與代碼,重要的其實變成了對程序的理解,在編程過程中我選擇了邊編程邊注釋的方式,在自己的理解中完成這次的中斷過程,最終對其的理解深了一層。
總體來說,本次的實驗難度是有的,尤其是在子程序部分,子程序完成了對功能的劃分與封裝,這個思想其實和高級語言的函數(shù)有著異曲同工之妙,因此在使用子程序的時候和函數(shù)進行了一定的類比,最終成功完成了標號與跳轉(zhuǎn)的一個對應(yīng),這個是我在本次實驗中十分重要的收獲。

總結(jié)

以上是生活随笔為你收集整理的汇编语言程序设计实验三的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。