汇编实验1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一顺序与分支程序设计
一、实验目的
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 按下列公式计算。
⎪⎪⎩⎪⎪⎨⎧===-=+=)
6(2/)
5()4(2)3(2222X X X X X X X X X X 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) 对调试源程序的结果进行分析。
实验1-1
源程序:
DATA SEGMENT
BUF1 DW 932AH ;(以十六进制表示一个数的原码,包括符号位) BUF2 DW ?
BUF3 DW ?
DATA ENDS
STACK1 SEGMENT PARA STACK
DW 20H DUP(0)
STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK1,ES:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AX,BUF1
MOV BX,AX
AND AX,0FFFFH
JNS L ;sf表示符号标志位,若最高位大于7时,则为负,该命令判断是否为负,为负则求反(加一),为正则原样输出
NEG AX
XOR BX,0FFFFH
OR AX,8000H ;保持符号位不变
OR BX,8000H
L:MOV BUF2,BX
MOV BUF3,AX
PUSH AX
PUSH BX
MOV CX,2
LOP:POP BX;将结果每一位通过循环移位显示在屏幕上
PUSH CX
MOV CX,4
MOV CL,4 ROL BX,CL MOV DL,BL AND DL,0FH CMP DL,0AH L2
ADD DL,07H L2:ADD DL,30H MOV AH,02H INT 21H
POP CX
LOOP LP
MOV DL,' ' INT 21H
LOOP LOP
MOV AH,4CH
INT 21H
CODE ENDS
END START
运行结果:
屏幕上显示的是BUF1数的反码和补码(十六进制,包括符号位)。
调试时发现结果显示成乱码,经过研究程序代码发现如果数字在A到F之间,则需要将存数值加37。
实验1-2
源程序:
data segment
A dw 00ED1h
B dw 0BDE9h
data ends
stack1 segment para stack
dw 20h dup(0)
stack1 ends
code segment
assume cs:code,ds:data,ss:stack1,es:data
start:
MOV AX,DATA
MOV DS,AX
MOV BX,A ;(把A存储的单元放入BX寄存器中)
MOV AX,B;(把B存储的单元放入AX寄存器中)
ADD BX,AX
JC L0;cf是无符号的进位,当两数相加大于0ffffh,产生进位 MOV A,BX
L0:MOV DX,BX;显示相加结果
AND DX,0F000H
MOV CL,12