組合語言程式設計
實驗報告
一、【課程設計目的】
1.熟練掌握組合語言指令
2.掌握組合語言程式格式、迴圈與分支程式設計、子程式設計、巨集彙編
3.掌握模組化程式設計
4.培養動手能力
5.培養程式設計者解決問題的能力
二、【課程設計任務】
1、判斷閏年
根據輸入的具體年份(在1900-2100之間,要求對輸入進行有效性檢查),判斷是否閏年,並給出相應的提示資訊
2、資料加密程式
輸入乙個字串,對其進行加密並輸入(加密演算法自選)。
3、加減乘除四則運算
對使用者輸入的乙個包含兩個十進位制的運算元的加減乘除表示式求出其結果並輸出,對使用者的輸入需要進行有效性判斷。
4、在螢幕上開出三個視窗:
用「<-」和「->」鍵選擇左視窗或右視窗為當前活動視窗,從鍵盤輸入字元,字元就會從當前活動視窗的最下行開始顯示,同時也在下視窗顯示。當一行字元顯示滿後(左右視窗一行顯示20個字元,下視窗顯示50個字元),視窗自動向上捲動一行,輸入的字元仍顯示於最低一行,視窗最高一行向上捲動後消失,按esc鍵程式執行結束。
三、【實驗環境】
作業系統:windows xp
測試軟體名稱:masm for windows整合實驗環境
上機地點:校本部科技樓4樓
四、【實驗內容】
實驗一:判斷閏年
1、實驗思路
①輸入:輸入乙個年份進行全面的容錯處理(不能輸入數字以外的字元,有且只能輸入四位數,且範圍在1900到2100之間),然後將輸入的四個字元轉換成機內十進位制存入相應字串中
②判斷閏年:為了減少計算量,不必要四位一起進行判斷,可先判斷後兩位對應的十進位制數是否為0,如果為0,則說明該年份可以被100整除;否則不能被一百整除。
如果能被一百整除,則判斷前兩位對應的十進位制能否被4整除,如果能,則該年份可以被400整除,是閏年,否則不是閏年;
如果後兩位不為零,則判斷後兩位能否被4整除,如果能,說明該年份可以被4整除且不能被100整除,是閏年,否則不是閏年。
③輸出:如果是閏年,呼叫dos顯示「leap year!」;
否則,呼叫dos顯示「not a leap year!」。
2、流程圖
3、實驗資料及執行結果
各種容錯處理
閏年判斷
實驗二:資料加密程式
1、實驗思路
①輸入:呼叫dos中斷21的功能1,迴圈輸入字元存入段內字串(限制長度為100)
②加密:從字串第一位開始一次對每乙個字元進行加密,如果是數字,將字元倒置;如果是大寫字母,將其變為小寫字母然後倒置;如果是小寫字母,將其變為大寫字母然後倒置;其他的字元進行減1處理。
加密後的字元存入另一字串
③輸出:呼叫dos中斷21的功能9,將加密後的字串輸出
2、流程圖
3、實驗資料及執行結果
執行程式輸入字串「abcdabcd1234+-/*」,結果如下圖:
實驗三:加減乘除四則運算
1、實驗思路
①為避免暫存器溢位,使程式更簡單,本程式兩個運算元最高只能為4位,即最大為9999
②輸入:迴圈呼叫dos 中斷21的功能1,將表示式完整的儲存到字串1中,以回車鍵結束輸入
③判斷有效性:
一、從字串第一位開始逐位判斷是否是數字或加減乘除,如果不是輸出錯誤;否則執行下一步
二、如果是加減乘除中的乙個,用bx記下符號位置,並執行dx累加1(dx初始為0),如果整個字串長度判斷完成後,dx不等於1,輸出錯誤;否則執行下一步
三、由於運算符號不能位於表示式開頭或結尾,所以需判斷bx是否等於0或是否等於字串最後一位,如果是,輸出錯誤;否則執行下一步
四、判斷運算符號前後字串的長度是否大於4,如果是,輸出錯誤;否則進入運算
④運算:將字串中的兩運算元轉換為機內二進位制,並根據運算符號
選擇加減乘除運算,其中乘法運算中要採用32位暫存器,避
免在轉換十進位制過程中出現錯誤;除法運算要保留一位小數
⑤輸出結果:將表示式運算結果,迴圈除以10,將餘數轉換成字元後倒序存入另一字串,並呼叫dos中斷21的功能9輸出結果
2、流程圖
3、實驗資料及執行結果
有效性判斷
正確情況下的各種運算
實驗四:螢幕視窗輸入顯示
1、實驗思路
①本實驗與前幾個實驗不同,需要開出三個視窗,並要求用左右鍵控制在哪個視窗輸入,這些都要用bios中斷功能來實現
②通過對題目要求的揣摩和對書上第九章內容的學習,本程式主要用到清屏、卷屏、輸入、顯示、置游標位置幾個基本模組,因為這些模組都被呼叫多次,且引數較多,本實驗開始用巨集實現這幾個模組
③本實驗需要用左右鍵控制游標位置,而左右鍵的ascii碼為0,需要用其掃瞄碼判斷,呼叫bios中斷16的功能1,鍵盤輸入時,鍵位的ascii碼存入al,而掃瞄碼存入ah,則需要判斷ah對應的掃瞄碼是否是左右鍵,完成對游標的控制
2、流程圖
3、實驗資料及執行結果
執行程式,程式預設開始在左視窗輸入,左下兩個視窗顯示:
按右鍵,游標移至右視窗,繼續輸入右下兩個視窗顯示:
按左鍵,游標回到左視窗上次截止輸入的位置,繼續輸入左下兩視窗繼續顯示:
按esc鍵,程式退出,如下:
五、【實驗源程式清單】
實驗一:判斷閏年
根據輸入的具體年份(在1900-2100之間,要求對輸入進行有效性檢查),判斷是否閏年,並給出相應的提示資訊
data segment
num db 10 dup(?)
stringin db 'please input the year:',0ah,0dh,'$'
error db 'input error or not in the range!',0dh,0ah,'$'
string1 db 'not leap year!',0dh,0ah,'$'
string2 db 'leap year!',0dh,0ah,'$'
clrf db 0dh,0ah,'$'
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov cx,10
mov si,0
lea dx,stringin
mov ah,9
int 21h
loopin: ;輸入年份
mov ah,1
int 21h
cmp al,1bh
jz exit
cmp al,0dh
jz judge1
sub al,30h
mov num[si],al
inc si
loop loopin
judge1: ;是否是4位
lea dx,clrf
mov ah,9
int 21h
cmp si,4
jnz stop
mov cx,4
jmp judge2
judge2: ;是否是數字
dec si
mov bl,num[si]
cmp bl,0
jb stop
cmp bl,9
ja stop
cmp si,0
loop judge2
judge3: ;是否在1900到2100之間
mov al,num[0]
mov bl,10
mul bl
mov bl,num[1]
add ax,bx
cmp ax,19
jb stop
cmp ax,21
jae stop
judge4: ;是否是閏年
mov al,num[2]
mov bl,10
mul bl
mov bl,num[3]
add ax,bx
cmp ax,0
jnz continue
;能被100整除
mov al,num[0]
mov bl,10
mul bl
mov bl,num[1]
add ax,bx
mov bl,4
div bl
cmp ah,0
jnz display1 ;不能被400整除,不是閏年
jmp display2 ;能被400整除,是閏年
continue: ;不能被100整除
mov bl,4
div bl
cmp ah,0
jnz display1 ;不能被4整除,不是閏年
jmp display2 ;能被4整除,是閏年
display1: ;顯示是閏年
lea dx,string1
mov ah,9
int 21h
jmp start
display2: ;顯示不是閏年
lea dx,string2
mov ah,9
int 21h
jmp start
stop: ;顯示輸入錯誤
lea dx,error
mov ah,9
int 21h
jmp start
exit:
mov ah,4ch
int 21h
code ends
end start
實驗二:資料加密程式
輸入乙個字串,對其進行加密並輸入(加密演算法自選)。
組合語言程式設計實驗報告
2011年 11 月 27日 實驗三迴圈程式設計 一 實驗目的 1 學習除錯程式,查詢邏輯錯誤 2 掌握迴圈程式設計的方法 3 掌握正確分配與使用暫存器。二 實驗內容與要求 題目1 陣列中是一組無符號數,將最小數放在m單元中,經過彙編後,形成.exe檔案,先用g 0命令執行程式,用 d命令檢視m單元...
組合語言程式設計實驗報告
實驗室 s318 最後一次實驗時間 2010 年 5 月18 日 第12周星期二1 2節 學院 電腦科學與技術學院 專業 電腦科學與技術 實驗一實驗題目 認識tddebug整合環境 實驗目的 1.熟悉匯程式設計序的開發過程。2.認識tddebug整合操作軟體。3.掌握在tddebug整合環境中編輯 ...
組合語言程式設計實驗報告二
1 實驗目的 1 加深對迴圈結構的理解。2 掌握迴圈程式的設計方法。3 學習子程式的定義和呼叫方法。4 掌握子程式 子程式的巢狀 遞迴子程式的結構。5 掌握子程式設計 編制及除錯。6 熟練掌握debug的常用命令,學會用debug除錯程式。2 實驗內容 1 編制在螢幕上顯示九九乘法表的程式。2 編制...