主题:初学者,请大家帮忙解决问题
hsqmale
[专家分:0] 发布于 2006-04-11 10:31:00
有三个单字节无符号数存放在BUFFER开始的缓冲区中,将这三个数按从大到小排序。
第一步:将原来由程序给定的三个单字节无符号数改成由用户从键盘输入三个一位数字,仍按从大到小排序
(提示:由用户从键盘输入一位数的方法可参考课本例5.2)
将第一步的结果生成一个.asm文件和一个.exe文件
第二步:在第一步的基础上改进:
用户每输入一位数前屏幕显示:
Enter the first value(0-9): _
Enter the second value(0-9): _
Enter the third value(0-9): _
排完序后,显示如下
After sorting...
Num1= _
Num2= _
Num3= _
将第二步的结果同样生成一个.asm文件和一个.exe文件
回复列表 (共2个回复)
沙发
p1s [专家分:4100] 发布于 2006-04-11 12:31:00
朋友,你自己写的代码有么?
总不见的让别人代你做作业咯?
板凳
carefreescan [专家分:90] 发布于 2006-04-12 00:44:00
由于时间关系没写完
前面完成了一半,也没时间写注释了
前面的如果能看懂的话,我想后面的你自己写应该没问题的
不能老靠别人啊,代码贴在下面了 自己看吧。
再一个那汇编写这东西,真的没什么长处,就一个字麻烦
DATA SEGMENT
BUF DB 3 DUP(?)
SENT1 DB 'Enter the first value(0-9): '
SENT2 DB 'Enter the second value(0-9):'
SENT3 DB 'Enter the third value(0-9): '
CNT1 EQU $-SENT3
SENT4 DB 'Num1='
SENT5 DB 'Num2='
SENT6 DB 'Num3='
CNT2 EQU $-SENT6
SENT7 DB 'After sorting...'
CNT3 EQU $-SENT7
SENT8 DB 'OUT OF 0-9, Enter again!'
CNT4 EQU $-SENT8
FLAG1 DB 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
MAIN PROC FAR
START:
MOV AX,DATA
MOV DS,AX
CALL BEGI
MOV AH,4CH
INT 21H
MAIN ENDP
;________________________
;BEGI子程序:主要用于用户输入3个数据,包含信息提示与出错信息
;无入口参数
;SI为提示信息地址,DI为存储输入数据的地址,CX为循环次数
;本过程的LP1循环体调用DISP1用来显示提示信息,调用IN_PUT来提供用户输入
;并且利用FLAG1来检测输入数据是否有效,如果无效则跳转本次重新输入
;循环体内,DI和SI相应的变化
;________________________
BEGI PROC NEAR
MOV SI,OFFSET SENT1
MOV DI,OFFSET BUF
MOV CX,3
PUSH BX
MOV BL,1
LP1:
PUSH CX
MOV CX,CNT1
RET_ER: CALL DISP1
CALL IN_PUT
CMP BL,FLAG1
JE RET_ER
ADD SI,CNT1
INC DI
POP CX
LOOP LP1
POP BX
RET
BEGI ENDP
;_______________________
;DISP1子程序
;入口参数:显示字符串首地址(SI),串长(CX)
;使用寄存器:AX,DX,SI,CX(用前入栈)
;该过程属于通用过程
;该过程应注意SI与CX入栈,此过程被多次调用,防止信息乱套
;*********
DISP1 PROC NEAR
PUSH AX
PUSH DX
PUSH SI
PUSH CX
MOV AH,2
LP2:
MOV DL,[SI]
INT 21H
INC SI
LOOP LP2
POP CX
POP SI
POP DX
POP AX
RET
DISP1 ENDP
;_______________
;IN_PUT子程序
;入口参数:无
;出口参数:FLAG1
;使用寄存器:AX,DI(用前入栈)
;该过程主要用于输入一个字符并存于BUF存储区,如果非阿拉伯数字
;设置FLAG1为1,返回后用于提供出错信息,如果属于阿拉伯数字进行存储
;并且需要设置FLAG1为0
;_______________
IN_PUT PROC NEAR
PUSH AX
PUSH DI
MOV AH,1
INT 21H
SUB AL,30H
CMP AL,0
JB SET_FG
CMP AL,9
JNBE SET_FG
JMP RIGHT
SET_FG:
CALL IN_ERRO
MOV AH,1
MOV FLAG1,AH
JMP EXIT1
RIGHT: MOV [DI],AL
CALL CR_LF
MOV AH,0
MOV FLAG1,AH
EXIT1: POP DI
POP AX
RET
IN_PUT ENDP
;___________________
;IN_ERRO出错提示信息
;调用DISP1通用函数
;无参数
;__________________
IN_ERRO PROC NEAR
PUSH SI
PUSH CX
MOV SI,OFFSET SENT8
MOV CX,CNT4
CALL CR_LF
CALL DISP1
CALL CR_LF
POP CX
POP SI
RET
IN_ERRO ENDP
;___________________
;CR_LF换行回车子程序
;无参数,通用过程
;___________________
CR_LF PROC NEAR
PUSH AX
PUSH DX
MOV AH,2
MOV DL,0AH
INT 21H
MOV DL,0DH
INT 21H
POP DX
POP AX
RET
CR_LF ENDP
CODE ENDS
END START
我来回复