一.实验题目:求有符号数组中的最大和最小值,给数组中的值排序(从大到小)二.程序内容及结果
1.求有符号数组中的最大和最小值
#include
#include
int main()
{
int buffer[10]={12,10,9,100,134,259,1000,1456,-234,-3456};
int max;//用来保存最大值
int min;//用来保存最小值
_asm
{
LEA ESI,buffer//数组的首地址付给ESI
MOV EAX,[ESI]//用EAX始终储存数组中的最大值
MOV EDX,[ESI]//用EDX始终储存数组中的最小值
MOV CX,10//CX为计数器,一共需要比较9次
NEXT:
DEC CX//计数器减1
JZ LABEND//如果计数器变为0,就跳转到LABEND
ADD ESI,4//buffer中的数为整形,32位,4个字节,所以指针要加4
CMP EAX,[ESI]//比较当前最大值与数组中的值得大小MIN
JGE MIN//如果当前最大值大于等于数组中的值,直接跳转
MOV EAX,[ESI]//否则,数组中的值付给EAX
JMP MIN//无条件跳转到MIN
MIN:
CMP EDX,[ESI]//比较当前最小值与数组中的值得大小
JLE NEXT//如果当前最小值小于等于数组中的值,直接跳转到NEXT
MOV EDX,[ESI]//否则,数组中的值付给EDX
JMP NEXT//无条件跳转到NEXT
LABEND:
MOV max,EAX//将最大值付给max
MOV min,EDX//将最小值付给min
}
printf("max=%d\n",max);
printf("min=%d\n",min);
return 0;
}
2.给一个数组中的值按从大到小排序
#include
#include
int main()
{
int buffer[10]={3457,-230,134,456,56,98,1340,-908,3456,40};
_asm
{
LEA ESI,buffer//数组的首地址赋给ESI
MOV EAX,[ESI]//EAX保存最小值
MOV EBX,10//计数器,外循环9次比较
MOV ECX,10//计数器,内循环比较
NEXT:
DEC EBX//计数器减1
JZ LABEND//如果计数器为0,循环结束,跳转到最后
MIDDLE:
DEC ECX//计数器减1
JZ COM//如果计数器为0,跳转到COM
ADD ESI,4//操作数为整形,32位,四个字节
CMP EAX,[ESI]//将当前最小值与数组中的值进行比较
JLE MIDDLE//如果小于等于,那么结束本次比较,进行下一个数的比较
XCHG EAX,[ESI]//否则两个数交换
JMP MIDDLE//无条件跳转
COM:
XCHG EAX,[ESI]//每次循环的最后一个数储存最小数
MOV ECX,EBX//内循环计数器与外循环计数器相等
LEA ESI,buffer//指针由数组末尾跳转到开始
JMP NEXT//无条件跳转
LABEND:
}
printf("十个数从大到小的顺序为:\n");
for(int n=0;n<10;n++)
{
printf("%d\t",buffer[n]);
}
printf("\n");
return 0;
}