本题仅使用基本指令。
本题的难点在于字符与字符之间的位值如何连续判断。只要解决这个问题,本题就好解决了。
- 外层循环扫描字符串。
- 内层循环,每次扫描一个字符。
- 设置两个参数,分别是当前(位值为0的连续)长度以及最大(位值为0的连续)长度。
- 当检测到位值为0时,则让当前长度加一。当检测到1的时候就让当前长度与最大长度去比较,较大者赋值给最大长度。
- 循环结束之后的最大长度即为结果。
源代码:
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;
}