汇编实验 实验二 分支循环结构循环练习


上代码,注释在代码中有

#include<stdio.h>


char s[20];
int index,lth;
char a;

int main()
{
	printf("Please input a string(length<9):\n");
	scanf("%s",s);
	printf("Please input the index of the char to display:\n");
	scanf("%d",&index);

	_asm{
		
		;首先获得字符串的长度
		lea edi,s      ;使得edi指向字符串
		xor ecx,ecx    ;假设字符串无限长
		xor al,al      ;字符串结束标志
		dec edi        ;先减一
label1:
		inc edi        ;是edi指向待判断字符
		cmp al,[edi]   ;判断是不是结束标志
		loopne label1   ;不是就结束

		;字符串的长度在ecx中存着
		neg ecx   ;因为ecx是从0开始减的,所以取反减一才是字符串的长度
		dec ecx
		;mov lth,ecx
		

		;判断index是否合法
		cmp ecx,index
		jg label2
		jmp over   ;也可以采用int 调用dos功能
label2:
		lea edi,s
		mov eax,index
		mov al,byte ptr [edi + eax ]
		mov a,al
	}
	//printf("%d",lth);
	printf("The %d is %c!\n",index,a);
	return 0;

over:printf("the index is invalid!\n");
	 return 0;
}

在这里插入图片描述
在这里插入图片描述

#include<stdio.h>


char s[20];
int index=0,lth=0,count;
char a,c;
int main()
{
	
	//输入字符串事件
	do
	{
		fflush(stdout);
		//当字符串长度不符合要求时
		if(lth>=9)
			printf("The string is too long!\n");
		
		//输入字符串
		printf("Please input a string(length<9):");

		scanf("%s",s);
		
		_asm{	
				;获得字符串的长度
				lea edi,s      ;使得edi指向字符串
				xor ecx,ecx    ;假设字符串无限长
				xor al,al      ;字符串结束标志
				dec edi        ;先减一
label1:
				inc edi        ;是edi指向待判断字符
				cmp al,[edi]   ;判断是不是结束标志
				loopne label1   ;不是就结束

				;字符串的长度在ecx中存着
				neg ecx
				dec ecx
				mov lth,ecx
			}
	}while(lth>=9);
		


	//输入位置号事件
	do
	{
		if(index>=lth)
			printf("The index is invalid!\n");
		printf("Please input the index of the char to display:");
		scanf("%d",&index);
	}while(index>=lth);


	//得到相应位置上的字符
	_asm
	{
		lea edi,s  ;取地址
		mov eax,index  ;移index入eax
		mov al,byte ptr [edi + eax ] ;取要求的地址
		mov a,al  
	}
	printf("The char is %c!\n",a);


	//特定字符数目
	printf("Please input a char:");
	fflush(stdin); //刷新标准输入缓冲区
	c=getchar();
	_asm
	{
		mov edx,0     ;edx是计数器
		lea edi,s     ;取首地址
		mov al,c      ;将要判断的字符的ASCII码给al
		mov ecx,lth   ;设置循环次数

		;倒序寻找
label2:
		cmp al,[edi + ecx -1 ]  ;比较
		jne label3
		inc edx     ;计数器加一
label3:
		loop label2

		mov count,edx
	}
	printf("The count of '%c' is : %d\n",c,count);

	

	return 0;
}

不一定非要用loope指令,个人认为直接跳转比较好一点,只是我最近学的loop的这种循环方式,所以练练手,其实还是直接比较跳转方便而且高效,也就是for(),而loop相当于do while那种形式,所以,各有优缺吧;

在这里插入图片描述

#include<stdio.h>

char s;
char a[20];

int main()
{
	printf("please input a char :");
	scanf("%c",&s);

	_asm{
		lea edx,a	;a的首地址
		mov al,s    ;把s的ASCII码给al
		mov ecx,8	;ecx循环次数
		mov edi,0	;edi 1的个数
		mov [edx + 8] ,0 ;字符串的结束标志
		
label1:
		ror al,1    ;循环右移一位,最低位进入cf
		jnc label2	;cf=0的时候跳转
		mov byte ptr [edx+ecx-1],31h    ;1的ASCII码是31H
		inc edi		;1计数器++
		jmp label3
label2:
		mov byte ptr [edx+ecx-1],30h 
label3:	
		loop label1
	
	

		;判断一下edi的奇偶性,偶数的话最高位加上1 
		ror edi,1				;ror循环右移,不带进阶位,但是移动的哪一位也会进入cf中
		jc label4
		mov byte ptr [edx],31h
label4:
	
	}
	printf("%s\n",a);
	return 0;
}

如果对于这些有一部分看不懂,请自行百度一下,没有复杂的句子,很好理解的;如果大家有更简单的代码,可以评论交流啊~我们一起学习进步,加油!

发布了29 篇原创文章 · 获赞 13 · 访问量 2768

猜你喜欢

转载自blog.csdn.net/zmx2473162621/article/details/103042573
今日推荐