DATA SEGMENT
STRING1 DB 'Please Input Score:','$' ;提示输入
STRING2 DB 'The Order From MAX To MIN:','$'
;输出排序从大到小
SCORE DW 60 DUP(0) ;分配存放空间
S5 DW 0 ;定义变量
S6 DW 0
S7 DW 0
S8 DW 0
S9 DW 0
S10 DW 0
DATA ENDS
STACK SEGMENT ;堆栈段
DW 64 DUP(0)
STACK ENDS
CODE SEGMENT ;代码段
ASSUME CS:CODE,DS:DATA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
MOV DX,OFFSET STRING1 ;显示提示输入
MOV AH,09H
INT 21H
XOR BX,BX ;寄存器清零
XOR CX,CX
XOR SI,SI
XOR DI,DI
INPUT: MOV AH,1 ;输入一个字符
INT 21H
CMP AL,0DH ;是否为回车键
JZ OVER ;是就跳到OVER
CMP AL,20H ;是否为空格
JZ SAVE ;是就跳到SAVE
SUB AL,30H ;变为真数
MOV CL,4
SHL BX,CL ;左移四位,变为BCD码
ADD BL,AL
JMP INPUT
SAVE: MOV SCORE[SI],BX ;保存到SCORE中
ADD SI,2
INC DI
XOR BX,BX
JMP INPUT
OVER: MOV SCORE[SI],BX ;保存最后一个数据,并存放到SCORE中
INC DI
MOV DL,0AH
MOV AH,02H
INT 21H
MOV CX,DI
DEC CX
XOR BX,BX
COMP1: MOV SI,2 ;指向下一个数
MOV DX,CX
COMP2: MOV AX,SCORE[BX]
CMP AX,SCORE[BX+SI] ;比较前后两个数
JNC COMP3 ;小于就跳到COMP3
XCHG AX,SCORE[BX+SI] ;交换位置
MOV SCORE[BX],AX
COMP3: ADD SI,2 ;指向下一个数
DEC DX
JNZ COMP2
ADD BX,2 ;指向下一个数
LOOP COMP1
MOV DX,OFFSET STRING2
MOV AH,09H
INT 21H
SUB SI,SI ;把SI清零
OUT_PUT1:
MOV BX,SCORE[SI] ;输出百位数
MOV DL,BH
AND DL,0FH
ADD DL,30H
MOV AH,02H
INT 21H
MOV DL,BL ;输出十位数
MOV CL,4
SHR DL,CL
ADD DL,30H
MOV AH,02H
INT 21H
MOV DL,BL ;输出个位数
AND DL,0FH
ADD DL,30H
MOV AH,02H
INT 21H
MOV DL,20H ;输出空格
MOV AH,02H
INT 21H
ADD SI,2
DEC DI
OUT_PUT2:MOV BX,SCORE[SI] ;输出十位数
MOV DL,BL
MOV CL,4
SHR DL,CL
ADD DL,30H
MOV AH,02H
INT 21H
MOV DL,BL ;输出个位数
AND DL,0FH
ADD DL,30H
MOV AH,02H
INT 21H
MOV DL,20H ;输出空格
MOV AH,02H
INT 21H
ADD SI,2
DEC DI
JNZ OUT_PUT2
MOV CX,10 ;设置计数器为10
MOV BX,OFFSET SCORE
COMPARE: MOV AX,[BX]
CMP AX,60 ;与60比较
JL FIVE ;小于就跳到FIVE
CMP AX,70 ;与70比较
JL SIX ;小于就跳到SIX
CMP AX,80 ;与80比较
JL SEVEN ;小于就跳到SEVEN
CMP AX,90 ;与90比较
JL EIGHT ;小于就跳到EIGHT
CMP AX,100 ;与100比较
JNE NINE ;不为0就是90到99
INC S10 ;100时S10+1
JMP NEWDATA ;跳到NEWDATA
FIVE: INC S5 ;小于60时S5+1
JMP NEWDATA ;跳到NEWDATA
SIX: INC S6 ;大于等于60小于70时S6+1
JMP NEWDATA ;跳到NEWDATA
SEVEN: INC S7 ;大于等于70小于80时S7+1
JMP NEWDATA ;跳到NEWDATA
EIGHT: INC S8 ;大于等于80小于90时S8+1
JMP NEWDATA ;跳到NEWDATA
NINE: INC S9 ;大于等于90小于100时S9+1
NEWDATA: ADD BX,2 ;取下个数
LOOP COMPARE ;循环COMPARE
MOV AH,4CH ;返回DOS
INT 21H
CODE ENDS
END START
下面代码按字节变量写的,如果是字变量可以自己改一下:
data segment
x db 4h
w db 9h
z db 18h
data ends
code segment
assume ds:data,cs:code
start:
mov ax,date
mov ds,ax
mov al,x
cmp al,0
jg next
mov bl,5
imul bl
mov z,al
jmp tj
next:
mov al,w
cbw
mov bl,8
idiv bl
sub x,al
mov al,x
mov z,al
tj:
mov ax,4c00h
int 21h
code ends
end start
这个问题碰到好多人提问了。
关键是你用到的t命令影响了栈。
t是单步调试命令,当使用单步调试时,实际产生了单步中断。CPU会自动把一些值存放到栈中,这样实际上就会把你在程序里压入栈的值给覆盖掉。
你注意看最后一次的r输出,2000:0eh = 3123h,这个结果是正确的,就是你第一次压入到栈里的ax。而2000:08h = 010fh,2000:0ah = 073fh,而073fh:010fh就是push ax这条指令的地址。CPU在你用t命令单步调试的时候,自动做了一些压栈 *** 作。
所以,如果你用t命令调试程序,建议你把sp设置大点。比如mov sp, 100h
另外,由于栈是向下生长的,而单步调试时CPU又会把一些标志放到栈里,所以栈的小地址里的内容,是不确定的,你就不要纠结从0开始的这部分内存了。只关注SP那一块的内容就行了。
1、 push ds:[0] ;0123h进栈
push ds:[2] ;0456h进栈
pop ds:[2] ;0456h出栈送到了ds:2处
pop ds:[0] ;0123h出栈送到了ds:0处
所以顺序并没有发生改变。
2、由于stake和data段中各定义了两个字型数据,不大于16字节,所以三个段的段地址相差1。
汇编语言程序设计的基本步骤 了解了汇编语言指令的功能和用法,了解了汇编语言程序的编写格式,就可以编制完整的汇编语言程序了。一个程序通常具有顺序、分支、循环和子程序4种结构形式。顺序程序结构就是指完全按顺序逐条执行的指令序列。在程序设计过程中,顺序结构大量存在,屡见不鲜。但一个完整的程序只是逐条去执行指令,这非常少见。常见的程序结构,是上述4种结构的混合体。一般来说,编制一个汇编语言程序的步骤如下:(1) 分析题意,确定算法或算法思想。算法是指解决问题的方法和步骤。比如现有的一些计算方法和日常生活中解决问题的逻辑思维推理方法等。(2) 根据算法画出流程图,简单的情况也可不画。画出描述算法的流程图,可以首先从图上检验算法的正确性,减少出错的可能,使得动手编写程序时的思路更加清晰。(3) 分配存储空间和工作单元,合理地使用寄存器。分配存储空间和工作单元,是指存储空间的分段和数据定义。另外,由于寄存器的数量有限,编写程序时经常会感到寄存器不够用。因此,对于字节数据,要尽量使用8位寄存器。而采用适当的寻址方式,也会达到节省寄存器的目的。(4) 根据流程图编写程序。这是编制汇编语言程序最为重要的一步。算法里规定的功能,是要通过一条条指令描述出来的。为了提高编程能力,对于初学者,一是要多阅读现有的程序,以学习别人的编程经验;而更为重要的是,必须多亲自动手编写,不要怕失败,只有通过无数次失败,才能从中积累自己的编程经验。(5) 上机调试运行程序。通过汇编的源程序,只能说明它里面不存在语法错误。但是它是否能达到算法所要求的预期效果,还必须经过上机调试,用一些实验数据来测试,才能够真正地得出结论。可以这么说,即使是一个非常有经验的程序员,也没有百分之百的把握说他编写的程序一次就成功。 用流程图表示算法 流程图用一些图形框来代表各种 *** 作。用图形表示算法,直观形象,可以用来帮助人们对算法的理解。下图给出了一些常用的流程图符号。
上图中的判断框(菱形)用来对一个给定的条件作出判断,以决定如何执行其后的 *** 作。它有一个入口,两个出口,如下图(a)所示。
连接点(圆圈)是用来将画在不同地方的流程线连接起来。例如在下图(b)里,有两个圈里写着数字1的圆圈,它表示是从左边的1出来,进到右边图的1里(这由流程线的方向给出)。可以看出,这两个点其实就是同一个点,只是由于画不下而分开来画的。用连接点,可以避免流程图中的流程线相互交叉或过长,从而使流程图清晰。
注释框不是流程图中必需的部分。在流程图中使用它,是为了对流程图中的某些框的 *** 作做一些必要的说明,以便使人们能够更好地通过流程图来理解算法。
处理框反映做些什么样的 *** 作,如把某个单元的内容送入某个寄存器,从某个存储单元取出数据等。它是流程图里最为本质的、出现最多的图形框。
输入/输出框反映程序的输入和输出情况。计算机程序无外乎接收数据,进行处理,然后加以输出,所以输入/输出框是必不可少的。
;
MOV Y, -1
MOV AL, X
SUB AL, 0
JZ ZZZ
SUB AL, 128
JNB EXIT
INC Y
ZZZ:
INC Y
EXIT:
END
所给程序中的错误,都已经改正,可以正常工作了。
DSEG SEGMENT
BINVAL DW 12345
ASCVAL DB 5 DUP(20), '$'
DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG
START:
MOV AX, DSEG
MOV DS, AX
MOV AX, BINVAL
MOV SI, OFFSET ASCVAL + 4
MOV CX, 10
AGAIN:
CMP AX, 10
JB DONE
CWD
DIV CX
OR DL, 30H
MOV [SI], DL
DEC SI
JMP AGAIN
DONE:
OR AL, 30H
MOV [SI], AL
LEA DX, ASCVAL
MOV AH, 9
INT 21H
MOV AH, 4CH
INT 21H
CSEG ENDS
END START
自己对照一下,看看进行了什么修改。
以上就是关于用汇编语言实现学生成绩统计分析全部的内容,包括:用汇编语言实现学生成绩统计分析、汇编语言,分支程序设计,如果x>0,Z=X-W/8,否则,Z=X*5、王爽汇编语言 实验2实验任务2 希望有人解答下啊!!!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)