汇编题目-输入一个字符串,输出位值连续为0的最大长度。

本题仅使用基本指令。

本题的难点在于字符与字符之间的位值如何连续判断。只要解决这个问题,本题就好解决了。

  1. 外层循环扫描字符串。
  2. 内层循环,每次扫描一个字符。
  3. 设置两个参数,分别是当前(位值为0的连续)长度以及最大(位值为0的连续)长度。
  4. 当检测到位值为0时,则让当前长度加一。当检测到1的时候就让当前长度与最大长度去比较,较大者赋值给最大长度。
  5. 循环结束之后的最大长度即为结果。

源代码:

        char str1[100];
	int num;
	while (1) {
		cout << "请输入字符串";
		cin >> str1;
		cout << "输出字符串二进制形式:";
		for (int j = 0; str1[j] != '\0'; j++) {
			for (int i = 7; i >= 0; i--)
			{
				cout << ((str1[j] >> i) & 1);
			}
		}
		cout << endl;

		_asm {
			lea EAX, str1;
			xor BL, BL;//存放最大长度
			xor BH, BH;//存放当前长度
			xor ECX, ECX;
			//外层循环扫描字符串
		loop1:
			mov DL, [EAX + ECX];
			//内层循环,每次扫描一个字符
			mov DH, 1H;
		loop4:
			shl DL, 1H;
			jc loop2;
			//CF==0
			inc BH;
			jmp loop3;
		loop2://CF==1
			cmp BL, BH;
			jg loop5;
			mov BL, BH;//更新最大长度
		loop5:
			xor BH, BH;//将当前长度初始化0
		loop3:
			inc DH;
			cmp DH, 8H;
			jle loop4;
			inc ECX;
			cmp[EAX + ECX], 0H;
			jne loop1;
			//处理结尾的位值为0的位串
			cmp BL, BH;
			jg loop6;
			mov BL, BH;
		loop6:
			movzx EBX, BL;
			mov num, EBX;
		}
		cout << "位值连续为0的最大长度为" << num << endl;
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值