用C语言或汇编语言编写一个将数组按由小到大的顺序排序的程序,并在DSP的CCS平台上调试。

用C语言或汇编语言编写一个将数组按由小到大的顺序排序的程序,并在DSP的CCS平台上调试。,第1张

#include<stdioh>
#include<malloch>
int main()
{
int num;
printf("请输入元素的个数:");
scanf("%d",&num);
char p=(char)malloc(sizeof(char)num);
for(int i=0;i<num;i++)
{
printf("请输入第%d个元素",i);
fflush(stdin);
scanf("%c",p+i);
}
for(int i=0;i<num;i++)
{
printf("%c ",(p+i));
}
FILE fp;
if(!(fp=fopen("atxt","wb+")))
{
printf("打开文件失败");
return 1;
}
for(int i=0;i<num;i++)
{
fputc((p+i),fp);
}
return 0;
}
在ccs上已经调试了,还有不懂的话留邮箱!

#include <stdioh>
#include <stdlibh>
void Order(int num,int n) //bubble sort
{
int s=0;
int tag = false ; // 设置是否需要继续冒泡的标志位
for ( int i = 0 ; i < n ; i++)
{
for ( int j = 0 ; j < n - i - 1 ; j++)
{
if ( num[j] > num[j+1])
{
tag = true ;
int temp = num[j] ;
num[j] = num[j+1] ;
num[j+1] = temp ;
}
}
if ( !tag )
break ;
}
}
int main()
{
printf("输入数据:");
int a[10];
for (int i =0;i<10;i++)
{
scanf("%d",&a[i]);
}

Order(a,10);
printf("\n");
FILE fp;
if((fp=fopen("d:\\testtxt","w"))==NULL) /以只写方式打开文件/
{
printf("cannot open file!\n");
exit(0);
}
for (int j = 0;j<10;j++)
{
fprintf(fp,"%d ",a[j]);
printf("%d",a[j]);
printf(" ");
}
printf("\n");
fclose(fp);
return 0;

}

用循环处理。
找一个寄存器(比如SI)指向array,将SI所指向的单元减一,接着SI加一指向下一个字节单元。执行100次即可。
程序如下(在masm50和Microsoft (R) Overlay Linker Version 360环境下调试通过,利用debug看到正确结果):
dseg segment
array db 10 dup(1,2,3,4,5,6,7,8,9,10);这里定义的数据是随意写的,结果应该是0,1,2,3……
cnt equ $-array;这里直接写上100也可以
dseg ends
cseg segment
assume cs:cseg,ds:dseg
begin: mov ax,dseg
mov ds,ax
mov si,offset array
mov cx,cnt
next: dec byte ptr [si]
inc si
loop next
mov ax,4c00h
int 21h
cseg ends
end begin

下面那位大哥显然是用单片机汇编语言在回答你啊。 如果你需要8086CPU的汇编指令 以下可以参看:
该程序把buffer1中的'assembly'传到了附加段中的buffer2 需要注释可以留言给我。
DATAS SEGMENT
BUFFER1 DB 'assembly'
DATAS ENDS
EXTRA SEGMENT
BUFFER2 DB 8 DUP()
EXTRA ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,ES:EXTRA
START: MOV AX,DATAS
MOV DS,AX
MOV AX,EXTRA
MOV ES,AX
LEA BX,BUFFER1 ;BUFFER1 偏移地址给BX
LEA DI,BUFFER2 ;BUFFER2 偏移地址给SI
CLD
MOV CX,8
MOV AL,[BX]
INC BX
REP STOSB
MOV AX,4C00H
INT 21H
CODES ENDS
END START

用伪指令DB来定义
比如我想定义一个数码管0~9的断码可以这样定义
MOV DPTR,#TAB
MOVC A,@A+DPTR
TAB: DB 06H,5BH,4FH,73H,66H,6DH
DB 7DH,3FH,07H,7FH,6FH,40H
想显示什么数时只要把数放到A里面就可以了

用间接寻址指针寻址
不清楚51单片机的指令
mov a,50h
mov mp1,a MP1是间接寻址指针寄存器
mov a,r1
mov [02],a [02]是间接寻址寄存器
这样就把R1写道地址50H里面了
反之一样
mov a,50h
mov mp1,a
mov a,[02]
mov r1,a
这样就把50H地址的值写入R1了

;---------------------------
ASSUME CS:CC, DS:QW
;---------------------------
QW SEGMENT
M_1 DB 12, 13, 10, -5, -85, 37, 92, -25, 94, 10, -36
DB 1, 100, 12, -37, 85, -6, 28, 125, 34, 17, -92
LLL EQU $ - M_1
M_P DB 101 DUP(0)
M_N DB 101 DUP(0)

MSG DB 13, 10, 'Press any key to continue $'
O_P DB 13, 10, '+$'
O_N DB 13, 10, '-$'
QW ENDS
;---------------------------
CC SEGMENT
START:
MOV AX, QW
MOV DS, AX
;
CALL TONGJI
CALL DISPLAY
EXIT:
LEA DX, MSG
MOV AH, 9
INT 21H
MOV AH, 7
INT 21H
MOV AH, 4CH
INT 21H ;返回DOS
;---------------------------
TONGJI:
MOV BX, OFFSET M_1
MOV SI, OFFSET M_P
MOV DI, OFFSET M_N
MOV CX, LLL
LP: MOV AL, [BX]
CMP AL, 128
JB ZHENG
MOV [DI + 1], AL
INC DI
INC M_N
JMP NEXT
ZHENG:
MOV [SI + 1], AL
INC SI
INC M_P
NEXT:
INC BX
LOOP LP
RET
;---------------------------
DISPLAY:
LEA DX, O_P
MOV AH, 9
INT 21H
MOV AL, M_P
MOV AH, 0
CALL OUTPUT
LEA DX, O_N
MOV AH, 9
INT 21H
MOV AL, M_N
MOV AH, 0
CALL OUTPUT
RET
;---------------------------
OUTPUT:
MOV BX, 10
MOV CX, 0
OL1:MOV DX, 0
DIV BX
ADD DL, '0'
PUSH DX
INC CX
CMP AX, 0
JNZ OL1
MOV AH, 2
OL2:POP DX
INT 21H
LOOP OL2
RET
;---------------------------
CC ENDS
END START
;---------------------------
程序执行结果如下:
C:\MASM>ww
+15
-7
Press any key to continue
C:\MASM>


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/10440787.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-08
下一篇 2023-05-08

发表评论

登录后才能评论

评论列表(0条)

保存