大学汇编实验报告答案(软件)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DATA SEGMENT
TABLE DB30H,31H,32H,33H,34H,35H,36H,37H
DB38H,39H,41H,42H,43H,44H,45H,46H
HEXDB08H
ASCIDB?
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START: MOV AX,DATA
LEA SI,X
MOV CX,100
LP: AND BYTE PTR[SI],00H
INC SI
LOOPLP
MOV AH,4CH
INT 21H
CODE ENDS
END START
运行结果:
先将内存单元赋值,用debug的E指令赋值,用D指令查看内存中的数据
再运行程序,将内存单元全部清零
实验八 子程序设计
(2)调试说明:对SP的地址分配不到2000,计算机自动分配为0000,此时我就人为的把堆栈的首地址定义为2000。
(3)写出源程序清单和执行结果:
源程序:
STACKSEGMENT STACK
DW 100 DUP(0)
STACKENDS
CODESEGMENT
ASSUME SS:STACK,CS:CODE
2、调试说明:开始生成.OBJ文件时,调试不成功,以为是程序编译有误,后经再三检查都未发现错误,这时只好从头做检查,结果发现了错误:从本实验有的提示语段中拷贝过来的语句书写有误,即符号的书写为中文书写,以至于整个程序未能通过编译。把中文书写修改为英文书写后,编译成功。
3、源程序清单和执行结果:
源程序:
ADD BX,AX
MOV Z,BX
MOV AH,4CH
INT 21H
CODE ENDS
END START
用debug调试结果:
源程序:
(2)Z←W-(X+6)-(R+9)
DATASEGMENT
XDW 0006H
RDW 003AH
W DW0110H
ZDW ?
DATAENDS
CODESEGMENT
ASSUME CS:CODE,DS:DATA
实验一 DEBUG的启动及其基本命令的使用
源程序:(指导书中给出)
DATA SEGMENT
STRING1 DB 'Move the cursor backward'
STRING2 DB 'Move the cursor backward'
MESS1 DB 'Match.',13,10,'$'
MESS2 DB 'No Match.',13,10,'$'
MOV DL,AL
MOV AH,02H;输出字符到终端
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
运行结果:
实验六 分支程序设计
1、实验说明:假设有一组数据:5,-4,0,3,100,-51,请编一程序,判断:每个数大于0,等于0,还是小于0;并输出其判断结果。
DATA ENDS
STACK SEGMENT STACK
DB 10 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:MOV DX,1
MOV BL,2
LP: MOV AL,BL
ADD BL,1
MUL BL
ADD DX,AX;DX中存放sum和
1、程序说明:编制一程序,要求键入一个班的学生成绩,并存放于50字的ERADE数组中,然后根据ERADE中的成绩,把学生名次填入50字的RANK数组中,再按学号顺序把名次从终端上显示出来。
CMP AX,200
JG OUTPUT
LOOPLP
OUTPUT:MOV BX,DX
MOV CX,4
LP2: ROL BX,1;BL存放和,移位,从高到低一位一位显示
ROL BX,1
ROL BX,1
ROL BX,1
MOV AX,BX
AND AX,000FH;取BL中低四位
XOR DX,DX
ADD AL,30H;十六进制转换成ASCII码加30H
DB?
DATA ENDS
STACK SEGMENT STACK
DB5DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME DS:DATA, SS:STACK,CS:CODE
START: MOV AX,DATA
MOV DS,AX
MOV AH,01H;从输入端读取字符
INT 21H
SUB AL,20H;小写转换成大写
DB 10 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME DS:DATA,SS:STACK,CS:CODE
START: MOV AX,DATA
MOV DS,AX
LEA SI,XX
MOV AX,0
MOV CX,6
L1: MOV AL,[SI]
CMP AL,0;与0比较
JG BIGER
START: MOV AX,DATA
MOV DS,AX
MOV AX,X
ADD AX,6
MOV BX,R
ADD BX,9
MOV CX,W
SBB CX,AX
SBB CX,BX
MOV Z,CX
MOV AH,4CH
INT 21H
CODE ENDS
END START
用debug调试结果:
实验四 查表程序设计
1、程序说明:用查表的方法将一位十六进制数转换成与它相应的ASCII码,并将结果存放到ASCI单元中。
(1)Z←W+(Z-X)
DATASEGMENT
X DD0001H
Z DD0003H
W DD0005H
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV AX,X
MOV BX,Z
SUB BX,AX
MOV AX,W
等于
YES
NO
4、源程序清单和执行结果:
源程序:
DATA SEGMENT
XX DB 05H,0FCH,00H,03H,64H,0CDH
Y1 DB 'Y=1',0DH,0AH,'$'
Y2 DB 'Y=0',0DH,0AH,'$'
Y3 DB 'Y=-1',0DH,0AH,'$'
DATA ENDS
STACK SEGMENT STACK
即:
1 当x>0
y=0 当x=0
-1 当x<0
2、调试说明:在最初的程序中,我使用了MOV BX,XX等语句,后来发现像这样的语句在实际使用中有些累赘,于是我便做了修改,简化了汇编语言。其次,在调试中,发现符号无法显示的问题,于是采用两次显示符号的方法,较理想的解决了负号问题。
3、程序框图:
小于
大于等于
DATAENDS
STACKSEGMENT STACK
DB40 DUP (?)
STACKENDS
PROGNAMSEGMENT
ASSUME CS:PROGNAM,DS:DATA,ES:DATA,SS:STACK
MAIN PROC FAR
START:PUSH DS
XOR AX,AX
PUSH AX
MOV AX,DATA
LOOPL1
MOV AH,4CH
INT 21H
CODE ENDS
END START
运行结果:
思考题:
程序中的原始数据是以怎样的形式存放在数据区中的?请用DEBUG调试程序观察并分析。
以补码形式存放
实验七循环程序设计
实验内容:
1.编制程序计算S=1+2•3+3•4+4•5+……+N(N+1)+……直到N(N+1)大于200为止,并将结果由屏幕上显示出来。其程序的流程图如图7. 1所示。
MOV DS,AX
MOV BX,OFFSET TABLE
MOV AL,HEX;查找对象的下标存在AL中
XLAT
MOV ASCI,AL
MOV AH,4CH
INT 21H
CODE ENDS
END START
用debug调试结果:
实验五 系统功能调用
1、程序说明:试编写一个汇编语言程序,要求对键盘输入的小写字母用大写Biblioteka Baidu母显示出来。
源程序:
DATA SEGMENT
ORG 0300H
A DB 12H,23H,34H,45H,56H,67H,78H,89H,9AH
DATA ENDS
PROGNAM SEGMENT
ASSUME CS:PROGNAM,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV BX,0300H
DATA SEGMENT
ORG 3000H
X DB 100 DUP(?)
DATA ENDS
STACK SEGMENT STACK
DB 10 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START: MOV AX,DATA
MOV DS,AX
INT 21H
RET
MAIN ENDP
PROGNAM ENDS
END START
运行结果:
用DEBUG调试将输出字符串改为‘No Match’
用E指令修改“backward”为“forward”
再次用d命令查看修改结果。
用g命令运行程序
实验二 内存操作数及寻址方法
1、(1)程序说明:设堆栈指针SP=2000H,AX=3000H,BX=5000H;请编一程序段将AX和BX的内容进行交换。请用堆栈作为两寄存器交换内容的中间存储单元,用字处理程序编辑程序。
MOV DS,AX
MOV ES,AX
MOV AX,STACK
MOV SS,AX
LEA SI,STRING1
LEA DI,STRING2
CLD
MOV CX,25
REPZ CMPSB
JZ MATCH
LEA DX,MESS2
JMP SHORT DISP
MATCH:LEA DX,MESS1
DISP:MOV AH,09h
JE EQUAL
MOV DX,OFFSET Y3
MOV AH,09H
INT 21H
JMP OUTPUT
BIGER: MOV DX,OFFSET Y1
MOV AH,09H
INT 21H
JMP OUTPUT
EQUAL: MOV DX,OFFSET Y2
MOV AH,09H
INT 21H
OUTPUT:INC SI
2.将从3000H内存单元开始的100个字节存储单元全部清0。本实验要求在DEBUG调试状态下进行,包括汇编程序、运行程序、检查结果。
源程序:
(1)编制程序计算S=1+2•3+3•4+4•5+……+N(N+1)+……直到N(N+1)大于200为止,并将结果由屏幕上显示出来。
DATA SEGMENT
RESULT DW ?
MOV AX,0300H;立即数寻址
MOV AX,[0300H];存储器寻址方式中的直接寻址方式
MOV AX,[BX];寄存器间接寻址
MOV SI,2
MOV AX,0001[BX];基址寻址
MOV AX,[BX][SI];基址加变址
MOV AX,0001[BX][SI];带偏移量的基址加变址
MOV AH,4CH
2、调试说明:在DEBUG显示字符窜时,曾显示乱码,未能按预期显示,经检查发现在编译字符窜时出现错误,因为调用21H中断输出一串字符要求用'$'结尾,我没用上‘$’。还有,键盘输入字符是被存放在AX内,当要多次使用AX时应该把输入内容另存一地址
3、源程序清单和执行结果:
源程序:
DATA SEGMENT
CMP AL,3AH;0—9数字与A—F的ASCII码不连续
JB PIT
ADD AL,07H;若比A(10)大,还要再加07H
PIT:MOV DL,AL
MOV AH,02H
INT 21H
LOOPLP2
MOV AH,4CH
INT 21H
CODE ENDS
END START
运行结果:
(2)将从3000H内存单元开始的100个字节存储单元全部清0。本实验要求在DEBUG调试状态下进行,包括汇编程序、运行程序、检查结果。
2、调试说明:当编译完成后,计算机未能生成.OBJ的文件,经检查错误发生在ADD使用上,我把两个寄存器操作数同时用在ADD语句里,结果出错了。把ADD语句稍作写该后,程序运行正确。
3、写出源程序清单和执行结果
本实验我们只做前两个,即:(1)Z←W+(Z-X);(2)Z←W-(X+6)-(R+9)
源程序:
START:MOV AX,3000H
MOV BX,5000H
MOV SP,2000H
PUSH AX;将AX中的内容压栈
MOV AX,BX;BX中的内容给AX
POP BX
MOV AH,4CH
INT 21H
CODEENDS
ENDSTART
用debug调试结果:
2、程序说明:用masm和link对以下程序进行汇编和连接,调试程序在DEBUG调试程序状态下进行。用单步执行的方法,分析每条指令源地址的形成过程,当数据传送完毕时,AX中的内容是什么。
INT 21H
PROGNAM ENDS
ENDSTART
用debug调试结果:
实验三 算术运算指令
1、程序说明:编写三个完整的汇编语言源程序,完成以下计算。其中X、Y、Z、R、W均为存放16位带符号数单元的地址。
(1)Z←W+(Z-X)
(2)Z←W-(X+6)-(R+9)
(3)Z←(W*X)/(Y+6),R←余数
相关文档
最新文档