刚开始学习汇编,有问题。代码我贴出来,还请大家解答,谢谢!
以下是我改动后的代码,编译方面已经没有错误了。但是执行程序的时候,按道理说我输入“ZHANGSAN”后应该要出现"PLEASE INPUT THE PASSWORD:",可是它怎么一直出现"PLEASE INPUT THE BOSS NAME:",这个应该是名字不符时才应该出现的。请问这个问题怎么解决,我想可能是定义字符串变量时可能不对,但是我改来改去还是不知道问题在哪,求赐教。代码附在文字下方。.386
.model flat,stdcall
; ExitProcess 在 kernel32.lib中实现,原型定义如下
ExitProcess PROTO STDCALL : DWORD
includelib kernel32.lib
; printf 在 msvcrt.lib中实现,原型定义如下
includelib msvcrt.lib
printf PROTO C : ptr sbyte, : VARARG
scanf_s PROTO C : ptr sbyte, : VARARG
.DATA
STRING DB "%s",0
BUF DB "%d",0
BNAME DB 'ZHANGSAN',0 ; 老板姓名
BPASS DB 'test',0 ; 密码
N EQU 30
GA1 DB 'PEN',4 DUP(0) ; 商品名称
DW 35, 56, 70, 25, ? ;进货价 销售价 进货总数 已售数量 利润率未计算
GA2 DB 'PENCIL',7 DUP(0); 商品名称
DW 2, 3, 80, 40, ? ; 进货价 销售价 进货总数 已售数量 利润率未计算
GA3 DB 'BOOK',5 DUP(0) ; 商品名称
DW 12, 30, 25, 5, ? ; 进货价 销售价 进货总数 已售数量 利润率未计算
GA4 DB 'RULER',6 DUP(0) ; 商品名称
DW 4, 7, 75, 30, ? ; 进货价 销售价 进货总数 已售数量 利润率未计算
KEY DB 0 ;判断是否为老板的标志位
input_name DB 10 DUP(0),0
input_password DB "%s",0
input_goodsname DB "%s",0
NAMEINPUT DB "PLEASE INPUT THE BOSS NAME:",0
PASSWORDINPUT DB "PLEASE INPUT THE PASSWORD:",0
FAIL DB "LOGIN FAILED!TRY AGAIN!",0
SUCCESS DB "LOGIN SUCCESSFULLY!",0
GOODSINPUT DB "PLEASE INPUT THE GOOD'S NAME:",0
NOTFOUND DB "CANNOT FIND THE GOOD!TRY AGAIN!",0
GOODSNAME DB "THE NAME OF THE GOOD IS:",0 ;商品名
GOODSCOST DB "THE COST OF THE GOOD IS:",0 ;成本价
GOODSSALE DB "THE SALE OF THE GOOD IS:",0 ;销售价
GOODSALLNUMBER DB "THE ALL NUMBER OF THE GOOD IS:",0 ;进货总数
GOODSSOLDNUMBER DB "THE SOLD NUMBER OF THE GOOD IS:",0 ;已售数量
GOODSPROFITRATE DB "THE PROFIT RATE OF THE GOOD IS:",0 ;利润率
.STACK 200
.CODE
START:
LOGIN_INPUTNAME:
MOV KEY,0;登录是否成功标志
invoke printf, offset STRING, addr NAMEINPUT ;输入老板名字
invoke scanf_s, offset STRING, offset input_name
LEA EBX,input_name
CMP DWORD PTR[EBX],0DH
JE CUSTOMER_SEARCH_GOODS;用户输入回车跳过管理员权限获取,成为普通用户
CMP DWORD PTR[EBX],71H;输入quit退出程序,直接结束
JE EXIT
MOV EDI,OFFSET input_name ; 取输入名字字符串首地址
MOV ESI,OFFSET BNAME; 取用户名首地址
MOV ECX,0 ; 完成
COMPARE_NAME: ; 循环比较名字字符
CMP ECX, 10; 执行10次
JE LOGIN_INPUTPASSWORD; 10次都相同则成立,跳到验证密码
MOV EAX, DWORD PTR[EDI]
MOV EDX, DWORD PTR[ESI]
ADD EDI, 1
ADD ESI, 1
ADD ECX, 1
CMP EAX,EDX ; 比较字节
JE COMPARE_NAME; 字节相同循环进行
JNE LOGIN_INPUTNAME; 字节出现不相同,跳到登录页面
LOGIN_INPUTPASSWORD: ; 验证密码
invoke printf, offset STRING, addr PASSWORDINPUT; 显示输入密码
invoke scanf_s, offset STRING, offset input_password
ADD EDI,10
MOV EDI,OFFSET input_password; 取输入密码字符串首地址
ADD ESI,10
MOV ESI,OFFSET BPASS; 取密码首地址
ADD ECX,10
MOV ECX, 0
COMPARE_PASSWORD: ; 循环比较密码字符
CMP ECX, 6; 执行6次
JE LOGIN_SUCCESSFULLY; 6次都相同则成立,跳到登陆成功
MOV AL, BYTE PTR[EDI+10]
MOV BL, BYTE PTR[ESI+10]; 比较字节
ADD EDI,1
ADD ESI,1
ADD ECX,1
CMP BL,AL
JE COMPARE_PASSWORD; 字节相同循环进行
JNE LOGIN_FAILURE; 字节出现不相同,跳到登录失败
LOGIN_SUCCESSFULLY: ;登录成功
MOV KEY,1;登录状态为1成功获取权限显示全部信息
invoke printf, offset STRING, addr SUCCESS; 显示登录成功
JMP BOSS_SEARCH_GOODS
LOGIN_FAILURE: ;登陆失败
invoke printf, offset STRING, addr FAIL; 显登陆失败弹出信息
JMP LOGIN_INPUTNAME
BOSS_SEARCH_GOODS: ;老板查询商品
MOV EDI,0
MOV EBX,0
MOV ESI,0
MOV ECX,0
MOV ESI,OFFSET GA1
invoke printf, offset STRING, addr GOODSNAME
invoke printf, offset STRING, addr DWORD PTR[ESI]
ADD ESI,10
MOV EBX,ESI ;GA1 成本价
invoke printf, offset STRING, addr GOODSCOST
invoke printf, offset BUF, addr DWORD PTR[EBX]
ADD ESI,2
MOV EAX,ESI ;GA1 销售价
invoke printf, offset STRING, addr GOODSSALE
invoke printf, offset BUF, addr DWORD PTR[EAX]
ADD ESI,2
MOV EDI,ESI ;GA1 进货数量
invoke printf, offset STRING, addr GOODSALLNUMBER
invoke printf, offset BUF, addr DWORD PTR[EDI]
ADD ESI,2
MOV ECX,ESI ;GA1 已售数量
invoke printf, offset STRING, addr GOODSSOLDNUMBER
invoke printf, offset BUF,addr DWORD PTR[ECX]
IMUL EAX,ECX ;销售价乘以已售数量
IMUL EBX,EDI ;成本价乘以进货数量
SUB EAX,EBX ;销售总额减去成本总价
IMUL EAX,100 ;乘以100
IDIV EBX
invoke printf, offset STRING, addr GOODSPROFITRATE
invoke printf, offset BUF, addr DWORD PTR[EAX]
CUSTOMER_SEARCH_GOODS: ;顾客查询商品
MOV EDI,0
MOV EBX,0
MOV ESI,0
MOV ECX,0
invoke printf, offset STRING, addr GOODSINPUT
invoke scanf_s, offset STRING, offset input_goodsname
LEA EBX,input_goodsname
CMP BYTE PTR[EBX], 'q';输入quit退出程序,直接结束
JE EXIT
MOV ESI,OFFSET GA1; 取商品名字首地址
JMP COMPARE_GOODSNAME_GA1
COMPARE_GOODSNAME_GA1: ;确定是否符合商品1名称
CMP ECX, 10; 执行10次
JE SALEINFORMATION; 10次都相同则成立,跳到SALEINFORMATION
MOV AL, BYTE PTR[EBX]
MOV BL, BYTE PTR[ESI]
ADD EBX, 1
ADD ESI, 1
ADD ECX, 1
CMP BL,AL ; 比较字节
JE COMPARE_GOODSNAME_GA1 ; 字节相同循环进行
JNE COMPARE_GOODSNAME_GA2
COMPARE_GOODSNAME_GA2: ;确定是否符合商品1名称
MOV EBX,0
MOV ESI,0
MOV ECX,0
CMP ECX, 10; 执行10次
JE SALEINFORMATION; 10次都相同则成立,跳到SALEINFORMATION
MOV AL, BYTE PTR[EBX]
MOV BL, BYTE PTR[ESI]
ADD EBX, 1
ADD ESI, 1
ADD ECX, 1
CMP BL,AL ; 比较字节
JE COMPARE_GOODSNAME_GA2 ; 字节相同循环进行
JNE COMPARE_GOODSNAME_GA3
COMPARE_GOODSNAME_GA3: ;确定是否符合商品1名称
MOV EBX,0
MOV ESI,0
MOV ECX,0
CMP ECX, 10; 执行10次
JE SALEINFORMATION; 10次都相同则成立,跳到SALEINFORMATION
MOV AL, BYTE PTR[EBX]
MOV BL, BYTE PTR[ESI]
ADD EBX, 1
ADD ESI, 1
ADD ECX, 1
CMP BL,AL ; 比较字节
JE COMPARE_GOODSNAME_GA3 ; 字节相同循环进行
JNE COMPARE_GOODSNAME_GA4
COMPARE_GOODSNAME_GA4: ;确定是否符合商品1名称
MOV EBX,0
MOV ESI,0
MOV ECX,0
CMP ECX, 10; 执行10次
JE SALEINFORMATION; 10次都相同则成立,跳到SALEINFORMATION
MOV AL, BYTE PTR[EBX]
MOV BL, BYTE PTR[ESI]
ADD EBX, 1
ADD ESI, 1
ADD ECX, 1
CMP BL,AL ; 比较字节
JE COMPARE_GOODSNAME_GA4 ; 字节相同循环进行
JNE NOT_FOUND
NOT_FOUND:
invoke printf, offset STRING, addr NOTFOUND; 显登陆失败弹出信息
JMP CUSTOMER_SEARCH_GOODS
SALEINFORMATION:
MOV EDX,DWORD PTR[ESI+2]
invoke printf, offset STRING, addr GOODSNAME
invoke printf, offset STRING, addr input_goodsname
invoke printf, offset STRING, addr GOODSSALE ;销售价的printf
invoke printf, offset BUF, addr DWORD PTR[EDX] ;....
EXIT:
MOV AH,4CH
INT 21H
END START
——————————————————————————————————————分界线————————————————————————————————————————————————
.386
.model flat,stdcall
; ExitProcess 在 kernel32.lib中实现,原型定义如下
ExitProcess PROTO STDCALL : DWORD
includelib kernel32.lib
; printf 在 msvcrt.lib中实现,原型定义如下
includelib msvcrt.lib
printf PROTO C : ptr sbyte, : VARARG
scanf_s PROTO C : ptr sbyte, : VARARG
.DATA
STRING DB "%s",0ah,0dh,0
BUF DB "%d",0
BNAME DB 'ZhangSan',0 ; 老板姓名
BPASS DB 'test',0,0 ; 密码
N EQU 30
GA1 DB 'PEN',4 DUP(0) ; 商品名称
DW 35, 56, 70, 25, ? ;进货价 销售价 进货总数 已售数量 利润率未计算
GA2 DB 'PENCIL',7 DUP(0); 商品名称
DW 2, 3, 80, 40, ? ; 进货价 销售价 进货总数 已售数量 利润率未计算
GA3 DB 'BOOK',5 DUP(0) ; 商品名称
DW 12, 30, 25, 5, ? ; 进货价 销售价 进货总数 已售数量 利润率未计算
GA4 DB 'RULER',6 DUP(0) ; 商品名称
DW 4, 7, 75, 30, ? ; 进货价 销售价 进货总数 已售数量 利润率未计算
KEY DB 0 ;判断是否为老板的标志位
input_name DB "%s",0
input_password DB "%s",0
input_goodsname DB "%s",0
NAMEINPUT DB "PLEASE INPUT THE BOSS NAME :\n"
PASSWORDINPUT DB "PLEASE INPUT THE PASSWORD : \n"
FAIL DB "LOGIN FAILED!TRY AGAIN!\n"
SUCCESS DB "LOGIN SUCCESSFULLY!\n"
GOODSINPUT DB "PLEASE INPUT THE GOOD'S NAME :\n"
NOTFOUND DB "CANNOT FIND THE GOOD!TRY AGAIN!\n"
GOODSNAME DB "THE NAME OF THE GOOD IS:\n" ;商品名
GOODSCOST DB "THE COST OF THE GOOD IS:\n" ;成本价
GOODSSALE DB "THE SALE OF THE GOOD IS:\n" ;销售价
GOODSALLNUMBER DB "THE ALL NUMBER OF THE GOOD IS:\n" ;进货总数
GOODSSOLDNUMBER DB "THE SOLD NUMBER OF THE GOOD IS:\n" ;已售数量
GOODSPROFITRATE DB "THE PROFIT RATE OF THE GOOD IS:\n" ;利润率
.STACK 200
.CODE
START:
LOGIN_INPUTNAME:
MOV KEY,0;登录是否成功标志
invoke printf, offset STRING, addr NAMEINPUT ;输入老板名字
invoke scanf_s, offset STRING, offset input_name
LEA EBX,input_name
CMP BYTE PTR[EBX],0DH
JE CUSTOMER_SEARCH_GOODS;用户输入回车跳过管理员权限获取,成为普通用户
CMP BYTE PTR[EBX], 'q';输入quit退出程序,直接结束
JE EXIT
MOV EDI,OFFSET input_name ; 取输入名字字符串首地址
MOV ESI,OFFSET BNAME; 取用户名首地址
MOV ECX,0 ; 完成
COMPARE_NAME: ; 循环比较名字字符
CMP ECX, 10; 执行10次
JE LOGIN_INPUTPASSWORD; 10次都相同则成立,跳到验证密码
MOV AL, BYTE PTR[EDI]
MOV BL, BYTE PTR[ESI]
ADD EDI, 1
ADD ESI, 1
ADD ECX, 1
CMP BL,AL ; 比较字节
JE COMPARE_NAME; 字节相同循环进行
JNE LOGIN_INPUTNAME; 字节出现不相同,跳到登录页面
LOGIN_INPUTPASSWORD: ; 验证密码
invoke printf, offset STRING, addr PASSWORDINPUT; 显示输入密码
invoke scanf_s, offset STRING, offset input_password
MOV EDI+10,OFFSET input_password; 取输入密码字符串首地址
MOV ESI+10,OFFSET BPASS; 取密码首地址
MOV ECX+10, 0
COMPARE_PASSWORD: ; 循环比较密码字符
CMP ECX+10, 6; 执行6次
JE LOGIN_SUCCESSFULLY; 6次都相同则成立,跳到登陆成功
MOV AL, BYTE PTR[EDI+10]
MOV BL, BYTE PTR[ESI+10]; 比较字节
ADD EDI+10,1
ADD ESI+10,1
ADD ECX+10,1
CMP BL,AL
JE COMPARE_PASSWORD; 字节相同循环进行
JNE LOGIN_FAILURE; 字节出现不相同,跳到登录失败
LOGIN_SUCCESSFULLY: ;登录成功
MOV KEY,1;登录状态为1成功获取权限显示全部信息
invoke printf, offset STRING, addr SUCCESS; 显示登录成功
JMP BOSS_SEARCH_GOODS
LOGIN_FAILURE: ;登陆失败
invoke printf, offset STRING, addr FAIL; 显登陆失败弹出信息
JMP LOGIN_INPUTNAME
BOSS_SEARCH_GOODS: ;老板查询商品
MOV EDI,0
MOV EBX,0
MOV ESI,0
MOV ECX,0
MOV ESI,OFFSET GA1
invoke printf, offset STRING, addr GOODSNAME
invoke printf, offset STRING, addr DWORD PTR[ESI]
MOV EBX,ESI+10 ;GA1 成本价
invoke printf, offset STRING, addr GOODSCOST
invoke printf, offset BUF, addr DWORD PTR[EBX]
MOV EAX,ESI+12 ;GA1 销售价
invoke printf, offset STRING, addr GOODSSALE
invoke printf, offset BUF, addr DWORD PTR[EAX]
MOV EDI,ESI+14 ;GA1 进货数量
invoke printf, offset STRING, addr GOODSALLNUMBER
invoke printf, offset BUF, addr DWORD PTR[EDI]
MOV ECX,ESI+16 ;GA1 已售数量
invoke printf, offset STRING, addr GOODSSOLDNUMBER
invoke printf, offset BUF,addr DWORD PTR[ECX]
IMUL EAX,ECX ;销售价乘以已售数量
IMUL EBX,EDI ;成本价乘以进货数量
SUB EAX,EBX ;销售总额减去成本总价
IMUL EAX,100 ;乘以100
IDIV EBX
invoke printf, offset STRING, addr GOODSPROFITRATE
invoke printf, offset BUF, addr DWORD PTR[EAX]
CUSTOMER_SEARCH_GOODS: ;顾客查询商品
MOV EDI,0
MOV EBX,0
MOV ESI,0
MOV ECX,0
invoke printf, offset STRING, addr GOODSINPUT
invoke scanf_s, offset STRING, offset input_goodsname
LEA EBX,input_goodsname
CMP BYTE PTR[EBX], 'q';输入quit退出程序,直接结束
JE EXIT
MOV ESI,OFFSET GA1; 取商品名字首地址
JMP COMPARE_GOODSNAME_GA1
COMPARE_GOODSNAME_GA1: ;确定是否符合商品1名称
CMP ECX, 10; 执行10次
JE SALEINFORMATION; 10次都相同则成立,跳到SALEINFORMATION
MOV AL, BYTE PTR[EBX]
MOV BL, BYTE PTR[ESI]
ADD EBX, 1
ADD ESI, 1
ADD ECX, 1
CMP BL,AL ; 比较字节
JE COMPARE_GOODSNAME_GA1 ; 字节相同循环进行
JNE COMPARE_GOODSNAME_GA2
COMPARE_GOODSNAME_GA2: ;确定是否符合商品1名称
MOV EBX,0
MOV ESI,0
MOV ECX,0
CMP ECX, 10; 执行10次
JE SALEINFORMATION; 10次都相同则成立,跳到SALEINFORMATION
MOV AL, BYTE PTR[EBX]
MOV BL, BYTE PTR[ESI]
ADD EBX, 1
ADD ESI, 1
ADD ECX, 1
CMP BL,AL ; 比较字节
JE COMPARE_GOODSNAME_GA2 ; 字节相同循环进行
JNE COMPARE_GOODSNAME_GA3
COMPARE_GOODSNAME_GA3: ;确定是否符合商品1名称
MOV EBX,0
MOV ESI,0
MOV ECX,0
CMP ECX, 10; 执行10次
JE SALEINFORMATION; 10次都相同则成立,跳到SALEINFORMATION
MOV AL, BYTE PTR[EBX]
MOV BL, BYTE PTR[ESI]
ADD EBX, 1
ADD ESI, 1
ADD ECX, 1
CMP BL,AL ; 比较字节
JE COMPARE_GOODSNAME_GA3 ; 字节相同循环进行
JNE COMPARE_GOODSNAME_GA4
COMPARE_GOODSNAME_GA4: ;确定是否符合商品1名称
MOV EBX,0
MOV ESI,0
MOV ECX,0
CMP ECX, 10; 执行10次
JE SALEINFORMATION; 10次都相同则成立,跳到SALEINFORMATION
MOV AL, BYTE PTR[EBX]
MOV BL, BYTE PTR[ESI]
ADD EBX, 1
ADD ESI, 1
ADD ECX, 1
CMP BL,AL ; 比较字节
JE COMPARE_GOODSNAME_GA4 ; 字节相同循环进行
JNE NOT_FOUND
NOT_FOUND:
invoke printf, offset STRING, addr NOTFOUND; 显登陆失败弹出信息
JMP CUSTOMER_SEARCH_GOODS
SALEINFORMATION:
MOV EDX,WORD PTR[ESI+2]
invoke printf, offset STRING, addr GOODSNAME
invoke printf, offset STRING, addr input_goodsname
invoke printf, offset STRING, addr GOODSSALE ;销售价的printf
invoke printf, offset BUF, addr DWORD PTR[EDX] ;....
EXIT:
MOV AH,4CH
INT 21H
CODE ENDS
END START
两个错误为:
error MSB3721: 命令“ml.exe /c /nologo /Zi /Fo"Debug\text_1.obj" /W3 /errorReport:prompt /Tatext_1.asm”已退出,返回代码为 1。
error A1010: unmatched block nesting : CODES
[此贴子已经被作者于2018-10-17 17:08编辑过]