求注释下这个简单的汇编程序?高分求解100分

[复制链接]
查看11 | 回复7 | 2021-1-27 06:05:17 | 显示全部楼层 |阅读模式
网下载个程序,看懂一些,还有些看不懂,希望大神门帮帮忙,注释下,只注释有颜色那部分就可以啦程序不大。有颜色那部分就是我看不懂的代码,不多谢谢啦尽量多点注释,新菜,刚学不久,求帮忙。
DATASEGMENT
BUFDB10DUP(0)
STRING1DB'Pleaseenterthescore'
NUMBERDB31H,':','$'
STRING2DB0AH,'Therangedscoresare:','$'
STRING3DB'Afterremovingthehighestandlowestscore,theaveragescoreis:','$'
ERRORDB'ERROR',0AH,0DH,'$'
DATAENDS
CODESEGMENT
ASSUMECS:CODE,DS:DATA
START:MOVAX,DATA
MOVDS,AX
XORSI,SI;SI置0
MOVCX,9;9个数
INPUT:
LEADX,STRING1
MOVAH,9
INT21H
MOVAH,1
INT21H;输入得分的十位到AL
CMPAL,'0'
JBER;AL1则跳到ER
SUBAL,30H
MOVDL,10
MULDL;十位乘以10
MOVDX,AX;DX存十位数
MOVAH,1
INT21H;输入得分的个位到AL
CMPAL,'0'
JBER;AL10则跳到ER
SUBAL,30H
ADDAL,DL;个位十位相加到AL
MOVBUF[SI],AL
INCSI
INCNUMBERMOVDL,0AH;换行
MOVAH,2
INT21H
MOVDL,0DH;回车
INT21H
LOOPINPUT;循环输入9次
JMPRANGE_0;转入排序
ER:
;输入错误后返回重新输入
LEADX,ERROR
MOVAH,9
INT21H
JMPINPUT
RANGE_0:
MOVBX,1
MOVCX,9
XORDI,DI
RANGE:MOVAL,BUF[DI]
CMPAL,BUF[DI+1]
JAENEXT_1
XCHGBUF[DI+1],AL
MOVBUF[DI],AL
MOVBX,0
NEXT_1:INCDI
LOOPRANGE
CMPBX,0
JERANGE_0;冒泡法排列得分
LEADX,STRING2
MOVAH,9
INT21H
MOVCX,9
XORSI,SI;SI清零
MOVAH,2
RANGE_OUTPUT:
;输出排序后的得分
MOVDL,BUF[SI]
ADDDL,30H
CMPDL,39H;判断是否是10分
JATENS_1
JBETENS_0
TENS_1:
;十位数为1,则输出'10'
MOVBX,1
MOVDL,'1'
INT21H
MOVDL,'0'
INT21H
INCSI
MOVDL,','
INT21H
JMPNEXT_2
TENS_0:
;十位数为0,则按原得分输出
INT21H
INCSI
MOVDL,','
INT21H
NEXT_2:
LOOPRANGE_OUTPUT
MOVAH,2
MOVDL,0AH;换行
INT21H
MOVDL,0AH;换行
INT21H
MOVDL,0DH;回车
INT21H
LEADX,STRING3
MOVAH,9H
INT21H
MOVCX,7;累加中间7个数字
XORAX,AX
DECSI
SUM:
;求7个分数的和
DECSI
ADDAL,BUF[SI]
LOOPSUM
CMPAL,46H
JAEFULL_MARK
JMPN_FULL_MARK
FULL_MARK:
;满分时
MOVAH,2H
MOVDL,'1'
INT21H
MOVDL,'0'
INT21H
MOVDL,'.'
INT21H
MOVDL,'0'
INT21H
MOVDL,'0'
INT21H
JMPENDING
N_FULL_MARK:
;非满分时
MOVCX,2
MOVBH,1;小数点只出现1次
DIVISION:
MOVBL,7
DIVBL;除以7
PUSHAX
ADDAL,30H
MOVDL,AL
MOVAH,2
INT21H
CMPBH,0
JEDOT
MOVDL,'.'
MOVBX,0
DOT:INT21H
POPAX
MOVAL,AH;余数存入AL
MOVDL,10
MULDL;余数乘以10?结果存入AXLOOPDIVISION
ENDING:
MOVAH,02
MOVBH,0
MOVDX,0C46H
INT10H;设置光标位置
MOVAH,1
INT21H
CODEENDS
ENDSTART

分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:05:17 | 显示全部楼层
MOVBUF[SI],AL;把AL保存起来
INCSI;SI作为指针,所以SI要加1
INCNUMBERMOVDL,0AH;换行

回复

使用道具 举报

千问 | 2021-1-27 06:05:17 | 显示全部楼层
RANGE:MOVAL,BUF[DI];取一个字节送入AL
CMPAL,BUF[DI+1];然后进行比较
JAENEXT_1;高于等于则跳转
XCHGBUF[DI+1],AL;否则交换一下数据
MOVBUF[DI],AL;取AL一个字节送入内存中.
MOVBX,0;
NEXT_1:INCDI;给DI加1
LOOPRANGE;继续循环
CMPBX,0;
JERANGE_0;冒泡法排列得
回复

使用道具 举报

千问 | 2021-1-27 06:05:17 | 显示全部楼层
谢谢啦不过还有它那个INCNUMBER用来干什么里面定义了个31H是有什么用???不懂,可以指点下吗引用1楼的回复:MOVBUF[SI],AL;把AL保存起来
INCSI;SI作为指针,所以SI要加1
INCNUMBERMOVDL,0AH;换行

回复

使用道具 举报

千问 | 2021-1-27 06:05:17 | 显示全部楼层
引用3楼的回复:谢谢啦不过还有它那个INCNUMBER用来干什么里面定义了个31H是有什么用???不懂,可以指点下吗
引用1楼的回复:
MOVBUF[SI],AL;把AL保存起来
INCSI;SI作为指针,所以SI要加1
INCNUMBERMOVDL,0AH;换行

是数字
31H="1"
运行起来应该会
1:
2:
3:
...
...
...
回复

使用道具 举报

千问 | 2021-1-27 06:05:17 | 显示全部楼层
十六位的程序,用debug跟踪一下。
回复

使用道具 举报

千问 | 2021-1-27 06:05:17 | 显示全部楼层
谢谢啦,不过我还有点不太懂,它前面设置的BX赋值为1,后面又改了变成0,它这两行代码用来作什么的,还有我理解那个冒泡的算法是这样理解的,举个例子,输入的数是123456789然后是不是第一次循环就求出最大的数在第一个位置,也就是变成9123455678那比较次数不是比较8次就可以吗,为什么它前面设置的CX=9次。能否举个例子说明下,我真心卡在这里看不懂,谢谢啦引用2楼的回复:RANGE:MOVAL,BUF[DI];取一个字节送入AL
CMPAL,BUF[DI+1];然后进行比较
JAENEXT_1;高于等于则跳转
XCHGBUF[DI+1],AL;否则交换一下数据
MOVBUF[DI],AL;取AL一个字节送入内存中.
MOVBX,0;
NEXT_1:INCDI;给DI加1
LOOPRANGE;继续循环
CMPBX……

回复

使用道具 举报

千问 | 2021-1-27 06:05:17 | 显示全部楼层
继续顶起来
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行