西电电院微机原理上机大作业终极版

更新时间:2023-04-13 18:03:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

微机原理上机大作业之

班级:

学号:

姓名:

第一次上机实验

一:实验目的

1.熟练掌握8086/8088的各种寻址方式和应用

2.掌握DEBUG调试程序中的一些常用命令的使用方法,为以后的实验打下基础。

二:实验仪器

586微机一台。

三:实验内容及实验程序

1.关于数据的寻址方式练习。

2.实验内容

(1)在全屏幕编辑软件下,建立以下汇编语言源程序。程序略。

(2)用MASM.EXE宏汇编程序对以上源程序进行汇编。

(3)用LINK.EXE连接程序对文件名.OBJ文件进行连接。

(4)对源程序中从MOV AX,CX开始以下所有指令按下表进行计算。表格略。

(5)用T命令进行单步运算,并用R命令检查AX的结果,同时将结果作为实际值填入上

表中,和推算值比较。

四:实验数据及结果

指令SRC寻址方式SRC的地址AX推算值AX实际值MOV AX, CX 寄存器寻址 0005H 0005H MOV AX, 500H 立即寻址 500H 0500H MOV AX, TABLE 直接寻址 1541:0004 A5A4H A5A4H MOV AX, ES:[BX] 寄存器间接寻址 1542:0004 C5C4H C5C4H MOV AX, [BX+05H] 寄存器相对寻址 1541:0009 AAA9H AAA9H MOV AX, SS:[BX]+03H 寄存器相对寻址 153f:0007 B8B7H B8B7H

MOV AX, TABLE [BX] 寄存器相对寻址 1541:0008 A9A8H A9A8H MOV AX, 07H [BX] 寄存器相对寻址 1541:000b ACABH ACABH MOV AX, [BP] 寄存器间接寻址 153f:0003 B4B3H B4B3H MOV AX, TABLE [BP] 寄存器相对寻址 1541:0007 A8A7H A8A7H MOV AX, 08H [BP] 寄存器相对寻址153f:000b BCBBH BCBBH MOV AX, [BP+06H] 寄存器相对寻址153f:0009 B8B9H B8B9H MOV AX, DS:[BP+03H] 寄存器相对寻址1541:0006 A7A6H A7A6H MOV AX, [BP]+05H 寄存器相对寻址153f:0008 B9B8H B9B8H MOV AX, ES: [SI+03H] 寄存器相对寻址1542:0005 C6C5H C6C5H MOV AX, [DI+06H] 寄存器相对寻址1541:0007 A8A7H A8A7H MOV AX, [DI]+05H 寄存器相对寻址1541:0006 A7A6H A7A6H MOV AX, TABLE [SI] 寄存器相对寻址1541:0006 A7A6H A7A6H MOV AX, [SI] 寄存器间接寻址1541:0002 A3A2H A3A2H MOV AX, TABLE [DI] 寄存器相对寻址1541:0005 A6A5H A6A5H MOV AX, [SI]+05H 寄存器相对寻址1541:0007 A8A7H A8A7H MOV AX, [BX] [DI+01H] 寄存器变址且相

1541:0006 A7A6H A7A6H

对寻址

1541:0009 AAA9H AAA9H MOV AX, [BX] [SI]+03H 寄存器变址且相

对寻址

MOV AX, TABLE [BX] [SI] 寄存器变址且相

1541:000a ABAAH ABAAH

对寻址

MOV AX, ES:[BX] [DI] 寄存器变址寻址1542:0005 C6C5H C6C5H MOV AX, [BP] [DI+02H] 寄存器变址且相

153f:0006 B7B6H B7B6H

对寻址

1541:0008 A9A8H A9A8H MOV AX, TABLE [BP] [DI] 寄存器变址且相

对寻址

MOV AX, ES:[BP] [SI] 寄存器变址寻址1542:0005 C6C5H C6C5H

153f:000a BBBAH BBBAH MOV AX, [BP] [SI+05H] 寄存器变址且相

对寻址

MOV AX, 03H [BP] [DI] 寄存器变址且相

153f:0007 B8B7H B8B7H

对寻址

MOV AX, [BP] [SI] 寄存器变址寻址153f:0005 B6B5H B6B5H MOV AX, [BP+02H] 寄存器变址且相153f:0009 BAB9H BAB9H

[DI+03H] 对寻址

MOV AX, TABLE [BP+02H] [DI+03H] 寄存器变址且相

对寻址

1541:000d AEADH AEADH

五:问题讨论

推算值与实验所得值无出入,无错误。

小结寻址方式所用段寄存器规律:

1.立即寻址:直接放在指令中的常数称为立即数,立即数只能是源操作数,立即数存放在指令操作码之后的存储单元中。

2. 寄存器寻址:存放在寄存器中的数据为操作数,寄存器操作数可以是源操作数,也可以是目的操作数。

3. 存储器寻址(1)直接寻址:存储器操作数的16位偏移地址直接包含在指令的方括号中。(2)寄存器间接寻址:操作数所在的存储单元的偏移地址放在指令给出的寄存器中。可用于这种寻址方式的寄存器只能是SI、DI、BP和BX。其中,SI、DI、BX约定的段寄存器是DS,而BP约定的段寄存器SS。

(3)寄存器相对寻址:这种寻址方式通过基址寄存器BX、BP或变址寄存器SI、DI与一个位移量相加形成有效地址,计算物理地址的缺省段仍然是SI、DI和BX 为DS,BP为SS。(4)基址寻址:操作数的有效地址是指令给定的位移量(8

位或16位)与BX、BP内容之和,段寄存器约定同寄存器间接寻址,允许段超越。(5)变址寻址:操作数的有效地址是指令给定的位移量与寄存器SI或DI 内容之和,段寄存器约定在DS中,允许段超越。(6)基址变址寻址:操作数的有效地址是指令给定的位移量和一个基址寄存器(BX或BP)及一个变址寄存器(SI或DI)的内容之和,段寄存器约定由基址寄存器决定,若为BX,段寄存器约定为DS;若为BP,段寄存器约定为SS,允许段超越。(7)基址变址且相对寻址:这种寻址方式与基址变址寻址方式类似,不同的是基址加变址再加上一个位移量形成操作数的有效地址。缺省段的使用仍然是DS与BX组合,SS与BP 组合

第二次上机实验

一:实验目的

熟练掌握汇编语言程序设计的方法和上机步骤。

掌握算术运算中,十进制数调整指令的应用。

掌握子程序的设计方法。

掌握DOS功能的调用方法。

二:实验仪器

586微机一台。

三:实验内容

1.编写求十进制数12678532与02121419之和的程序,并将和以十进制的形式送屏幕显示。实验步骤如实验一。

实验代码:

STACK SEGMENT STACK 'STACK'

DW 100H DUP(?)

TOP LABEL WORD

STACK ENDS ;堆栈段

DA TA SEGMENT

ADD1 DD 12678532H

ADD2 DD 02121419H

SUM DD ?

DA TA ENDS ;数据段CODE SEGMENT ;代码段ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DA TA

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

四.实验结果截图:

有一个首地址为A的N字数组,请编程序是该数组中的数按从大到小的次序排列。实验代码:

STACK SEGMENT STACK

DB 256 DUP(?)

STACK ENDS

DA TA SEGMENT

DA TA1 DW 0212H,1419H,0000H,87H,1275H,0EC34H

STRING1 DB 'input number:',0DH,0AH,'$'

STRING2 DB 'The numbers from large to small is:',0DH,0AH,'$' DA TA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DA TA,ES:DA TA,SS:STACK START: MOV AX,DA TA

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,DA TA1

L1: MOV AX,[SI]

ADD SI,2

CALL DISPAX

CALL DISPCR

LOOP L1

MOV CX,5

LEA SI,DA TA1

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

MOV CX,6

LEA SI,DA TA1

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

CALL CHANG

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

四.实验结果截图:

五.问题讨论

在以十进制数形式参加运算的程序设计中,应注意哪些问题。

在以十进制数形式参与运算的汇编程序设计中,应注意运算结果是否有进位和溢出的问题!第三四次上机实验

一:实验目的

增强和提高汇编语言程序设计的能力,掌握模块化程序的设计方法。

熟练掌握DOS常用功能的调用方法。

二.实验仪器

586微机一台

三.实验内容

按照实验功能编写程序,并在机器上调试成功。

按下“1”键,完成字符串小写字母变成大写字母。

用户输入一由英文大小写字母或数字0-9组成的字符串(以回车结束),程序逐个检查字符串中各字符,将原串中小写字母编程大写字母,其它字符不变,并在屏幕上显示。用户按任意键,重做,按ESC键返回主菜单。

按下“2”键,完成找最大值。

接受用户输入的可显示字符串(以回车结束),程序将其中ASCII码值最大的字符显示出来。

按下“3”键,完成排序。

接受用户输入若干个有符号8位数(以空格或逗号为分隔符,以回车为结束),程序将其中最大的数显示出来。用户按任意键,重做,按ESC键返回主菜单。

按下“4”键显示时间。

首先提示用户对时,即用户输入时分秒(以空格或逗号为分隔符,以回车为结束),然后在屏幕上不断显示时间

按下“5”键,结束程序运行,返回系统提示符。

四,实验流程图

主程序流程图 开始

输入命令

输入跳转表

是否是5

是否输入ESC 执行该子程序

结束

是是

2.功能一流程图:

开始输入字符串取串长把字符串长度

给CX

大写字母转化小写字

母CX=0输出转化后的字

符串键入ESC 退出子程序结束

3.功能二流程图:

开始输入字符串取串长把字符串长度

给CX

依次比较相邻两个字

符大小CX=0输出最大字符键入ESC 退出子程序结束是

功能三流程图:

开始输入字符串并

回显统计数据个数把数据个数给

CX

依次比较相邻两数据

大小

前一个大于后一个交换先后顺序CX=0把所得数据组转化为十六进制输出是

输入是否ESC 退出子程序结束是否

否否

功能四流程图: 开始

显示提示字符

输入字符串的1-2位数值输入字符串的4-5位数值

输入字符串的7-8位数

值输出系统时间

是否ESC

退出子程序

结束

置系统时间否

五.程序代码:

STACK SEGMENT STACK

DB 256 DUP(?)

TOP LABEL WORD

STACK ENDS

DA TA SEGMENT

TABLE DW G1, G2, G3, G4, G5

STRING1 DB '1. Change small letters into capital letters of string;', 0DH, 0AH, '$' STRING2 DB '2. Find the maximum of string;', 0DH, 0AH, '$'

STRING3 DB '3. Sort for datas;', 0DH, 0AH, '$'

STRING4 DB '4. Show Time;', 0DH, 0AH, '$'

STRING5 DB '5. Exit.', 0DH, 0AH, '$'

STRINGN DB 'Input the number you select (1-5) : $'

IN_STR DB 'Input the string (including letters & numbers, less than 60 letters) :', 0DH, 0AH, '$' PRESTR DB 'Original string : $'

NEWSTR DB 'New string : $'

OUT_STR DB 'The string is $'

MAXCHR DB 'The maximum is $'

IN_NUM DB 'Input the numbers (0 - 255, no more than 20 numbers) : ', 0DH, 0AH, '$'

OUT_NUM DB 'Sorted numbers : ', 0DH, 0AH, '$'

IN_TIM DB 'Correct the time (HH:MM:SS) : $'

HINTSTR DB 'Press ESC, go back to the menu; or press any key to play again!$' KEYBUF DB 61

DB ?

DB 61 DUP (?)

NUMBUF DB ?

DB 20 DUP (?)

DA TA ENDS

CODE SEGMENT

ASSUME CS:CODE, DS:DATA, SS:STACK

START:

MOV AX, DATA

MOV DS, AX

MOV AX, STACK

MOV SS, AX

MOV SP, OFFSET TOP

MAIN: CALL FAR PTR MENU ; 设置显示器

AGAIN:

MOV AH, 2

MOV BH, 0 ; 页号

MOV DL, 41 ; 列号

MOV DH, 10 ; 行号

INT 10H ; 光标位置设置

MOV AH, 1

INT 21H

CMP AL, '1'

JB AGAIN

CMP AL, '5'

JA AGAIN

SUB AL, '1' ; N-1

SHL AL, 1 ; (N-1)*2

CBW ; AL->AX

LEA BX, TABLE

ADD BX, AX

JMP WORD PTR [BX]

G1:

CALL FAR PTR CHGLTR

MOV AH, 8

INT 21H

CMP AL, 1BH

JZ MAIN

JMP G1

G2:

CALL FAR PTR MAXLTR

MOV AH, 8

INT 21H

CMP AL, 1BH

JZ MAIN

JMP G2

G3:

CALL FAR PTR SORTNUM

MOV AH, 8

INT 21H

CMP AL, 1BH

JZ MAIN

JMP G3

G4:

CALL FAR PTR TIMCHK

MOV AH, 8

INT 21H

CMP AL, 1BH

JZ MAIN

JMP G4

G5:

MOV AH, 4CH

INT 21H

MENU PROC FAR ; 显示主界面

; 设置显示器方式

MOV AH, 0

MOV AL, 3;

MOV BL, 0;

INT 10H ; 清屏

MOV AH, 2

MOV BH, 0 ; 页号

MOV DL, 5 ; 列号

MOV DH, 5 ; 行号

INT 10H ; 光标位置设置MOV AH, 9

LEA DX, STRING1

INT 21H

MOV AH, 2

MOV DL, 5 ; 列号

MOV DH, 6 ; 行号

INT 10H ; 光标位置设置MOV AH, 9

LEA DX, STRING2

INT 21H

MOV AH, 2

MOV DL, 5 ; 列号

MOV DH, 7 ; 行号

INT 10H ; 光标位置设置MOV AH, 9

LEA DX, STRING3

INT 21H

MOV AH, 2

MOV DL, 5 ; 列号

MOV DH, 8 ; 行号

INT 10H ; 光标位置设置MOV AH, 9

LEA DX, STRING4

INT 21H

MOV AH, 2

MOV DL, 5 ; 列号

MOV DH, 9 ; 行号

INT 10H ; 光标位置设置MOV AH, 9

LEA DX, STRING5

INT 21H

MOV AH, 2

MOV DL, 5 ; 列号

MOV DH, 10 ; 行号

INT 10H ; 光标位置设置MOV AH, 9

LEA DX, STRINGN

INT 21H

RET

MENU ENDP

CHGLTR PROC FAR ; 将输入字符串中小写字母便换成大写字母RECHG:

; 设置显示器方式

MOV AH, 0

MOV AL, 3

MOV BL, 0

INT 10H ; 清屏

MOV AH, 2

MOV BH, 0 ; 页号

MOV DL, 5 ; 列号

MOV DH, 5 ; 行号

INT 10H ; 输入提示光标位置设置

MOV AH, 9

LEA DX, IN_STR

INT 21H ; 输入字符串提示

MOV AH, 2

MOV DL, 5 ; 列号

MOV DH, 6 ; 行号

INT 10H ; 输入字符串光标位置设置

MOV AH, 0AH

LEA DX, KEYBUF

INT 21H ; 输入字符串

CMP KEYBUF + 1, 0

JZ RECHG ; 判断输入字符串是否为空串

LEA BX, KEYBUF + 2

MOV AL, KEYBUF + 1

CBW

MOV CX, AX

ADD BX, AX

MOV BYTE PTR [BX], '$' ; 在输入字符串尾加结束标志$

MOV AH, 2

MOV BH, 0 ; 页号

MOV DL, 5 ; 列号

MOV DH, 7 ; 行号

INT 10H ; 源字符串提示光标位置设置

MOV AH, 9

LEA DX, PRESTR

INT 21H ; 输出源字符串提示

MOV AH, 9

LEA DX, KEYBUF + 2

INT 21H ; 输出源字符串

LEA BX, KEYBUF + 2

LCHG:

CMP BYTE PTR [BX], 61H

JB NOCHG

AND BYTE PTR [BX], 0DFH

NOCHG:

INC BX

LOOP LCHG ; 将字符串中小写字母转换成大写字母

MOV AH, 2

MOV BH, 0 ; 页号

MOV DL, 5 ; 列号

MOV DH, 8 ; 行号

INT 10H ; 新字符串提示光标位置设置

MOV AH, 9

LEA DX, NEWSTR

INT 21H ; 输出新字符串提示

MOV AH, 9

LEA DX, KEYBUF + 2

INT 21H ; 输出新字符串

MOV AH, 2

MOV BH, 0 ; 页号

MOV DL, 5 ; 列号

MOV DH, 9 ; 行号

INT 10H ; 提示信息光标位置设置

MOV AH, 9

LEA DX, HINTSTR

INT 21H ; 输出提示信息

RET

CHGLTR ENDP

MAXLTR PROC FAR ; 在输入字符串中找出最大值REMAX:

; 设置显示器方式

MOV AH, 0

MOV AL, 3

MOV BL, 0

INT 10H ; 清屏

MOV AH, 2

MOV BH, 0 ; 页号

MOV DL, 5 ; 列号

MOV DH, 5 ; 行号

INT 10H ; 输入提示光标位置设置

MOV AH, 9

LEA DX, IN_STR

INT 21H ; 输入字符串提示

MOV AH, 2

MOV DL, 5 ; 列号

MOV DH, 6 ; 行号

INT 10H ; 输入字符串光标位置设置

MOV AH, 0AH

LEA DX, KEYBUF

INT 21H ; 输入字符串

CMP KEYBUF + 1, 0

JZ REMAX ; 判断输入字符串是否为空串

LEA BX, KEYBUF + 2

MOV AL, KEYBUF + 1

CBW

MOV CX, AX

ADD BX, AX

MOV BYTE PTR [BX], '$' ; 在输入字符串位加结束标志$

MOV AH, 2

MOV BH, 0 ; 页号

MOV DL, 5 ; 列号

MOV DH, 7 ; 行号

INT 10H ; 源字符串提示光标位置设置

MOV AH, 9

LEA DX, OUT_STR

INT 21H ; 输出字符串提示

MOV AH, 9

LEA DX, KEYBUF + 2

INT 21H ; 输出字符串

MOV AH, 2

MOV BH, 0 ; 页号

MOV DL, 5 ; 列号

MOV DH, 8 ; 行号

INT 10H ; 新字符串提示光标位置设置

MOV AH, 9

LEA DX, MAXCHR

INT 21H ; 输出字符串中最大值提示

MOV DL, 0

LEA BX, KEYBUF + 2

LCMP:

CMP [BX], DL

JB NOLCHG

MOV DL, [BX]

NOLCHG:

INC BX

LOOP LCMP ; 找出字符串中最大字符,放入DL

MOV AH, 2

INT 21H ; 输出字符串中最大字符

MOV AH, 2

MOV BH, 0 ; 页号

MOV DL, 5 ; 列号

MOV DH, 9 ; 行号

INT 10H ; 提示信息光标位置设置

MOV AH, 9

LEA DX, HINTSTR

INT 21H ; 输出提示信息

RET

MAXLTR ENDP

SORTNUM PROC FAR ; 对输入数据组排序RESORT:

; 设置显示器方式

MOV AH, 0

MOV AL, 3

MOV BL, 0

INT 10H ; 清屏

MOV AH, 2

MOV BH, 0 ; 页号

MOV DL, 5 ; 列号

MOV DH, 5 ; 行号

INT 10H ; 输入提示光标位置设置

MOV AH, 9

LEA DX, IN_NUM

INT 21H

MOV AH, 2

MOV DL, 5 ; 列号

MOV DH, 6 ; 行号

INT 10H ; 输入数据组光标位置设置

MOV AH, 0AH

LEA DX, KEYBUF

INT 21H ; 输入数据组字符串

CALL CIN_INT ; 字符串转换成数据串

CMP AL, 0

JZ RESORT ; 判断数据串是否有错

CMP NUMBUF, 0

JZ RESORT ; 判断数据串是否为空

MOV AH, 2

MOV BH, 0 ; 页号

MOV DL, 5 ; 列号

本文来源:https://www.bwwdw.com/article/yvul.html

Top