资源描述
-/
汇编实验
实验一 顺序与分支程序设计
一 、实验目的
1) 掌握顺序程序设计方法。
2) 掌握分支程序的结构及分支程序的设计,调试方法。
2) 学习数据传送及算术和逻辑运算指令的用法。
3) 熟悉在PC机上建立、汇编、连接、调试和运行汇编语言程序的过程。
二、实验内容
1) 有一字变量BUF1是以原码表示的有符号数,要求将其转换为反码和补码,分别存入BUF2和BUF3单元,并在屏幕上显示出来。
2)有两个两字节无符号数分别放在存储单元A、B起始的缓冲器中,求其和,结果放在A起始的缓冲区并在屏幕上显示。相加若有进位不存入存储单元。
3) 在BUF和BUF+1、BUF+2单元分别放有一个无符号字节型数,编程序将其中最大数存入MAX单元,并在屏幕上显示。
4) 要求同上,只是比较的数为有符号数。
5) 将1000H单元开始的10个字节数,采用奇偶校验,将奇数在前偶数在后仍存回原数据区。本实验要求在DEBUG调试状态下进行,包括汇编程序、运行程序、检查结果。
6) 从键盘上接收一位十进制数X,计算Y值,并以十六进制形式显示出来,Y按下列公式计算。
7) 从键盘上接收两个一位十六进制数X和Y,然后再输入一个A-D之间的一个字符,按下列要求计算。
a) 当输入字符为A,则计算X+Y,并以十六进制形式显示出来
b) 当输入字符为B,则计算|X-Y|,并以十六进制形式显示出来
c) 当输入字符为C,则计算X*Y,并以十六进制形式显示出来
d) 当输入字符为D,则计算X/Y,并以十六进制形式显示出来
三、实验设备
PC机一台
四、实验准备
1) 分析题目,将程序中的原始数据和最终结果的存取方法确定好。
2) 画出流程图。
3) 写出源程序。
4) 对程序中的结果进行分析,并准备好上机调试与用汇编程序及汇编调试的过程。
五、实验步骤
1) 输入源程序。
2) 汇编、连接程序,生成 .EXE文件,执行文件,检查结果。
六、实验报告的要求
1) 列出源程序,说明程序的基本结构,包括程序中各部分的功能。
2) 说明程序中各部分所用的算法。
3)说明主要符号和所用到寄存器的功能。
4) 总结为什么在设计分支程序时必须解决三个问题:判断、转向和定标号。
5) 说明标志位CF、SF和OF的意义。
6) 上机调试过程中遇到的问题是如何解决的。
7) 对调试源程序的结果进行分析。
Exam1:
DATA SEGMENT ;数据段
BUF1 DW 7898H
BUF2 DW 4 DUP (0), 0AH, 0DH,$
BUF3 DW 4 DUP (0), $
DATA ENDS ;数据段结束
CODE SEGMENT ;代码段
ASSUME CS:CODE, DS:DATA ;段寄存器关联说明伪指令
BEGIN: MOV AX, DATA
MOV DS, AX ;将数据段的基地址装入数据段寄存器DS
MOV AX, BUF1 ;将字型变量BUF1的值装入AX寄存器
ADD AX, 0 ;AX寄存器里的数据加0,以便进行转移测试
JS NEXT ;判断(AX)的正负,若为负则转到NEXT,为正则往下顺序执行。
MOV BUF2, AX ;为正,反码与原码一样
MOV BUF3, AX ;为正,补码与原码一样
JMP EEE
NEXT: AND AX, 7FFFH ;将符号位变为0
NOT AX ;求反码
MOV BUF2, AX ;将BUF1的反码装入BUF2
INC AX ;求补码
MOV BUF3, AX ;将补码装入BUF3
EEE: MOV CX, 0004H ;将0004H装入CX计数器寄存器中
MOV DI, OFFSET BUF2 ;将DI指向变量BUF2开始的存储单元
MOV DX, [DI] ;将DI所指的数据装入DX寄存器中
ADD DI, 03 ;将DI指针下移三个字
BBB: MOV AX, DX ;将DX中的内容装入AX寄存器中
AND AX, 000FH ;即使BUF2的低四位不变,其余均变为0
CMP AL, 0AH ;比较[AL]与0AH的大小,以便能正确转换为0-9的ASCII值
JB QQQ ;若[AL]<0AH,则转到QQQ,否则,顺序执行
ADD AL, 07H ;因为[AL]>0AH,所以[AL] +07H,使得AL能转换成相应数字的ASCII值
QQQ: ADD AL, 30H ;将[AL]转换成相应数字的ASCII值
MOV [DI], AL ;将AL中的内容装入以DS中的内容为段基地址,以DI的内容为偏移地址的存储单元中
DEC DI ;DI=DI-1,即将DI指向前一个存储单元
PUSH CX ;保存CX寄存器的内容
MOV CL, 04H ;给CL寄存器赋值为04H
SHR DX, CL ;将[DX]逻辑右移四位
POP CX ;恢复CX寄存器的内容
LOOP BBB ;循环判断语句,CX=CX-1,若CX不等于0,则转到BBB,将下一个低四位存入存储单元中,否则循环结束
MOV CX, 0004H ;给CX寄存器赋值为0004H
MOV SI, OFFSET BUF3 ;将SI指向变量BUF3开始的存储单元
MOV DX, [SI] ;将SI所指的数据装入DX寄存器中
ADD SI, 03H ;将DI指针下移三个字
CCC: MOV AX, DX ;将DX中的内容装入AX寄存器中
AND AX, 000FH ;即使BUF3的低四位不变,其余均变为0
CMP AL, 0AH ;比较[AL]与0AH的大小,以便能正确转换为0-9的ASCII值
JB DDD ;若[AL]<0AH,则转到DDD,否则,顺序执行
ADD AL, 07H ;因为[AL]>0AH,所以[AL] +07H,使得AL能转换成相应数字的ASCII值
DDD:ADD AL, 30H ;将[AL]转换成相应数字的ASCII值
MOV [SI], AL ;将AL中的内容装入以DS中的内容为段基地址,以SI的内容为偏移地址的存储单元中
DEC SI ;SI=SI-1,即将SI指向前一个存储单元
PUSH CX ;保存CX寄存器的内容
MOV CL, 04H ;给CL寄存器赋值为04H
SHR DX, CL ;将[DX]逻辑右移四位
POP CX ;恢复CX寄存器的内容
LOOP CCC ;循环判断语句,CX=CX-1,若CX不等于0,则转到CCC,将下一个低四位存入存储单元中,否则循环结束
MOV DX, OFFSET BUF2 ;将BUF2的偏移地址装入DX寄存器中
MOV AH, 09H
INT 21H ;在屏幕上显示BUF1的反码
MOV DX, OFFSET BUF3
MOV AH, 09H
INT 21H ;在屏幕上显示BUF1的补码
MOV AH, 4CH
INT 21H ;带返回码终止
CODE ENDS
END BEGIN
Exam2:
DATA SEGMENT ;数据段
A DB 34H, 18H, 2 DUP (0), $ ;定义字节型变量,其后的每操作数都占有一个字节
B DB 56H, 83H ;定义字节型变量,其后的每操作数都占有一个字节
DATA ENDS ;数据段结束
CODE SEGMENT ;代码段
ASSUME CS: CODE, DS:DATA
START: MOV AX, DATA
MOV DS, AX ;将数据段基地址装入数据段寄存器DS
MOV AL, A ;将A所指的数装入AL寄存器中
MOV BL, B ;将B所指的数装入BL寄存器中
ADD AL, BL ;AL+BL->AL
MOV AH, A+1 ;将A所指的下一个字节的数据装入AH
MOV BH, B+1 ;将B所指的下一个字节的数据装入BH
ADC AH, BH ;AH与BH进行带进位加法
MOV A, AL ;将第一个无符号数的相加结果放在以A起始的缓冲区
MOV A+1, AH ;将第二个无符号数的相加结果放在以A+1起始的缓冲区
MOV CX, 0014H ;以下是将数据转换为相应的ASCII值
MOV DI, OFFSET A
MOV DX, [DI]
ADD DI, 03
NEXT: MOV AX, DX
AND AX, 000FH
CMP AL, 0AH
JB QQQ
ADD AL, 07H
QQQ: ADD AL, 30H
MOV [DI], AL
DEC DI
PUSH CX
MOV CL, 14
SHR DX, CL
POP CX
LOOP NEXT
MOV DX, OFFSET A
MOV AH, 09H
INT 21H ;在屏幕上显示结果
MOV AH, 4CH
INT 21H ;带返回码终止
CODE ENDS
END START
Exam3:
STACK SEGMENT STACK ;堆栈段
DB 1000 DUP (0) ;定义其后的每个操作数都占有一个字节
STACK ENDS ;堆栈段结束
DATA SEGMENT ;数据段
BUF DB 72H, 34H, 1FH ;定义字节型变量,其后的每操作数都占有一个字节
MAX DB 2 DUP (?), $ ;定义字节型变量,其后的每操作数都占有一个字节
DATA ENDS ;数据段结束
CODE SEGMENT ;代码段
ASSUME CS:CODE, DS:DATA, SS:STACK
BEGIN: MOV AX, DATA
MOV DS, AX ;将数据段基地址装入数据段寄存器DS
MOV AL, BUF ;将BUF所指向的一个字节数据装入AL
CMP AL, BUF+1 ;比较BUF与BUF+1大小
JNB LP1 ;如果BUF不小于BUF+1,则转到lp1,否则顺序向下执行
MOV AL, BUF+1 ;将BUF+1所指向的一个字节数据装入AL
LP1: CMP AL, BUF+2 ;将BUF和BUF1中较大的一个和BUF+2比较大小
JAE LP2 ;如果BUF2小,则转到lp2,否则执行顺序向下执行
MOV AL, BUF+2 ;此时BUF2为三个数中最大的一个,将最大数装入AL寄存器中
LP2: MOV CX, 04H ;以下是将输出的最大数转换为相应的ASCII值MOV DI, OFFSET MAX
MOV DL, AL
INC DI
LP3: AND AL, 0FH
CMP AL, 0AH
JB LP4
ADD AL, 07H
LP4: ADD AL, 30H
MOV [DI], AL
DEC DI
PUSH CX
MOV CL, 03H
SHR DL, CL
POP CX
MOV AL, DL
LOOP LP3
MOV DX, OFFSET MAX
MOV AH, 09H
INT 21H
MOV AH, 4CH
INT 21H
CODE ENDS
END BEGIN
Exam4:
STACK SEGMENT STACK
DB 1000 DUP(0)
STACK ENDS
DATA SEGMENT
BUF DB 98H, 75H, 32H
MAX DB 4 DUP (?), $
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
BEGIN: MOV AX, DATA
MOV DS, AX
MOV AL, BUF
CMP AL, BUF+1
JG LP1 ;JG为比较两个有带符号数的大小,比较BUF和BUF1的大小,若BUF>BUF1,则跳转到lp1继续执行,否则顺序向下执行
XCHG AL, BUF+1 ;交换AL寄存器中的内容和BUF1,使AL寄存器中存放BUF和BUF1中较大的一个
LP1: MOV MAX, AL
JGE lp2 ;比较两个带符号数,如果BUF2小,则转到lp2,否则执行顺序向下执行
MOV AL, BUF+2
Lp2: MOV MAX, AL ;以下是将输出的最大数转换为相应的ASCII值,与1)题相同
MOV CX,04H
MOV DI, OFFSET MAX
MOV DL, [DI]
INC DI
LP3: MOV AL, DL
AND AL, 0FH
CMP AL, 0AH
JB LP4
ADD AL, 07H
LP4: ADD AL, 30H
MOV [DI], AL
DEC DI
PUSH CX
MOV CL, 02
SHR DX, CL
POP CX
LOOP LP3
MOV DX, OFFSET MAX
MOV AH, 09H
INT 21H
MOV AH, 4CH
INT 21H
CODE ENDS
END BEGIN
实验二 循环与子程序程序设计
一、实验目的
1) 加深对循环结构的理解。
2)掌握循环程序的设计方法。
3)学习子程序的定义和调用方法。
4)掌握子程序、子程序的嵌套、递归子程序的结构。
5) 掌握子程序设计、编制及调试。
6) 熟练掌握DEBUG的常用命令,学会用DEBUG调试程序。
二、实验内容
1) 编制程序计算S=1+23+34+45+……+N(N+1)+……直到N(N+1)大于200为止,并将结果由屏幕上显示出来。
2)将从3000H内存单元开始的100个字节存储单元全部清0。
3)编制在屏幕上显示九九乘法表的程序。
4)编制在屏幕上显示用*组成的三角形的程序。
5)设有五个字数据存放在以BUF为首地址的内存单元中,要求采用调用多个字数据相加的子程序方法编程,和的低位字放在RESULT单元,和的高位字放在RESULT+2单元,并将结果显示在屏幕上。
6)编写一个递归子程序,计算指数函数Xn的值,其中X,n从键盘输入。
三、实验设备
PC机一台
四、实验步骤
1) 按程序流程图编制实验程序。
2) 输入源程序。
3) 汇编、连接程序,执行程序,检查结果。
4)对内存单元3000H开始的100个存储单元用E命令输入任意数。
5) 程序的执行可用DEBUG的G命令,也可用T命令单步跟踪执行。
6) 用D命令检查执行结果。
五、实验报告的要求
1) 列出源程序。
2)对程序中用到的寄存器说明其功能。
3)总结计数控制循环程序的设计方法。
4) 说明怎样使用DEBUG进行程序调试的。调试过程中所遇到的问题是如何解决的。
、Exam1:
DATA SEGMENT
BUF DB’S=1+23+34+45+…+N(N+1)+…=’,’$’
RES DW 4 DUP(0),’$’
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS, AX
MOV DX, OFFSET BUF
MOV AH, 09H
INT 21H
MOV DX, 1
MOV BL, 2
NEXT: MOV AL, BL
INC BL
MUL BL
ADD DX, AX
CMP AX, 200
JNA NEXT
MOV CX, 0004H
MOV DI, OFFSET RES
ADD DI, 03H
NEXT1:MOV AX, DX
AND AX, 000FH
CMP AL, 0AH
JB NEXT2
ADD AL, 07
NEXT2:ADD AL, 30H
MOV [DI],AL
DEC DI
PUSH CX
MOV CL,04
SHR DX,CL
POP CX
LOOP NEXT1
MOV DX, OFFSET RES
MOV AH, 09H
INT 21H
MOV AH, 4CH
INT 21H
CODE ENDS
END START
Exam3:
DATA SEGMENT
ATAD DB ?, 2AH, ?, 3DH, ?, ?, 20H, $
ATAD1 DB ?, 2AH, ?, 3DH, ?, ?, 0DH, 0AH, $
DATA ENDS
STACK SEGMENT STACK
DB 20H DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
MOV CL, 09H
MOV BL, 00H
OKL:
MOV AL, 00H
INC BL
OK1:
INC AL
PUSH AX
CMP BL, AL
JZ OK
MOV BH, AL
MUL BL
MOV DI, OFFSET ATAD
CALL OKP
POP AX
JMP OK1
OK:
MOV BH, AL
MUL BL
MOV DI, OFFSET ATAD1
CALL OKP
POP AX
LOOP OKL
MOV AH, 4CH
INT 21H
OKP PROC
PUSH AX
PUSH BX
PUSH CX
ADD BX, 3030H
MOV [DI], BH
MOV [DI + 02H], BL
MOV CX, 0AH
MOV DH, 00H
OKL2:
CMP AX, CX
JS OK2
ADD CX, 0AH
INC DH
JMP OKL2
OK2:
SUB CX, 0AH
SUB AX, CX
MOV AH, DH
ADD AX, 3030H
MOV [DI + 04H], AH
MOV [DI + 05H], AL
MOV DX, DI
MOV AH, 09H
INT 21H
POP CX
POP BX
POP AX
RET
OKP ENDP
CODE ENDS
END START
Exam4:
CODES SEGMENT
ASSUME CS:CODES
START:
XOR BX,BX
MOV DL,2AH
MOV CX,9
LOP: PUSH CX
INC BL
MOV CL,BL
MOV DL,2AH
LOP2: MOV AH,02H
INT 21H
LOOP LOP2
POP CX
MOV DL,0AH
MOV AH,02H
INT 21H
MOV DL,0DH
MOV AH,02H
INT 21H
CMP BL,9
JZ ENDPRO
LOOP LOP
ENDPRO:
MOV AH,4CH
INT 21H
CODES ENDS
END START
Exam5:
STACK SEGMENT STACK
DB 1024 DUP(0)
STACK ENDS
DATA SEGMENT
BUF DW 0F101H,110DH,52H,100H,456H
COUNT =($-BUF)/2
RESULT DW 4 DUP(?),$
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
WDADD PROC
PUSH DI
MOV AX, 0
MOV DX, 0
MOV DI, OFFSET BUF
NEXT2: ADD AX, [DI]
JNC NEXT1
INC DX
NEXT1: ADD DI, 2
LOOP NEXT2
POP DI
RET
WDADD ENDP
SHOW PROC
PUSH CX
PUSH DI
MOV CX, 04H
MOV DI, OFFSET RESULT
MOV BX, AX
ADD DI, 07H
BBB: MOV AX, BX
AND AX, 000FH
CMP AL, 0AH
JB QQQ
ADD AL, 07H
QQQ: ADD AL, 30H
MOV [DI], AL
DEC DI
PUSH CX
MOV CL, 04
SHR BX, CL
POP CX
LOOP BBB
MOV CX, 0004H
CCC: MOV AX, DX
AND AX, 000FH
CMP AL, 0AH
JB DDD
ADD AL, 07H
DDD: ADD AL, 30H
MOV [DI], AL
DEC DI
PUSH CX
MOV CL, 04H
SHR DX, CL
POP CX
LOOP CCC
POP DI
POP CX
RET
SHOW ENDP
BEGIN: MOV AX, DATA
MOV DS, AX
MOV CX, COUNT
CALL WDADD
CALL SHOW
MOV DX, OFFSET RESULT
MOV AH, 09H
INT 21H
MOV AH, 4CH
INT 21H
CODE ENDS
END BEGIN
实验三 算术运算与代码转换程序设计
一、实验目的
1)掌握算术运算程序的设计方法。
2)掌握代码转换程序的设计方法。
3)进一步掌握各种程序结构。
4)熟练掌握和使用用DEBUG调试程序。
二、实验内容
1)编制两个多字节整数加法和减法程序,并将结果按十六进制形式显示在屏幕上。
2)编制程序实现二进制定点数与十进制数的ASCII码串之间转换,并将结果显示在屏幕上。
3)编写程序计算从键盘输入两个不超过四位的十进制数的和、差、积、商,并以十进制形式输出。
4)写程序把从键盘输入的四位十六进制数转换为压缩的BCD码,并显示输出。
5)编写一通用过程用来将十进制数(从键盘输入)转换为P(从键盘输入)进制数。
三、实验设备
PC机一台
四、实验步骤
1) 按程序流程图编制实验程序。
2) 输入源程序。
3) 汇编、连接程序,执行程序,检查结果。
4) 程序的执行可用DEBUG的G命令,也可用T命令单步跟踪执行。
5) 用D命令检查执行结果。
五、实验报告的要求
1)列出源程序。
2)对程序中用到的寄存器说明其功能。
3)总结算术运算和代码转换程序的设计方法。
4) 说明怎样使用DEBUG进行程序调试的。调试过程中所遇到的问题是如何解决的。
Eaxm1:
DATA SEGMENT
A DB 82H,34H,56H,78H,2AH,0BCH,0EFH,00H
B DB 34H,56H,78H,9AH,0BCH,0EFH,16H
LENB EQU $-B
LEN2 EQU (B-A)*2
RES DB LEN2 DUP(?),$
DATA ENDS
STACK SEGMENT PARA STACK
DW 20 DUP (?)
STACK ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE,SS:STACK
START: MOV AX,DATA
MOV DS,AX;多字节相加
MOV SI,0
CLC
MOV CX,LENB
LOP1: MOV AL,A[SI]
ADC AL,B[SI]
MOV A[SI],AL
INC SI
LOOP LOP1
ADC BYTE PTR A[SI],0;输出
MOV SI,0
ADD SI,LENB
MOV DI,0
MOV CX,LENB+1
LOP2: PUSH CX
MOV AL,A[SI];高位转换
MOV BL,AL
MOV CL,4
SHR BL,CL
CMP BL,0AH
JB NEXT1
ADD BL,07H
NEXT1: ADD BL,30H
MOV RES[DI],BL
INC DI;低位转换
MOV BL,AL
AND BL,0FH
CMP BL,0AH
JB NEXT2
ADD BL,07H
NEXT2: ADD BL,30H
MOV RES[DI],BL
INC DI
DEC SI
POP CX
LOOP LOP2
MOV AH,09H
MOV DX,OFFSET RES
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
Exam5:
DATA SEGMENT
STRING1 DB INPUT YOUR M=,$
STRING2 DB INPUT YOUR P=,$
RE DB 8 DUP(30H)
DATA ENDS
STACK1 SEGMENT STACK
DW 60H DUP(0)
STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK1
START:MOV AX,DATA
MO
展开阅读全文
相关搜索