西电微机原理上机大作业完整版
第一次上机
一、 实验目的
1. 熟练掌握8086/8088的各种寻址方式及应用。
2. 掌握DEBUG调试程序中的一些常用命令的使用方法,为以后的实验打下基础。 二、 实验仪器
586微机 一台 三、 实验内容
1. 关于数据的寻址方式练习
8086/8088 提供多种方式实现操作数寻址,大体可分为7种: a. 立即寻址
b. 寄存器寻址 c. 直接寻址
d. 寄存器间接寻址 e.寄存器相对寻址 f. 基址变址寻址 g. 基址变址且相对寻址
掌握8086/8088的这些寻址方式,是学习汇编语言编程的关键。因此,我们编写了下面的程序段,以数据传送指令为例,列举了部份寻址方式,请同学们按下列要求认真完成。
[1] 在全屏幕编辑软件下,建立以下汇编语言源程序:
STACK SEGMENT STACK
DB 0B0H, 0B1H, 0B2H, 0B3H, 0B4H, 0B5H, 0B6H, 0B7H, DB 0B8H, 0B9H
DB 0BAH, 0BBH, 0BCH, 0BDH, 0BEH, 0BFH STACK DATA1 TABLE DATA1 DATA2 DATA2 CODE AX, DATA1
DB 10H DUP(00) ENDS SEGMENT
DB 0A0H, 0A1H, 0A2H, 0A3H DW 0A5A4H
DB 0A6H, 0A7H, 0A8H, 0A9H, 0AAH, 0ABH DB 0ACH, 0ADH, 0AEH, 0AFH ENDS SEGMENT
DB 0C0H, 0C1H, 0C2H, 0C3H, 0C4H, 0C5H, 0C6H, 0C7H DB 0C8H ,0C9H, 0CAH, 0CBH, 0CCH, 0CDH, 0CEH, 0CFH ENDS SEGMENT
ASSUME CS:CODE, DS:DATA1, ES:DATA2, SS:STACK START:MOV MOV DS, AX MOV AX, DATA2
MOV ES, AX MOV BX, 0004H MOV CX, 0005H MOV BP, 0003H
MOV SI, 0002H
MOV DI, 0001H
MOV AX, CX ;以下指令按后表要求完成 MOV AX, 500H
MOV AX, TABLE MOV AX, ES:[BX]
MOV AX, [BX+05H] MOV AX, SS:[BX]+03H MOV AX, TABLE [BX]
MOV AX, 07H [BX]
MOV AX, [BP]
MOV AX, TABLE [BP] MOV AX, 08H [BP]
MOV AX, [BP+06H]
MOV AX, DS:[BP+03H]
MOV AX, [BP]+05H MOV AX, ES: [SI+03H]
MOV AX, [DI+06H]
MOV AX, [DI]+05H MOV AX, TABLE [SI] MOV AX, [SI] MOV AX, TABLE [DI]
MOV AX, [SI]+05H
MOV AX, [BX] [DI+01H]
MOV AX, [BX] [SI]+03H MOV AX, TABLE [BX] [SI]
MOV AX, ES:[BX] [DI]
MOV AX, [BP] [DI+02H]
MOV AX, TABLE [BP] [DI]
MOV AX, ES:[BP] [SI] MOV AX, [BP] [SI+05H] MOV AX, 03H [BP] [DI] MOV AX, [BP] [SI]
MOV AX, [BP+02H] [DI+03H]
MOV AX, TABLE [BP+02H] [DI+03H] MOV AH, 4CH
INT 21H
CODE ENDS
END START
[2]用MASM.EXE宏汇编程序对以上源程序进行汇编,其方法为:
MASM 文件名.ASM ; 回车
此时,如果源程序中无语法错误,则在磁盘上形成文件名.OBJ文件。 [3]用LINK.EXE连接程序对文件名.OBJ文件进行连接,其方法为:
LINK 文件名.OBJ ; 回车
此时,如果连接正确,则在磁盘上形成:文件名.EXE 可执行文件。 [4] 对源程序中从MOV AX, CX开始以下所有指令按下表进行计算。
[5] 用T命令单步运行程序,并用R 命令检查AX结果,同时将结果作为实际值填入上表中,和推算值进行比较,从而检验自己对该条指令对应的寻址方式是否掌握。也可用D命令察看存贮器的内容,具体操作方法参看DEBUG使用部分。
四、问题讨论
在上表中,分析AX推算值与实际值有何不同?找出错误原因,小结出各种寻址方式所用的段寄存器的规律来
第二次上机
一、 实验目的
1. 熟练掌握汇编语言程序设计的方法及上机步骤。 2. 掌握算术运算中,十进制数调整指令的应用。 3. 掌握子程序的设计方法。 4. 掌握DOS功能的调用方法。
二、实验仪器
586微机 一台 二、 实验内容
1. 编写求十进制数12678532与02121435(本人学号)之和的程序,并将和以十进制数的形式送屏幕显示。
编程要求与提示:
[1] 两个加数均以压缩(组合)十进制数形式存放在ADD1和ADD2为首址的存贮器单元。
[2] 和以压缩十进制数的形式存入SUM以下单元。
[3] 将和送到屏幕显示部分功能的实现采用子程序的形式。 [4] 实验步骤如下:
a. 用全屏幕编辑软件建立源程序。
b.用masm.exe汇编程序对源程序进行汇编,形成目标程序。 c. 用link.exe连接程序对目标程序进行连接形成可执行文件。 d. 用DEBUG对连接通过的可执行程序进行调试。
2. 有一个首地址为A的N字数组,请编程序使该数组中的数按从大到小的次序排列。
编程要求与提示:
[1] 参加排序的数据及个数由学生自己定义。
[2] 要将排序前的数组和排序后的数组在屏幕上显示出来。 [3] 实验步骤同内容一。
三、实验程序、流程图与运行结果 1、 实验程序
STACK SEGMENT STACK 'STACK' DW 100H DUP(?) TOP LABEL WORD
STACK ENDS ;堆栈段 DATA SEGMENT ADD1 DD 12678532H ADD2 DD 02121435H SUM DD ?
DATA ENDS ;数据段 CODE SEGMENT ;代码段 ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX LEA SP,TOP LEA SI,ADD1 LEA DI,ADD2 MOV AL,[SI] ADD AL,[DI] DAA
MOV BYTE PTR SUM,AL MOV AL,[SI+1] ADC AL,[DI+1] DAA
MOV BYTE PTR SUM+1,AL MOV AL,[SI+2] ADC AL,[DI+2] DAA
MOV BYTE PTR SUM+2,AL MOV AL,[SI+3] ADC AL,[DI+3] DAA
MOV BYTE PTR SUM+3,AL MOV AX,WORD PTR SUM+2 CALL DISPAX
MOV AX,WORD PTR SUM CALL DISPAX MOV AH,4CH INT 21H DISPAL PROC NEAR PUSH AX PUSH CX PUSH DX PUSH AX MOV CL,4 SHR AL,CL
CALL CHANG
MOV AH,02
MOV DL,AL
INT 21H
POP AX
AND AL,0FH
CALL CHANG
MOV AH,02
MOV DL,AL
INT 21H
POP DX
POP CX
POP AX
RET
DISPAL ENDP
CHANG PROC NEAR
CMP AL,10
JNGE CHANG1
ADD AL,7
CHANG1: ADD AL,30H
RET
CHANG ENDP
DISPAX PROC NEAR
XCHG AL,AH
CALL DISPAL
XCHG AH,AL
CALL DISPAL
RET
DISPAX ENDP
CODE ENDS
END START
运行结果
流程图
2、
实验程序
STACK SEGMENT STACK
DB 256 DUP(?)
STACK ENDS
DATA SEGMENT
DATA1 DW 0212H,1435H,0000H,9999H,1AAAH
STRING1 DB 'INPUT NUMBER:',0DH,0AH,'$'
STRING2 DB 'THE BIGER TO THE SMALLER IS:',0DH,0AH,'$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START: MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV AX,STACK
MOV SS,AX
LEA DX,STRING1
MOV AH,09H
INT 21H
MOV CX,6
LEA SI,DATA1
L1: MOV AX,[SI]
ADD SI,2
CALL DISPAX
CALL DISPCR
LOOP L1
MOV CX,5
LEA SI,DATA1
ADD SI,10
LP1: PUSH CX
PUSH SI
LP2: MOV AX,[SI]
CMP AX,[SI-2]
JBE NOXCHG
XCHG AX,[SI-2]
MOV [SI],AX
NOXCHG: DEC SI
DEC SI
LOOP LP2
POP SI
POP CX
LOOP LP1
LEA DX,STRING2
MOV AH,09H
INT 21H
LEA SI,DATA1
L2: MOV AX,[SI]
ADD SI,2
CALL DISPAX
CALL DISPCR
LOOP L2
MOV AH,4CH
INT 21H
DISPAL PROC
PUSH AX
PUSH CX
PUSH DX
PUSH AX
MOV CL,4
SHR AL,CL
CALL CHANG
MOV AH,02H
MOV DL,AL
INT 21H
POP AX
AND AX,0FH
MOV AH,02H
MOV DL,AL
INT 21H
POP DX
POP CX
POP AX
RET
DISPAL ENDP
CHANG PROC
CMP AL,10
JNGE CHANG1
ADD AL,7
CHANG1: ADD AL,30H
RET
CHANG ENDP
DISPAX PROC
XCHG AL,AH
CALL DISPAL
XCHG AH,AL
CALL DISPAL
RET
DISPAX ENDP
DISPCR PROC
PUSH AX
PUSH DX
MOV AH,2
MOV DL,0AH
INT 21H
MOV AH,2
MOV DL,0DH
INT 21H
POP DX
POP AX
RET
DISPCR ENDP
CODE ENDS
END START
实验结果
流程图
三、 问题讨论
1.在以十进制数形式参加运算的程序设计中,应注意那些问题。
2.总结循环程序设计的步骤及方法。
第三、四次上机
一、实验目的
1.增强和提高汇编语言程序设计的能力,掌握模块化程序设计的方法.
2.熟练掌握DOS常用功能的调用方法
二、实验仪器
586微机 一台
三、实验内容
编写如下程序,并在机器上调试成功。程序采用菜单式选择,可以接收用户从键盘输入的五个命令(1-5),各命令功能分别为:
(1)按下“1”键,完成字符串小写字母变成大写字母。
用户输入一由英文大小写字母或数字0-9组成的字符串(以回车结束),程序逐个检查字符串中各字符,将原串中小写字母变成大写字母,其他字符不变,并在屏幕上显示。用户按任一键,重做,按ESC键,返回主菜单。
(2)按下“2”键,完成找最大值(二选一)。
a.接收用户输入的可显示字符串(以回车结束),程序将其中ASCII码值最大的字符显示出来;
b.接收用户输入若干个无符号8位数(以空格或逗号为分隔符,以回车结束),程序将其中最大的数显示出来。用户按任一键,重做,按ESC键,返回主菜单。
(3)按下“3”键,完成排序(二选一)。
a.接收用户输入的可显示字符串,以回车结束。程序按ASCII码值大小由大到小排序并输出显示;
b.接收用户输入若干个有符号8位数(以空格或逗号为分隔符,以回车结束),程序将其中最大的数显示出来。用户按任一键,重做,按ESC键,返回主菜单。
(4)按下“4”键,显示时间。
首先提示用户对时,即用户输入时、分、秒(以空格或逗号为分隔符,以回车结束),然后,在屏幕上不断显示时间,格式为:
XX(时): XX(分): XX(秒)
最好定点显示。用户按任一键,重新对时,按ESC键,返回主菜单。
(5)按下“5”键,结束程序运行,返回系统提示符。
四、 实验程序、流程图与结果
实验程序
DISPL MACRO STR ;Function to display strings
PUSH DX
PUSH AX
LEA DX,STR
MOV AH,09H
INT 21H
POP AX
POP DX
ENDM
ISCONTINUE MACRO L ;Macro to judge whether to continue, L is a mark
DISPS 15,10,SMENU
MOV AH,08H
INT 21H
CMP AL,1BH
JNE L ;若用JE会导致编译,跳不了那么远
JMP MAIN
ENDM
CURSOR MACRO CURX,CURY
PUSH AX
PUSH BX
PUSH DX ;DX必须保护,始终指向输入缓冲区
MOV AH,02H
MOV DH,CURX
MOV DL,CURY
MOV BH,0
INT 10H
POP DX
POP BX
POP AX
ENDM
DISPS MACRO X,Y,STR ;将STR的内容显示到X,Y的位置
PUSH AX
PUSH BX
PUSH DX
MOV AH,02H
MOV BH,00H ;显示页码,第0页
MOV DH,X ;行(X坐标)
MOV DL,Y ;列(Y坐标)
INT 10H
LEA DX,STR
MOV AH,09H
INT 21H
POP DX
POP BX
POP AX
ENDM
SCROLL MACRO N,ULR,ULC,LRR,LRC,ATT
PUSH AX
PUSH BX
PUSH CX
MOV AH,06H
MOV AL,N ;N=上卷行数;N=0时,清窗口
MOV CH,ULR ;左上角行号(X)
MOV CL,ULC ;左上角列号(Y)
MOV DH,LRR ;右下角行号
MOV DL,LRC ;右下角列号
MOV BH,ATT ;卷入行属性,颜色设置
INT 10H
POP DX
POP CX
POP BX
POP AX
ENDM
PREP MACRO T ;预处理,显示子菜单标题(T),输入提示信息等
LEA SI,INBUF+1
LEA DI,OUTBUF
SCROLL 21,2,0,22,79,0FH ;清屏,内窗
DISPS 3,20,T ;显示子菜单标题(3行20列显示T)
DISPS 6,2,CAPION ;Prompt for a string to change
DISPS 8,2,INCAP ;Print "Your input is:"
MOV AH,0AH
MOV CH,0
MOV CL,[SI] ;获取输入字符串中,字符的个数
INC SI
ENDM
STACK SEGMENT STACK 'STACK'
DB 100H DUP(?)
TOP LABEL WORD
STACK ENDS
DATA SEGMENT
BASE DW MAIN,LTC,FMV,SORTS,STM,EXIT ;建立跳转表
WELCM DB 'Welcome to use this program!$'
MMENUD DB ' 02121452-Mr.Hao$'
MMENUC DB ' Choose An Item,And Input The Number!$'
MMENU1 DB ' 1 -Lowercase Letters To Capital Letters$'
MMENU2 DB ' 2 -Find The Maximum Value$'
MMENU3 DB ' 3 -Sort$'
MMENU4 DB ' 4 -Set Time$'
MMENU5 DB ' 5 -Exit!$'
SMENU DB 'Press Any Key To Redo,Press "ESC" To Return To Main Menu!$'
WROCAP DB 'WRONG! You have press " " key! Please input a number between 1 and 5!$'
CAPION DB 'Please Input Your Strings and End With "Enter" Key!$'
INCAP DB 'Your Input Is: $'
INBUF DB 100
DB ?
DB 100 DUP(?)
OUTCAP DB ' My Output Is: $'
OUTBUF DB 100 DUP(?)
MAXCAP DB 'The char of max ASCII is: .$'
ERRINF DB 'ERROR! Please check the format you input!$'
TIMESETC DB 'Now,you can set the time! $'
TIMESETF DB 'Format:(01 25 32) or (01:25:32),and end with CR !$'
TIMESETS DB ' Succeed! $'
TDINV DB ' Invalid time data! Input again!$'
NODATCAP DB ' You have input nothing!$'
TIME DB 8 DUP (':'),12 DUP (' ');时间的底
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START: MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV AX,STACK
MOV SS,AX
LEA SP,TOP
LEA DX,INBUF ;指向输入缓冲区
CLC
MAIN: SCROLL 0,0,0,24,79,0 ;清屏
SCROLL 21,2,0,22,79,0FH ;设置菜单颜色,黑底白字 //注意逗号应为半角字符,否则提示out of memoryu
DISPS 6,30,MMENUD
DISPS 8,20,MMENUC
DISPS 10,20,MMENU1
DISPS 12,20,MMENU2
DISPS 14,20,MMENU3
DISPS 16,20,MMENU4
DISPS 18,20,MMENU5
ML: CURSOR 19,1DH
MOV AH,01H ;Recieve the choice
INT 21H
CMP AL,31H
JL ERROR
CMP AL,35H
JG ERROR
AND AX,00FH
LEA BX,BASE
SHL AL,1 ;将AL乘2,因为跳转表地址是dw类型的, ADD BX,AX
JMP WORD PTR [BX]
;CMP AL,'1'
;JE LTC ;Choose 1,lowercase letter to capital letter ;CMP AL,'2'
;JE FMV ;Choose 2,find the maximum value ;CMP AL,'3'
;JE SORTS ;Choose 3,sort
;CMP AL,'4'
;JE STM ;Choose 4,show current time
;CMP AL,'5'
;JE EXIT ;Choose 5,exit the program
ERROR: CMP AL,0DH ;如果是回车的话,赋CR
JE MCR
MOV [WROCAP+23],AL ;Other char
MOV [WROCAP+24],' '
JMP D
MCR: MOV WORD PTR [WROCAP+23],'RC'
D: DISPS 20,5,WROCAP ;Show the wrong information JMP ML
LTC: CALL LLTOCL
ISCONTINUE LTC
FMV: CALL FMAXV
ISCONTINUE FMV
SORTS: CALL SORT
ISCONTINUE SORTS
STM: CALL SHOWTIME
ISCONTINUE STM
EXIT: SCROLL 0,0,0,24,79,0 ;清屏
MOV AH,4CH ;Exit.
INT 21H
LLTOCL PROC
REFLASHL:PREP MMENU1 ;显示子菜单
CMP CL,0 ;若输入为空则跳转至REDO
JE REFLASHL
LL1: MOV AL,[SI]
CMP AL,'a'
JB MTOB ;NO CHANGE
CMP AL,'z'
JA MTOB
SUB AL,20H ;Convert
MTOB: MOV [DI],AL
INC SI
INC DI
LOOP LL1
MOV BYTE PTR [DI],'$'
DISPS 10,2,OUTCAP
DISPS 10,17,OUTBUF
RET
LLTOCL ENDP
FMAXV PROC
PUSH BX
REFLASHF:PREP MMENU2 ;显示子菜单
CMP CL,0 ;若输入为空则跳转至REDO JE REFLASHF
MOV AL,0
FL1: CMP AL,[SI]
JA NEXT
MOV AL,[SI]
NEXT: INC SI
LOOP FL1
MOV [MAXCAP+26],AL
DISPS 10,2,MAXCAP
POP BX
RET
FMAXV ENDP
SORT PROC
PREP MMENU3
DEC CX
ADD SI,CX
MOV BYTE PTR [SI+1],'$'
LP1: PUSH CX
PUSH SI
LP2:
MOV AL,[SI]
CMP AL,[SI-1]
JBE NOXCHG
XCHG AL,[SI-1]
MOV [SI],AL
;显示子菜单标题(T),输入提示信息等
NOXCHG: DEC SI
LOOP LP2
POP SI
POP CX
LOOP LP1
DISPS 10,2,OUTCAP
DISPS 10,17,INBUF[2] ;显示排序结果
RET
SORT ENDP
SHOWTIME PROC
SCROLL 21,2,0,22,79,0FH 清屏,内窗
DISPS 3,20,MMENU4
DISPS 5,25,TIMESETC
DISPS 7,15,TIMESETF
SHOW: MOV SI,0
MOV BL,100
DIV BL
MOV AH,2CH ;GET TIME
INT 21H
MOV AL,CH ;HOUR
CALL BCDASC ;要转换的在AL中
INC SI
MOV AL,CL ;MINUTE
CALL BCDASC
INC SI
MOV AL,DH
CALL BCDASC ;要转换的在AL中
MOV BP,OFFSET TIME ;使用int 10H的13H号功能,在Teletype模式下显示字符串(BP为地址)
MOV DX,0A22H ;DX为行列(DH,DL)
MOV CX,8 ;CX为显示字符串长度
MOV BX,004EH ;BH:页码,BL:属性
MOV AX,1301H ;AL:显示输出方式,1—字符串中只含显示字符,显示后,光标位置改变
INT 10H
MOV AH,02H ;设置光标位置
MOV DX,0A22H
MOV BH,0
INT 10H
MOV BX,0018H ;延时用(外层),若不延时,光标会在时间左右来回跑! RE: MOV CX,0FFFFH
REA: LOOP REA
DEC BX
JNZ RE ;
MOV AH,01H ;检测是否有字符输入,ZF=1:无 INT 16H
JE SHOW
CALL SETTIME ;设置时间子程序
RET
SHOWTIME ENDP
SETTIME PROC
PUSH DX
MOV AH, 0AH
LEA DX, INBUF
INT 21H
CMP INBUF[1],0
JE NODAT
MOV BL, 10
MOV AL, INBUF + 2
SUB AL, '0'
MUL BL
ADD AL, INBUF + 3
SUB AL, '0'
CMP AL, 0
JB INVALID ; 输入时间串
JAE INVALID ; 判断 时 有效性
MOV CH, AL
MOV AL, INBUF + 5
SUB AL, '0'
MUL BL
ADD AL, INBUF + 6
SUB AL, '0'
CMP AL, 0
JB INVALID
CMP AL, 60
JAE INVALID
MOV CL, AL
MOV AL, INBUF + 8
SUB AL, '0'
MUL BL
ADD AL, INBUF + 9
SUB AL, '0'
CMP AL, 0
JB INVALID
CMP AL, 60
JAE INVALID ; 判断 分 有效性 ; 判断 秒 有效性
MOV DL, 0
MOV AH, 2DH
INT 21H ; 置系统时间
DISPS 12,20,TIMESETS ;设置成功
JMP RETURN
NODAT: DISPS 12,20,NODATCAP
JMP RETURN
INVALID:DISPS 12,20,TDINV ;时间数据无效 RETURN: POP DX
RET
BCDASC PROC NEAR
PUSH BX
CBW
MOV BL,10
DIV BL
ADD AL,30H
MOV TIME[SI],AL
INC SI
ADD AH,30H
MOV TIME[SI],AH
INC SI
POP BX RET BCDASC ENDP CODE ENDS END START
流程图
主程序
功能一 功能二
功功能四
能三
实验结果
五、问题讨论
在上表中,分析AX推算值与实际值有何不同?找出错误原因,小结出各种寻址方式所用的段寄存器的规律来