汇编程序设计的问题(高手请进)
在以BUF为首址的字存储区中存放有N个有符号数,如(12,-5,4,-3,8,-9)现需将它们按大到小的顺序排列在BUF存储区中,并在屏幕上将排好序了的BUF显示出来,试...
在以BUF为首址的字存储区中存放有N个有符号数,如(12,-5,4,-3,8,-9)现需将它们按大到小的顺序排列在BUF存储区中,并在屏幕上将排好序了的BUF显示出来,试编写其程序。要求:
i 要写出编程的思路,最好在关键步骤上标注解释;
ii在程序中使用标志位进行程序的优化;
iii确定最后能通过编译的,并且能正确显示BUF中的数字,包括正负数。
谢谢各位大侠呀! 展开
i 要写出编程的思路,最好在关键步骤上标注解释;
ii在程序中使用标志位进行程序的优化;
iii确定最后能通过编译的,并且能正确显示BUF中的数字,包括正负数。
谢谢各位大侠呀! 展开
展开全部
思路:
1. 排序一般用冒泡排序。也可以研究其他效率更高的排序算法。
2. 将排好序的数据显示出来,是十进制有符号输出吗?如果是这样的话,要首先判断是否负数(看最高位是否是1)。如果是负数则先显示负号,然后对该数减1取反(取绝对值),然后显示这个数;如果是正数就没那么麻烦,直接显示就可以了。这里主要是把有符号数转换为(【负号】+无符号数)的形式,这样才便于输出。
3. 在上面讲到的关于数字的十进制显示,因为数据已二进制保存在计算机中,这里要涉及到二进制到十进制的转换,并且还要把十进制数再转换为字符串。例如这个流程1111->15->'15',注意这里的15和'15'不同。
4. 要解决二进制到十进制转换,需要用到除以10取模的方法,依次得到该数对应的个位、十位、百位、。。。上的值,然后每个值都加上30H记得到对应字符,然后倒序输出。因为是要倒序输出,所以我喜欢用栈来保存我模10后的结果。
网上等不到你人,代码我粘这啦
;输入20个数
;从大到小排序
;输出20个数
DATAS SEGMENT
;此处输入数据段代码
MESS1 DB 'Input 20 numbers:','$' ;提示输入
MESS2 DB 'Numbers after sorted:','$' ;提示输出
MESS3 DB 'ERROR!Input again!','$' ;提示错误
SEPR DB 0DH,0AH,'$' ;分隔符
N EQU 20 ;N个数
NUM DW N DUP (?)
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
DW 40H DUP (?)
TOP LABEL WORD
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,ES:DATAS,SS:STACKS
MAIN PROC FAR
START:
MOV AX,DATAS
MOV DS,AX
MOV ES,AX
MOV AX,STACKS
MOV SS,AX
LEA SP,TOP
;此处输入代码段代码
MOV AH,9
LEA DX,MESS1
INT 21H
LEA DX,SEPR
INT 21H
MOV CX,LENGTH NUM
LEA DI,NUM
CLD
L1:
CALL INPUT ;输入一个十进制有符号数
;LEA DX,SEPR
;MOV AH,9
;INT 21H ;输出分隔符
;
;MOV DL,' '
;MOV AH,6
;INT 21H
LOOP L1
MOV CX,LENGTH NUM
DEC CX
LEA SI,NUM
CLD
L2:
CALL SORT ;冒泡排序,按从大到小排序
LOOP L2
LEA DX,SEPR
MOV AH,9
INT 21H ;输出分隔符
MOV AH,9
LEA DX,MESS2
INT 21H
LEA DX,SEPR
MOV AH,9
INT 21H ;输出分隔符
MOV CX,LENGTH NUM
LEA SI,NUM
CLD
L3:
;LEA DX,SEPR
;MOV AH,9
;INT 21H ;输出分隔符
CALL OUTPUT ;输出一个十进制有符号数
MOV DL,' '
MOV AH,6
INT 21H
LOOP L3
MOV AH,4CH
INT 21H
MAIN ENDP
;传入参数:CX,比较次数;SI,数组起始位置;数组
;返回值:数组
;功能:将最小的数移到数组末尾
SORT PROC NEAR
PUSH CX
PUSH SI
L4:
LODSW
CMP AX,[SI]
JNL L5
XCHG AX,[SI]
MOV [SI-2],AX
L5:
LOOP L4
POP SI
POP CX
RET
SORT ENDP
;传入参数:DI,数字存储位置
;返回值:数组
;功能:输入一个-32768~32767之间的十进制有符号数,存储在数组对应位置上
INPUT PROC NEAR
PUSH SI
PUSH DX
MOV SI,10 ;进制数
XOR DX,DX ;符号位
L6:
XOR BX,BX ;最终的数字
MOV AH,1
INT 21H
CMP AL,'-'
JNE L8
INC DX
L7:
MOV AH,1
INT 21H
CMP AL,' ' ;输入一个空格或者回车则输入结束
JE L10
CMP AL,0DH
JE L9
L8:
CMP AL,'0'
JB L0
CMP AL,'9'
JA L0 ;非数字,则重新输入
AND AX,0FH
XCHG AX,BX
MUL SI
JC L0 ;乘法溢出,则重新输入
ADD BX,AX
JC L0 ;加法溢出,则重新输入
JMP SHORT L7
L9:
MOV DL,0AH
MOV AH,2
INT 21H
L10:
CMP DX,0
JE L11
NEG BX ;求补码
L11:
MOV AX,BX
STOSW
POP DX
POP SI
RET
L0:
;异常处理
MOV AH,9
LEA DX,SEPR
INT 21H
LEA DX,MESS3
INT 21H
LEA DX,SEPR
INT 21H
JMP SHORT L6
INPUT ENDP
;传入参数:SI,数字存储位置
;返回值:数组
;功能:从存储位置上取出一个数,以十进制有符号数输出
OUTPUT PROC NEAR
PUSH CX
PUSH DI
MOV DI,10
XOR CX,CX
LODSW
MOV BX,AX
TEST BX,8000H
JZ L12
MOV DL,'-'
MOV AH,2
INT 21H
DEC BX
NOT BX
L12:
MOV AX,BX
L13:
XOR DX,DX
DIV DI
ADD DX,30H
PUSH DX
INC CX
CMP AX,0
JNE L13
MOV AH,2
L14:
POP DX
INT 21H
LOOP L14
POP DI
POP CX
RET
OUTPUT ENDP
CODES ENDS
END START
1. 排序一般用冒泡排序。也可以研究其他效率更高的排序算法。
2. 将排好序的数据显示出来,是十进制有符号输出吗?如果是这样的话,要首先判断是否负数(看最高位是否是1)。如果是负数则先显示负号,然后对该数减1取反(取绝对值),然后显示这个数;如果是正数就没那么麻烦,直接显示就可以了。这里主要是把有符号数转换为(【负号】+无符号数)的形式,这样才便于输出。
3. 在上面讲到的关于数字的十进制显示,因为数据已二进制保存在计算机中,这里要涉及到二进制到十进制的转换,并且还要把十进制数再转换为字符串。例如这个流程1111->15->'15',注意这里的15和'15'不同。
4. 要解决二进制到十进制转换,需要用到除以10取模的方法,依次得到该数对应的个位、十位、百位、。。。上的值,然后每个值都加上30H记得到对应字符,然后倒序输出。因为是要倒序输出,所以我喜欢用栈来保存我模10后的结果。
网上等不到你人,代码我粘这啦
;输入20个数
;从大到小排序
;输出20个数
DATAS SEGMENT
;此处输入数据段代码
MESS1 DB 'Input 20 numbers:','$' ;提示输入
MESS2 DB 'Numbers after sorted:','$' ;提示输出
MESS3 DB 'ERROR!Input again!','$' ;提示错误
SEPR DB 0DH,0AH,'$' ;分隔符
N EQU 20 ;N个数
NUM DW N DUP (?)
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
DW 40H DUP (?)
TOP LABEL WORD
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,ES:DATAS,SS:STACKS
MAIN PROC FAR
START:
MOV AX,DATAS
MOV DS,AX
MOV ES,AX
MOV AX,STACKS
MOV SS,AX
LEA SP,TOP
;此处输入代码段代码
MOV AH,9
LEA DX,MESS1
INT 21H
LEA DX,SEPR
INT 21H
MOV CX,LENGTH NUM
LEA DI,NUM
CLD
L1:
CALL INPUT ;输入一个十进制有符号数
;LEA DX,SEPR
;MOV AH,9
;INT 21H ;输出分隔符
;
;MOV DL,' '
;MOV AH,6
;INT 21H
LOOP L1
MOV CX,LENGTH NUM
DEC CX
LEA SI,NUM
CLD
L2:
CALL SORT ;冒泡排序,按从大到小排序
LOOP L2
LEA DX,SEPR
MOV AH,9
INT 21H ;输出分隔符
MOV AH,9
LEA DX,MESS2
INT 21H
LEA DX,SEPR
MOV AH,9
INT 21H ;输出分隔符
MOV CX,LENGTH NUM
LEA SI,NUM
CLD
L3:
;LEA DX,SEPR
;MOV AH,9
;INT 21H ;输出分隔符
CALL OUTPUT ;输出一个十进制有符号数
MOV DL,' '
MOV AH,6
INT 21H
LOOP L3
MOV AH,4CH
INT 21H
MAIN ENDP
;传入参数:CX,比较次数;SI,数组起始位置;数组
;返回值:数组
;功能:将最小的数移到数组末尾
SORT PROC NEAR
PUSH CX
PUSH SI
L4:
LODSW
CMP AX,[SI]
JNL L5
XCHG AX,[SI]
MOV [SI-2],AX
L5:
LOOP L4
POP SI
POP CX
RET
SORT ENDP
;传入参数:DI,数字存储位置
;返回值:数组
;功能:输入一个-32768~32767之间的十进制有符号数,存储在数组对应位置上
INPUT PROC NEAR
PUSH SI
PUSH DX
MOV SI,10 ;进制数
XOR DX,DX ;符号位
L6:
XOR BX,BX ;最终的数字
MOV AH,1
INT 21H
CMP AL,'-'
JNE L8
INC DX
L7:
MOV AH,1
INT 21H
CMP AL,' ' ;输入一个空格或者回车则输入结束
JE L10
CMP AL,0DH
JE L9
L8:
CMP AL,'0'
JB L0
CMP AL,'9'
JA L0 ;非数字,则重新输入
AND AX,0FH
XCHG AX,BX
MUL SI
JC L0 ;乘法溢出,则重新输入
ADD BX,AX
JC L0 ;加法溢出,则重新输入
JMP SHORT L7
L9:
MOV DL,0AH
MOV AH,2
INT 21H
L10:
CMP DX,0
JE L11
NEG BX ;求补码
L11:
MOV AX,BX
STOSW
POP DX
POP SI
RET
L0:
;异常处理
MOV AH,9
LEA DX,SEPR
INT 21H
LEA DX,MESS3
INT 21H
LEA DX,SEPR
INT 21H
JMP SHORT L6
INPUT ENDP
;传入参数:SI,数字存储位置
;返回值:数组
;功能:从存储位置上取出一个数,以十进制有符号数输出
OUTPUT PROC NEAR
PUSH CX
PUSH DI
MOV DI,10
XOR CX,CX
LODSW
MOV BX,AX
TEST BX,8000H
JZ L12
MOV DL,'-'
MOV AH,2
INT 21H
DEC BX
NOT BX
L12:
MOV AX,BX
L13:
XOR DX,DX
DIV DI
ADD DX,30H
PUSH DX
INC CX
CMP AX,0
JNE L13
MOV AH,2
L14:
POP DX
INT 21H
LOOP L14
POP DI
POP CX
RET
OUTPUT ENDP
CODES ENDS
END START
参考资料: http://z.baidu.com/question/155030625.html#here
--
2022-12-05 广告
2022-12-05 广告
图形化编程简单理解为用积木块形式编程,scratch和python也是其中的一种,属于入门级编程,以其简单生动的画面获得无数学生的喜爱,深圳市创客火科技有限公司是一家做教育无人机的公司,旗下有编程无人机,积木无人机及室内外编队,每款飞机含有...
点击进入详情页
本回答由--提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询