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

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

猜你喜欢

转载自blog.csdn.net/qq_40568527/article/details/79889562
今日推荐