上代码,注释在代码中有
#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;
}
如果对于这些有一部分看不懂,请自行百度一下,没有复杂的句子,很好理解的;如果大家有更简单的代码,可以评论交流啊~我们一起学习进步,加油!