汇编语言程序设计实验报告
運行環境masmplus
鏈接:https://pan.baidu.com/s/1jWoLfvxBxQgxd6wq21GK0w
提取碼:ih43
目錄
- 實驗1 匯編語言源程序的輸入
- 實驗目的
- 實驗原理
- 實驗儀器
- 實驗步驟
- 實驗要求
- 實驗2 數據的建立與傳送程序
- 實驗目的
- 實驗原理
- 實驗儀器
- 實驗步驟
- 實驗要求
- 實驗3 分支程序設計
- 實驗目的
- 實驗原理
- 實驗儀器
- 實驗步驟
- 實驗要求
- 實驗4 統計學生成績程序
- 實驗目的
- 實驗原理
- 實驗儀器
- 實驗步驟
- 實驗要求
- 實驗5 學生成績名次表實驗
- 實驗目的
- 實驗原理
- 實驗儀器
- 實驗步驟
- 實驗要求
實驗1 匯編語言源程序的輸入
實驗目的
1.通過實驗了解和熟悉微機系統的配置。
2.學習在DEBUG狀態下輸入匯編源程序的方法。
3.初步掌握調試(在DEBUG狀態下)的過程。
實驗原理
1、本實驗要求在DEBUG狀態下輸入匯編源程序,并用DEBUG命令進行調試。用單步跟蹤的方法驗證指令的功能。
2、 以下是給定的參考程序,并在實驗時在每條指令的“;”符號右邊按要求填寫指令的執行結果。
注:
⑴ 微機進入DEBUG狀態下之后,一切立即數和地址數據均被默認為十六進制數,在輸入時數的后面不加后綴“H”;
⑵ 在DEBUG狀態下執行程序時,“INT 20H”指令可使系統執行完該指令前的程序時返回到“-”提示符狀態,并且恢復CS和IP寄存器原來的值。
實驗儀器
微機一臺。
實驗步驟
1、開機后進入DOS系統,
C > DEBUG↙ (↙回車符)
- (為DEBUG 提示符)
當顯示器出現提示符“-”時,說明已進入DEBUG狀態,這時,可用DEBUG命令進行操作。
2、 用DEBUG的Register命令檢查所有寄存器內容,并作記錄。命令格式:
R [寄存器名]
該命令的功能是顯示寄存器的內容,或修改某一指定寄存器內容,若[寄存器名]缺省,則顯示所有寄存器內容。例如:
-R
3、 用DEBUG的Assemble命令輸入匯編源程序。格式:
A [內存地址]
注:用“[ ]”符號括起來的部分表示可以省略。
該命令的功能是從指定的內存地址開始(括號不要輸入)逐條輸入匯編語言源程序并匯編成機器碼存入內存。若地址缺省,則接上一個A命令最后一條指令之后輸入匯編語句,若沒有用過A命令,則從CS:0100H地址開始輸入。例如:
-A
0CD3:0100-
在輸入A命令之后,或每輸入一條指令之后,顯示器的左端給出了內存的段地址和偏移地址。
每條指令均用回車(↙)結束。若輸入的指令有語法錯誤,DEBUG拒絕接收,并給出提示,此時可以重新輸入。程序的最后一條指令輸入完之后,再按一次回車鍵(↙),即可結束匯編命令,回到DEBUG提示符“-”狀態。
4、 用DEBUG的Unassemble命令反匯編。命令格式:
U [起始地址[終止地址]]
該命令的功能是從起始地址到終止地址反匯編目標碼,缺省值是接上一個U命令或從CS:0100H地址開始。例如:
-U
顯示器上將顯示程序的內存地址、指令機器碼的匯編源程序三列對照清單。
5、用DEBUG的Trace命令單步跟蹤程序。命令格式:
T 【=起始地址】【指令條數】
該命令的功能是從指定的起始地址開始逐條執行指令,每執行完一條指令,屏幕顯示所有寄存器內容和下一條指令地址和指令。若[=起始地址]缺省,則T命令從CS:IP地址開始執行指令。
例如:
-T↙
重復這一過程,即可看到每條指令執行后,所有寄存器和標志寄存器的標志位內容。此時,要檢查內存單元的數據,可用DEBUG的D命令。
6. 用DEBUG的Dump命令顯示存貯器單元的內容。命令格式:
D[起始地址[終止地址]]
該命令的功能是從起始地址到終止地址,連續顯示存貯器單元的內容。若地址缺省,則接上一個D命令或從DS:0100H地址開始顯示。例如:
-D↙
參考程序:
MOV AX, 2000 ; AL=00H
MOV DS, AX ; DS=2000H
NOT AX ; AX=0DFFFH
XOR AX, AX ; AX=0000H
DEC AX ; AX=0FFFFH
INC AX ; AX=0000H
MOV BX, 2030 ; BH=20H
MOV SI, BX ; SI=2030H
MOV [SI], BL ; [2030H]=30H
MOV WORD PTR[SI], 10F ; [2030H]=0FH [2031H]=01H
MOV DI, SI ; DI=2030H
MOV [DI+50], BH ; [DI+50H]=20H
MOV BH, [SI] ; BH=0FH
MOV BL, [DI+50] ; BL=20H
MOV SP, 5000
PUSH AX ; AX=0000H [SS:4FFEH]=00H [SS:4FFFH]=00H
PUSH BX ; BX=0F20H [SS:4FFCH]=20H [SS:4FFDH]=0FH
POP AX ; AX=0F20H
POPF ; F=00000000
NEG BX ; BX=F0E0H
XCHG BX, AX ; BX=0F20H
STD ; F=01010001
STI ; F=01110001
CLD ; F=00110001
CLI ; F=00010001
ADC DI, 2050 ; DI=4081H F=00000010
ADC SP, DI ; SP=9081H F=10010010
ADC AX, 1500 ; AX=05E0H F=00000001
SUB AX, BX ; AX=F6C0H BX=0F20H
SHL AH, 1 ; AH=ECH
RCL AX, 1 ; AX=D981H
SHR BH, 1 ; BH=07H
RCR BL, 1 ; BL=90H
MOV CL, 4
MOV DX, 80F0
ROL DX, CL ; DX=0F08H CL=04H
INT 20 ; CS= F000H IP=1480H
實驗要求
1、整理每條指令執行的結果,填到打印清單的右半部分(應注意內存數據檢查的正確性)。
結果如上述表格所示。
2. 比較實驗記錄與理論分析的結果是否相同,若有不同,找出差別及問題所在。
實驗記錄和理論分析結果是相同的。
3.總結本次實驗的體會。
主要學習了在DEBUG狀態下輸入匯編源程序的方法以及調試過程。當顯示器出現提示符“-”時,用 DEBUG 命令進行操作,-r是顯示寄存器的內容,輸入匯編源程序用-a,單步執行用-t, 顯示存貯器單元的內容用-d.
實驗2 數據的建立與傳送程序
實驗目的
1、繼續學習DEBUG命令。
2、驗證指令的功能。
實驗原理
在DEBUG狀態下,分別輸入下面各程序段,每輸入完一個程序段,用G命令進行連續方式執行程序,在連續執行時,要記錄程序的執行結果。
參考程序:
1. 在內存10000H單元開始,建立00H~0FH~00H 31個數,要求00H~0FH數據逐漸增大,0FH~00H逐漸減小。該程序從內存CS:0100H地址開始輸入。
MOV AX, 1000H
MOV DS, AX
MOV SI, 0
MOV CL, 0FH
XOR AX, AX
PPE1: MOV [SI], AL
INC SI
INC AL
DEC CL
JNZ PPE1
MOV CX, 10H
PPE2: MOV [SI], AL
INC SI
DEC AL
LOOP PPE2
INT 20H
注:轉移指令的符號地址直接用絕對偏移地址,該地址在用A命令匯編輸入時,可以看到程序全部運行完之后,可用DEBUG的Dump命令查看建立的數據塊內容。例如:
-D1000:00 1E
2、把上一個程序的執行結果(建立的31個字節數據塊,其首地址在10000H),分幾種方式傳送到以下指定的區域。
(a) 該程序從內存CS:0150H開始輸入。把數據塊傳送到15050H開始的存貯區域中。
參考程序: MOV AX, 1000H
MOV DS, AX
MOV SI, 0
MOV DI, 5050H
MOV CX, 1FH ; 數據塊長度是31
PPEA: MOV AL, [SI]
MOV [DI], AL
INC SI
INC DI
LOOP PPEA
INT 20H
檢查內存數據塊的傳送情況,可用“D”命令。
(b) 用串傳送指令MOVSB,把數據塊傳送到15150H開始的區域,該程序從內存CS:0200H開始輸入。
檢查程序最后的執行結果,可用“D”命令,例如:
-D1000:5150↙
? 用重復串操作指令“REP MOVSB”把數據塊傳送到15250H開始的區域。該程序從CS:250H地址開始輸入。
檢查程序的最后執行結果時,可用:
-D1000: 5250H
(d) 用串操作的減量工作方式,把數據塊傳送到25050H開始的區域。該程序從CS:0300H開始輸入。
檢查程序的最后執行結果,用D命令:
-D2000:5050↙
實驗儀器
微機一臺。
實驗步驟
參照實驗一的步驟,按照本實驗程序的內容,分別輸入各段程序,連續執行程序,記錄每個程序段的最后結果。若想把源數據塊重新換一批數據,可以用DEBUG的Fill命令填充新的數據。例如:
-F1000:00 L1F 33↙
從1000:0000H開始的31個字節被替換成33H。
實驗要求
預習要求:
1.認真閱讀DEBUG調試程序的命令說明。
2.仔細閱讀本實驗給出的程序段。
3.寫出每個程序段的結果數據(分析結果),并說明結果所在的位置(寄存器或存貯器)。
報告要求:
1、整理每個程序段在實驗時的記錄內容。
如上圖所示。
2、 比較每個程序段的特點。
第一個程序執行完后,即已經存入數據,第二個程序采用了四種方式將它的執行結果傳送到了指定的區域,不論是串操作指令,重復串操作指令,串操作的減量工作方式,都精確的傳送到了指定的區域。
3、分析本次實驗出現的問題,找出問題所在。
本次實驗進行時,出現了用g命令運行死掉的情況,int20h 來結束程序有要求的,就時棧頂必須是 psp:0000 向量,最后我直接用 g=100 107 直接在需要的功能后停下來,就解決了問題。
實驗3 分支程序設計
實驗目的
⒈、練習分支程序的編寫方法。
⒉、練習匯編語言程序的上機過程。
實驗原理
⒈、通過分支程序設計調試和運行,進一步熟悉掌握匯編程序執行的軟件環境。
⒉、通過分支程序的執行過程,熟悉EDIT的使用,建立OBJ文件EXE文件的方法。
實驗儀器
⒈、 微機一臺。
實驗步驟
1.給出三個有符號數,編寫一個比較相等關系的程序:
(1)如果這三個數都不相等,則顯示0;
(2)如果這三個數中有兩個數相等,則顯示1;
(3)如果這三個數都相等,則顯示2;
源程序如下:
執行結果:
2.從鍵盤上輸入一串字符到輸入緩沖區,找出其中的大寫字母和小寫字母,并分別統計它們的個數,結果放到變量num1和num2中,要求在屏幕輸出顯示所有字母及變量num1和num2的值。
源程序如下:
執行結果:
實驗要求
1.該源程序在DEBUG和EDIT兩種狀態下運行。
2. 實驗報告中要有源程序和執行結果。
實驗4 統計學生成績程序
實驗目的
進一步掌握分支程序和循環程序的編寫方法。
實驗原理
設有10個學生的成績分別為56、69、84、82、73、88、99、63、100和80分。試編制程序分別統計低于60分、60~69分、70~79分、80~89分、90~99分及100分的人數存放到s5、s6、s7、s8、s9及s10單元中。
這一題目的算法很簡單,成績分等部分采用分支結構,統計所有成績則用循環結構完成。程序框圖如下圖所示。
實驗儀器
1、 微機一臺。
實驗步驟
參考給的流程圖編寫源程序,進行調試。
流程圖如下:
程序如下:
;PROGRAM TITLE GOES HERE――result ;************************************ DATAREA SEGMENT ;DEFINE DATA SEGMENTGRADE DW 56,69,84,82,73,88,99,63,100,80S5 DW 0S6 DW 0S7 DW 0S8 DW 0S9 DW 0S10 DW 0 DATAREA ENDS ;************************************ PROGNAM SEGMENT ;DEFINE CODE SEGMENT ;---------------------------- MAIN PROC FAR ; MAIN PART OF PROGRAM ASSUME CS:PROGNAM, DS:DATAREA START: ; STARTING EXECUTION ADDRESS ; SET UP STACK FOR RETURNPUSH DS ; SAVE OLD DATA SEGMENTSUB AX,AX ; PUT ZERO IN AXPUSH AX ; SAVE IT ON STACK ; SET DS REGISTER TO CURRENT DATA SEGMENTMOV AX,DATAREA ; DATAREA SEGMENT ADDRMOV DS,AX ; INTO DS REGISTER ; MAIN PART OF PROGRAM GOES HEREMOV S5, 0 ; INITIALIZE COUNTERMOV S6, 0MOV S7, 0MOV S8, 0MOV S9, 0MOV S10, 0MOV CX, 10 ; INITIALIZE LOOP COUNT VALUEMOV BX, OFFSET GRADE ; INITIALIZE FIRST ADDR COMPARE:MOV AX,[BX] ; GET A RESULTCMP AX, 60 ; <60?JL FIVECMP AX, 70 ; <70?JL SIXCMP AX, 80 ; <80?JL SEVENCMP AX, 90 ; <90?JL EIGHTCMP AX, 100 ; =100?JNE NINEINC S10JMP SHORT CHANGE_ADDR NINE: INC S9JMP SHORT CHANGE_ADDR EIGHT: INC S8JMP SHORT CHANGE_ADDRSEVEN: INC S7JMP SHORT CHANGE_ADDRSIX: INC S6JMP SHORT CHANGE_ADDRFIVE: INC S5 CHANGE_ADDR:ADD BX, 2LOOP COMPARERET ; RETURN TO DOS MAIN ENDP ; END OF MAIN PART OF PROGRAM ; ------------------------------ PROGNAM ENDS ;***************************END START ; END ASSEMBLY實驗要求
1.讀懂所給的程序。
2.編寫將存放于S5、S6、S7、S8、S9及S10單元中的數據在屏幕上顯示出來的部分程序。
編寫的程序:
在S10與datarea ends之間定義了輸出的提示信息:
在loop compare與ret之間進行輸出:
mov dx,offset n1 ;輸出s5 mov ah,9 int 21h mov dx,s5 add dx,30h mov ah,2 int 21h mov dx,offset crlf mov ah,9 int 21h mov dx,offset n2 ;輸出s6 mov ah,9 int 21h mov dx,s6 add dx,30h mov ah,2 int 21h mov dx,offset crlf mov ah,9 int 21h mov dx,offset n3 ;輸出s7 mov ah,9 int 21h mov dx,s7 add dx,30h mov ah,2 int 21h mov dx,offset crlf mov ah,9 int 21h mov dx,offset n4;輸出s8 mov ah,9 int 21h mov dx,s8 add dx,30h mov ah,2 int 21h mov dx,offset crlf mov ah,9 int 21h mov dx,offset n5;輸出s9 mov ah,9 int 21h mov dx,s9 add dx,30h mov ah,2 int 21h mov dx,offset crlf mov ah,9 int 21h mov dx,offset n6;輸出s10 mov ah,9 int 21h mov dx,s10 add dx,30h mov ah,2 int 21h輸出的信息如下:
實驗5 學生成績名次表實驗
實驗目的
進一步熟悉排序方法。
實驗原理
將0~100之間的10個成績存入首址為1000H的單元中。1000H+i表示學號為i的學生成績,編寫程序能在2000H開始的區域排出名次表。2000H+i為學號i的學生的名次。
參考主程序:
程序SCAN:
實驗儀器
1、微機一臺。
實驗步驟
1.參考流程圖編寫實驗程序,進行調試。
2.記錄實驗結果。
3.寫出標準實驗報告。
實驗要求
源程序如下:
CRLF MACRO MOV AH, 02H MOV DL, 0DH INT 21H MOV AH, 02H MOV DL, 0AH INT 21H ENDM DATA SEGMENT res db 'The sorted result is:',0dh,0ah,'$' STUNUM EQU 10 MESS DB ' INPUT 10 STUDENTS SCORE: ',0DH,0AH,'$' ERROR DB ' INPUT ERROR!',0DH,0AH,'$'ORG 1000H SCORE DB 10 DUP (?)ORG 2000H SEQU DB 10 DUP (?) DATA ENDS STACK SEGMENT STA DW 12 DUP (?) TOP DW ? STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK START: MOV AX, DATAMOV DS, AXMOV ES, AXMOV SP, TOP ; 初始化MOV AH, 09HMOV DX, OFFSET MESSINT 21H ; 顯示提示信息MOV SI, OFFSET SCORE ; 成績表首址MOV CX, STUNUM ; 學生數送CX UUU: CALL GETNUM ; 讀取鍵入數值送DXMOV [SI], DL ; 存入成績表緩沖區INC SI ; 指向下一單元LOOP UUUMOV CX, STUNUM ; 學生數MOV DI, OFFSET SEQU ; 名次表首址mov dx,offset res;輸出提示信息mov ah,9int 21h VVV: CALL SCAN ; 掃描子程序MOV AL, STUNUM ; 學生數SUB AL, CLINC AL ; 計算名次MOV BX, DX MOV [DI+BX], AL ; 記DX學號對應名次LOOP VVVMOV CX, STUNUM ; 學生數MOV SI, OFFSET SEQU ; 名次表首址 WWW: MOV AL, [SI]CALL DISP1CRLFINC SILOOP WWW ; 顯示排定的學生名次MOV AX, 4C00HINT 21H SCAN PROC NEAR ; 子程序,每掃描一遍成績表緩沖區, 找出其中成績最高者由DX指針指示對應學生 之后將該成績清除,以便下一次掃描 PUSH CX MOV CX, STUNUM ;學生數 MOV AL, 00H ;最低成績 MOV BX, OFFSET SCORE MOV SI, BX ;指向成績表首址 CCC: CMP AL, [SI] JAE JJJ ;AL中的成績不低于成績表指針SI所指單元的成績則轉JJJMOV AL, [SI] ;AL存放較高的成績MOV DX, SI SUB DX, BX ;DX為對應學號 JJJ: INC SI ;指向下一單元LOOP CCCADD BX, DX MOV BYTE PTR[BX], 00H ;本次掃描成績最高者清0 POP CXRET SCAN ENDP DISP1 PROC NEARPUSH CXMOV BL, ALMOV DL, BLMOV CL, 04ROL DL, CLAND DL, 0FHCALL DISPLMOV DL, BLAND DL, 0FHCALL DISPLPOP CXRET DISP1 ENDP DISPL PROC NEARADD DL, 30HCMP DL, 3AHJB DDDADD DL, 27H DDD:MOV AH, 02HINT 21HRET DISPL ENDP GETNUM PROC NEARPUSH CXXOR DX, DX GGG: MOV AH, 01HINT 21HCMP AL, 0DHJZ PPPCMP AL, 20HJZ PPPSUB AL, 30HJB KKKCMP AL, 0AHJB GETSCMP AL, 11HJB KKKSUB AL, 07HCMP AL, 0FHJBE GETSCMP AL, 2AHJB KKKCMP AL, 2FHJA KKKSUB AL, 20H GETS: MOV CL, 04SHL DX, CLXOR AH, AHADD DX, AXJMP GGG KKK: MOV AH, 09HMOV DX, OFFSET ERRORINT 21H PPP: PUSH DX POP DXPOP CXRET GETNUM ENDP CODE ENDS END START執行結果:
總結
以上是生活随笔為你收集整理的汇编语言程序设计实验报告的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt sqlit3的增、删、改、查、判断
- 下一篇: sql 分组统计_leetcode-sq