华中科技大学汇编程序设计第二次上机实验

汇编课上没有认真听课,加上没怎么提前准备实验,导致我在上机时只能对着电脑屏幕发呆。看着同学们都陆陆续续找老师检查实验报告,我内心瞬间感到了失落与沮丧,同时也萌生了要认真学习汇编的念头。于是,第二天一上完课,我就开始看书,敲代码,以填补之前挖下的大坑。功夫不负有心人,经过一下午加一晚上不断的学习,敲代码和调试,我也终于完成了这次实验。虽然代码质量不高,但是自己仍然感觉十分满足,因为通过今天的学习,我学到了许多新东西,也对汇编语言有了更多了了解与感受。所以特来csdn写下这篇文章以记下这一天--2018.4.10

任务书

任务4. 设计实现一个网店商品信息查询的程序。
1、实验背景
有一个老板在网上开了2个网店SHOP1,SHOP2;每个网店有n种商品销售,不同网店之间销售的商品种类相同,但数量和销售价格可以不同。每种商品的信息包括:商品名称(10个字节,名称不足部分补0),进货价(字类型),销售价(字类型),进货总数(字类型),已售数量(字类型),利润率(%)【=(销售价已售数量-进货价进货总数)100/(进货价进货总数),字类型】。老板管理网店信息时需要输入自己的名字(10个字节,不足部分补0)和密码(6个字节,不足部分补0),登录后可查看商品的全部信息;顾客(无需登录)可以查看所有网店中每个商品除了进货价、利润率以外的信息。
例如:
BNAME DB ‘ZHANG SAN’,0 ;老板姓名(必须是自己名字的拼音)
BPASS DB ‘test’,0,0 ;密码
N EQU 30
S1 DB ‘SHOP1’,0 ;网店名称,用0结束
GA1 DB ‘PEN’, 7 DUP(0) ; 商品名称
DW 35,56,70,25,? ;利润率还未计算
GA2 DB ‘BOOK’, 6 DUP(0) ; 商品名称
DW 12,30,25,5,? ;利润率还未计算
GAN DB N-2 DUP( ‘Temp-Value’,15,0,20,0,30,0,2,0,?,?) ;除了2个已经具体定义了商品信息以外,其他商品信息暂时假定为一样的。
S2 DB ‘SHOP2’,0 ;网店名称,用0结束
GB1 DB ‘BOOK’, 6 DUP(0) ; 商品名称
DW 12,28,20,15,? ;利润率还未计算
GB2 DB ‘PEN’, 7 DUP(0) ; 商品名称
DW 35,50,30,24,? ;利润率还未计算
……

2、功能一:提示并输入登录用户的姓名与密码
(1)使用9号DOS系统功能调用,先后分别提示用户输入姓名和密码。
(2)使用10号DOS系统功能调用,分别输入姓名和密码。输入的姓名字符串放在以in_name为首址的存储区中,密码放在以in_pwd为首址的存储区中,进入功能二的处理。
(3)若输入姓名时只是输入了回车,则将0送到AUTH字节变量中,跳过功能二,进入功能三;若在输入姓名时仅仅输入字符q,则程序退出。

3、功能二:登录信息认证
(1)使用循环程序结构,比较姓名是否正确。若不正确,则跳到(3)。
(2)若正确,再比较密码是否相同,若不同,跳到(3)。
(3)若名字或密码不对,则提示登录失败,并回到“功能一(1)”的位置,提示并重新输入姓名与密码。
(4)若名字和密码均正确,则将1送到AUTH变量中,进到功能三。
提示:字符串比较时,当采用输入串的长度作为循环次数时,若因循环次数减为0而终止循环,则还要去判断网店中定义的字符串的下一个字符是否是结束符0,若是,才能确定找到了(这样做是为了避免输入的字符串仅仅是数据段中所定义字符串的子集的误判情况)。

4、功能三:计算指定商品的利润率。
(1)提示用户输入要查询的商品名称。若未能在第一个网店中找到该商品,重新提示输入商品名称。若只输入回车,则回到功能一(1)。
(2)判断登录状态,若是已经登录的状态,转到(3)。否则,转到(4)。
(3)首先计算第一个网店该商品的利润率PR1,然后在第二个网店中寻找到该商品,也计算其利润率PR2。最后求出该商品的平均利润率APR=(PR1+PR2)/2。进入功能四。
(4)若是未登录状态,则只在下一行显示该商品的名称,然后回到功能一(1)。
要求尽量避免溢出。
提示:使用循环程序结构,注意寻址方式的灵活使用。结果只保留整数部分。

5、功能四:将功能三计算的平均利润率进行等级判断,并显示判断结果。

(1)等级显示方式:若平均利润率大于等于90%,显示“A”;大于等于50%,显示“B”;大于等于20%,显示“C”;大于等于0%,显示“D”;小于0%,显示“F”。
提示:使用分支程序结构,采用2号DOS系统功能调用显示结果(注意,“%”是不要出现在计算式子和指令语句中的)。
(2)使用转移指令回到“功能一(1)”处(提示并输入姓名和密码)。

附上代码:

.386
DATA SEGMENT USE16

BNAME DB ‘CHENGWAN’,0,0 ;老板姓名(必须是自己名字的拼音)
BPASS DB ‘123456’;密码
N EQU 2
S1 DB ‘SHOP1’,0 ;网店名称,用0结束
GA1 DB ‘PEN’,7 DUP(‘0’)
DW 35,56,70,25,? ;利润率还未计算
GA2 DB ‘BOOK’, 6 DUP(‘0’) ; 商品名称
DW 12,30,25,5,? ;利润率还未计算

S2 DB ‘SHOP2’,0
GB2 DB ‘PEN’, 7 DUP(‘0’) ; 商品名称
DW 35,50,30,24,? ;利润率还未计算 ;网店名称,用0结束
GB1 DB ‘BOOK’, 6 DUP(‘0’) ; 商品名称
DW 12,28,20,15,? ;利润率还未计算

AUTH DB 0
PTR1 DW ?
PTR2 DW ?

IN_NAME DB 11
DB ?
DB 11 DUP(0)
IN_PWD DB 7
DB ?
DB 7 DUP(0)
IN_GOODSNAME DB 11
DB ?
DB 11 DUP(0)
NAMEINPUT DB “PLEASE INPUT THE BOSS NAME: PASSWORDINPUTDBPLEASEINPUTTHEPASSWORD: ” P A S S W O R D I N P U T D B “ P L E A S E I N P U T T H E P A S S W O R D :
GOODSINPUT DB “PLEASE INPUT THE GOODS NAME: FAILDBLOGININFAILED!TRYAGAIN ” F A I L D B “ L O G I N I N F A I L E D ! T R Y A G A I N
SUCCESS DB “LOGIN IN SUCCESSFULLY TISHIDBFAILED!TRYAGAINS ” T I S H I D B “ F A I L E D ! T R Y A G A I N S

DATA ENDS

CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LOGIN:
MOV AUTH,0
LEA DX,OFFSET NAMEINPUT;输入老板名字
MOV AH,9H
INT 21H
MOV DL, 0AH ;换行符
MOV AH, 2H
INT 21H
LEA DX,OFFSET IN_NAME
MOV AH,10
INT 21H
MOV DL, 0AH ;换行符
MOV AH, 2H
INT 21H
LEA BX,OFFSET IN_NAME
CMP BYTE PTR [BX+2],0DH
JE LOOKUP
CMP BYTE PTR [BX+2],’Q’;输入为q直接退出
JE EXIT

MOV     DI,OFFSET IN_NAME
ADD     DI,2
MOV     SI,OFFSET BNAME
SUB     SI,1
SUB     DI,1
MOV     CX,0

COMPA:
ADD DI,1
ADD SI,1
ADD CX,1
CMP CX,9H
JE QUIT
MOV BL,BYTE PTR[SI]
CMP BL,BYTE PTR [DI]
JE COMPA
JNE FAILED
QUIT:
LEA DX,OFFSET PASSWORDINPUT;输入密码
MOV AH,9H
INT 21H
MOV DL,0AH;换行
MOV AH,2H
INT 21H
LEA DX,OFFSET IN_PWD
MOV AH,0AH
INT 21H
LEA BX,OFFSET IN_PWD
MOV DI,OFFSET IN_PWD
ADD DI,2
MOV SI,OFFSET BPASS

MOV     DI,OFFSET IN_PWD
ADD     DI,2
MOV     SI,OFFSET BPASS
SUB     SI,1
SUB     DI,1
MOV     CX,0

COMPB:
ADD DI,1
ADD SI,1
ADD CX,1
CMP CX,7H
JE SUCCESSFUL
MOV BL,BYTE PTR[SI]
CMP BL,BYTE PTR [DI]
JE COMPB
JNE FAILED
SUCCESSFUL:
MOV AUTH,1
MOV DX,OFFSET SUCCESS
MOV AH,9H
INT 21H
MOV DL,0AH
MOV AH,2H
INT 21H
LOOKUP:
MOV DX,OFFSET GOODSINPUT
MOV AH,9H
INT 21H
MOV DL,0AH
MOV AH,2H
INT 21H

MOV     DX,OFFSET IN_GOODSNAME
MOV     AH,0AH
INT     21H
MOV     DL,0AH
MOV     AH,2H
INT     21H

MOV     SI,OFFSET IN_GOODSNAME
CMP     BYTE PTR [SI+2],0DH
JE      LOGIN

MOV     DI,OFFSET IN_GOODSNAME
ADD     DI,2
MOV     CL,2
MOV     DX,OFFSET GA1
SUB     DX,20

NEXT:
ADD DX,20
MOV SI,DX

SUB     SI,1
SUB     DI,1
MOV     CH,0

COMPC:
ADD DI,1
ADD SI,1
ADD CH,1
CMP CH,11
JE FIND
MOV BL,BYTE PTR[SI]
CMP BL,BYTE PTR [DI]
JE COMPC

DEC     CL;
JNZ     NEXT

NOTFIND:
LEA DX,OFFSET TISHI
MOV AH,9H
INT 21H
MOV DL,0AH
MOV AH,2H
INT 21H
JMP LOOKUP
FAILED:
LEA DX,OFFSET FAIL;提示登录失败
MOV AH,9H
INT 21H
MOV DL, 0AH ;换行符
MOV AH, 2H
INT 21H
JMP LOGIN
FIND:
MOV SI,DX
CMP AUTH,1
JNE PRINT
MOV AX,WORD PTR [SI+12]
MOV BX,WORD PTR [SI+16]
IMUL AX,BX
MOV CX,WORD PTR [SI+10]
MOV BX,WORD PTR [SI+14]
IMUL BX,CX
SUB AX,BX
IMUL AX,100
CWD
IDIV BX
MOV DX,AX
MOV PTR1,DX
MOV AX,WORD PTR [SI+52]
MOV BX,WORD PTR [SI+56]
IMUL BX
MOV CX,WORD PTR [SI+50]
MOV BX,WORD PTR [SI+54]
IMUL BX,CX
SUB AX,BX
IMUL AX,100
CWD
IDIV BX
MOV SI,AX
MOV PTR2,SI
MOV AX,PTR1
ADD AX,PTR2
MOV BL,2
IDIV BL
CMP AL,90
JGE LEVELA
CMP AL,50
JGE LEVELB
CMP AL,20
JGE LEVELC
CMP AL,0
JGE LEVELD
JMP LEVELF
LEVELA:
MOV DL,41H
MOV AH,2H
INT 21H
MOV DL, 0AH ;换行符
MOV AH, 2H
INT 21H
JMP LOOKUP
LEVELB:
MOV DL,42H
MOV AH,2H
INT 21H
MOV DL, 0AH ;换行符
MOV AH, 2H
INT 21H
JMP LOOKUP
LEVELC:
MOV DL,43H
MOV AH,2H
INT 21H
MOV DL, 0AH ;换行符
MOV AH, 2H
INT 21H
JMP LOOKUP
LEVELD:
MOV DL,44H
MOV AH,2H
INT 21H
MOV DL, 0AH ;换行符
MOV AH, 2H
INT 21H
JMP LOOKUP
LEVELF:
MOV DL,46H
MOV AH,2H
INT 21H
MOV DL, 0AH ;换行符
MOV AH, 2H
INT 21H
JMP LOOKUP

PRINT:
MOV DX,OFFSET IN_GOODSNAME
MOV AH,9H
INT 21H
JMP LOOKUP

EXIT:
MOV AH,4CH
INT 21H
CODE ENDS
END START

华中科技大学汇编实验 源代码及实验报告 2.1 任务1. 《80X86汇编语言程序设计》教材中 P31的 1.14题。 要求: (1) 直接在TD中输入指令,完成两个数的求和、求差的功能。求和/差后的结果放在(AH)中。 (2) 请事先指出执行指令后(AH)、标志位 SF、OF、CF、ZF的内容。 (3) 记录上机执行后的结果,与(2)中对应的内容比较。 (4)求差运算中,若将A、B视为有符号数,且A>B, 标志位有何特点? 若将A、B视为无符号数,且A>B, 标志位又有何特点? 2.2 任务2. 《80X86汇编语言程序设计》教材中 P45的 2.3题。 要求: (1)分别记录执行到“MOV CX,10”和“INT 21H”之前的(BX), (BP),(SI),(DI)各是多少。 (2)记录程序执行到退出之前数据段始40个字节的内容,指出程序运行结果是否与设想的一致。 (3)在标号LOPA前加上一段程序,实现新的功能:先显示提示信息“Press any key to begin!”, 然后,在按了一个键之后继续执行LOPA处的程序。 2.3 任务3. 《80X86汇编语言程序设计》教材中 P45的 2.4题的改写。 要求: (1) 实现的功能不变,对数据段中变量访问时所用到的寻址方式中的寄存器改成32位寄存器。 (2) 内存单元中数据的访问采用变址寻址方式。 (3) 记录程序执行到退出之前数据段始40个字节的内容,检查程序运行结果是否与设想的一致。 (4)在TD代码窗口中观察并记录机器指令代码在内存中的存放形式,并与TD中提供的反汇编语句及自己编写的源程序语句进行对照,也与任务2做对比。(相似语句记录一条即可,重点理解机器码与汇编语句的对应关系,尤其注意操作数寻址方式的形式)。 (5)观察连续存放的二进制串在反汇编汇编语言语句时,从不同字节位置始反汇编,结果怎样?理解 IP/EIP指明指令起始位置的重要性。 2.4 设计实现一个学生成绩查询的程序。 1、实验背景 在以BUF为首址的字节数据存储区中,存放着n个学生的课程成绩表(百分制),每个学生的相关信息包括:姓名(占10个字节,结束符为数值0),语文成绩(1个字节),数学成绩(1个字节),英语成绩(1个字节),平均成绩(1个字节)。 2、功能一:提示并输入待查询成绩的学生姓名 (1)使用9号DOS系统功能调用,提示用户输入学生姓名。 (2)使用10号DOS系统功能调用,输入学生姓名。输入的姓名字符串放在以in_name为首址的存储区中。 (3)若只是输入了回车,则回到“(1)”处重新提示与输入;若仅仅输入字符q,则程序退出,否则,准备进入下一步处理。 3、功能二:以学生姓名查询有无该学生 (1)使用循环程序结构,在成绩表中查找该学生。 (2)若未找到,就提示用户该学生不存在,并回到“功能一(1)”的位置,提示并重新输入姓名。 (3)若找到,则将该学生课程成绩表的起始偏移地址保存到POIN字变量中。 4、功能三:计算所有学生的平均成绩 使用算数运算相关指令计算并保存每一个学生的平均成绩。 平均成绩计算公式:(A*2+B+C/2)/3.5,即将语文成绩A乘以权重2、英语成绩C除以权重2后,与数学成绩B一起求和,再计算该生的平均成绩。要求避免溢出。 5、功能四:将功能二查到的学生的平均成绩进行等级判断,并显示判断结果。 (1)平均成绩等级显示方式:若平均成绩大于等于90分,显示“A”;大于等于80分,显示“B”;大于等于70分,显示“C”;大于等于60分,显示“D”;小于60分,显示“F”。 提示:使用分支程序结构,采用2号DOS系统功能调用显示结果。 (2)使用转移指令回到“功能一(1)”处(提示并输入姓名)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值