C语言与汇编的嵌入式编程:统计字符串中各字符出现的次数
原始C语言:
#include<stdio.h>
void main(){ char str[];
char pipei[] = "abcdefghijklmnopqrstuvwxyz";
int count[]={};
int i=,j=; scanf("%s",str);
printf("%s\n",str); for(i=;i<;i++)
{
for(j=;j<;j++)
{
if(str[i]==pipei[j])
count[j]+=;
}
} for(j=;j<;j++)
{
if(count[j]>)
printf("%c=%d\n",pipei[j],count[j]);
}
}
加入汇编后代码:
#include<stdio.h>
void main(){ char str[];
char pipei[] = "abcdefghijklmnopqrstuvwxyz";
int count[]={};
int i=,j=; scanf("%s",str);
printf("%s\n",str); //外层循环start
_asm{
mov eax, //i=0
mov ecx, //i<1024
loop1:
mov i,eax
push eax
push ecx
};
//printf("%c\t",str[i]); //内层循环start
_asm{
mov eax,
mov ecx,
loop2:
mov j,eax
push eax
push ecx
}; if(str[i]==pipei[j])
{
count[j]+=;
} //内循环end
__asm{
pop ecx
pop eax
add eax,
loop loop2
}; //外循环end
_asm{
pop ecx
pop eax
add eax,
loop loop1
}; //输出统计个数
//外层循环start
_asm{
mov eax, //i=0
mov ecx, //i<26
loop3:
mov j,eax
push eax
push ecx
}; if(count[j]>)
printf("%c=%d\n",pipei[j],count[j]); //外循环end
_asm{
pop ecx
pop eax
add eax,
loop loop3
}; }
后面有时间再优化了。。。。
优化如下:
需要掌握的知识 if语句的汇编表示
构造单循环:
#include<stdio.h>
void main(){ char str[];
char pipei[] = "abcdefghijklmnopqrstuvwxyz";
int count[]={};
int i=,j=; char *str1 = "i=%d\n";
char *str2 = "%d=%c\t"; scanf("%s",str);
printf("%s\n",str); printf(str2,i,str[i]);
//mov edx,dword ptr [ebp-48Ch]
//movsx eax,byte ptr [ebp+edx-400h]
//push eax
//mov ecx,dword ptr [ebp-48Ch]
//push ecx
//mov edx,dword ptr [ebp-498h]
//push edx
//call printf (0040d6c0)
//add esp,0Ch
// ==
//mov edx, i
//movsx eax,str[edx]
//push eax
//mov ecx,i
//push ecx
//mov edx,str2
//push edx
//call printf
//add esp,12 //12=3个变量*4 _asm{
mov i, //i=0
start_1024: nop
mov eax,i
add eax,
mov i,eax //i++ cmp i, // if i<10
jge end_1024 //逐个输出 printf(str2,str[i]);
mov edx, i
movsx eax,str[edx]
push eax
mov ecx,i
push ecx
mov edx,str2
push edx
call printf
add esp, //12=3个变量*4 jmp start_1024 //for 1024 end_1024: nop
}
}

进一步构造嵌套循环:
#include<stdio.h>
void main(){ char str[];
char pipei[] = "abcdefghijklmnopqrstuvwxyz";
int count[]={};
int i=,j=; char *str1 = "i=%d\n";
char *str2 = "\n第一层循环%d=%c\n";
char *str3 = "%d=%c\t"; scanf("%s",str);
printf("%s\n",str); printf(str2,i,str[i]); _asm{
//第一个外循环
mov i, //i=0
start_1024: nop
mov eax,i
add eax,
mov i,eax //i++
cmp i, // if i<10
jge end_1024 //第二个内循环
mov j, //j=0
start_26: nop
mov eax,j
add eax,
mov j,eax //j++
cmp j,
jge end_26 //逐个输出pipei
mov edx, j
movsx eax,pipei[edx]
push eax
mov ecx,j
push ecx
mov edx,str3
push edx
call printf
add esp, //12=3个变量*4 jmp start_26 //for 1024
end_26: nop //逐个输出 printf(str2,str[i]);
mov edx, i
movsx eax,str[edx]
push eax
mov ecx,i
push ecx
mov edx,str2
push edx
call printf
add esp, //12=3个变量*4 jmp start_1024 //for 1024 end_1024: nop } }

加入判断与统计输出代码:
#include<stdio.h>
void main(){
char str[];
char pipei[] = "abcdefghijklmnopqrstuvwxyz";
int count[]={};
int i=,j=; char *str1 = "i=%d\n";
char *str2 = "\n第一层循环%d=%c\n";
char *str3 = "i=%d,j=%d,c=%c\t";
char *str4 = "%c=%d\t"; scanf("%s",str);
printf("%s\n",str); _asm{
//第一个外循环
mov i,- //i=0
start_1024: nop
mov eax,i
add eax,
mov i,eax //i++
cmp i, // if i<1024
jge end_1024 //判断第i个字符串是否为结束符,如果是则退出总循环
movsx eax,str[eax]
cmp eax,0h
je end_1024 // \n第一层循环%d=%c\n printf(str2,i,str[i]);
mov edx, i
movsx eax,str[edx]
push eax
mov ecx,i
push ecx
mov edx,str2
push edx
call printf
add esp, //12=3个变量*4 //第二个内循环
mov j,- //j=-1
start_26: nop
mov eax,j
add eax,
mov j,eax //j++
cmp j,
jge end_26 //逐个输出 "i=%d,j=%d,c=%c\t"; pipei
mov edx, j
movsx eax,pipei[edx]
push eax
mov ecx,j
push ecx
mov ecx,i
push ecx
mov edx,str3
push edx
call printf
add esp, //12=4个变量*4 //判断str[i]是否与pipei[j]相等,相等加一并退出第二循环
//if(str[i]==pipei[j])
mov edx,i
movsx eax,str[edx]
mov ecx,j
movsx edx,pipei[ecx]
cmp eax,edx
jne end_count//不相等
//{count[j]+=1 //相等
mov eax,j
mov ecx,count[eax*]
add ecx,
mov edx,j
mov count[edx*],ecx
//break;
jmp start_1024 //如果找到一个匹配的,则退出第二循环 end_count: nop
jmp start_26 //for 26
end_26: nop jmp start_1024 //for 1024
end_1024: nop
//到这里统计算法已经结束 //输出统计个数
mov j,- //j=-1
start_all: nop
mov eax,j
add eax,
mov j,eax //j++
cmp j,
jge end_all //逐个输出printf(str4,pipei[j],count[j]);
mov edx,j
mov ecx,count[edx*]
push ecx
movsx eax,pipei[edx]
push eax
mov edx,str4
push edx
call printf
add esp, //12=3个变量*4 jmp start_all //for 26
end_all: nop }
}

C语言与汇编的嵌入式编程:统计字符串中各字符出现的次数的更多相关文章
- 统计字符串中每个字符出现的次数(Python)
#统计字符串中每个字符出现的次数 以The quick brown fox jumps over the lazy dog为例 message='The quick brown fox jumps o ...
- Java基础知识强化之集合框架笔记61:Map集合之统计字符串中每个字符出现的次数的案例
1. 首先我们看看统计字符串中每个字符出现的次数的案例图解: 2. 代码实现: (1)需求 :"aababcabcdabcde",获取字符串中每一个字母出现的次数要求结果:a(5) ...
- 使用Map,统计字符串中每个字符出现的次数
package seday13; import java.util.HashMap; import java.util.Map; /** * @author xingsir * 统计字符串中每个字符出 ...
- Java中统计字符串中各个字符出现的次数
import java.util.Iterator; import java.util.Set; import java.util.TreeMap; public class TreeMapDemo ...
- javascript 统计字符串中每个字符出现的次数
var str = "abdcadfasfdbadfafdasdfasyweroweurowqrewqrwqrebwqrewqrejwq;;"; // console.log(nu ...
- Java案例——统计字符串中各种字符出现的次数
/*案例:统计各种字符在字符串中出现的次数 分析:只考虑三种字符类型的情况下(大写字母,小写字母,数字) 1.使用Scanner 类获取字符串数据 2.遍历字符串得到每一个字符 3.判断每一个字符是那 ...
- C语言与汇编的嵌入式编程:main中模拟函数的调用(两数交换)
编写一个两数交换函数swap,具体代码如下: #include<stdio.h> void swap(int *p1,int *p2) { int temp; temp = *p1; *p ...
- loadrunner统计字符串中指定字符出现的次数
Action() { char *str="sdfas1,sdfsdf2,sdfsdfsdfdsf3,sdfsdfsdfsdfds4,fsdfdsf5,sdfdsfsd6,fsdfsd7sd ...
- 【面试题总结】1、统计字符串中某个字符出现的次数(2-Python实现)
1.可以使用Python的字典实现,对于一个特定的字符串,使用for循环遍历其中的字符,并保存成字典形式.字典的key为字符,value为字符在整个字符串中出现的次数. 2.拓展:如果题目为比较两个字 ...
随机推荐
- 呼叫到达率100%,网易云信信令SDK免费上线!
近期,网易云信推出一款稳定可靠.到达率高.扩展性较强的信令通道产品--信令SDK.它能够提供可靠的消息通道,可用于搭建音视频场景下的呼叫邀请机制.信令SDK目前兼容市面上所有主流的音视频SDK,呼叫到 ...
- batchsize用法 以及实现前向运算的矩阵乘法方式
batchsize用法 以及实现前向运算的矩阵乘法方式 待办 使用batchsize可以把矩阵缩小,采用矩阵乘法的形式可以一次计算多个经过神经网络的结果,然后通过交叉熵进行计算总的损失得到结果. 所以 ...
- navicat操作mysql数据库
1.利用mysql来做ER图 1.1点击模型->新建模型->点击表->新建表,这样就可以了 1.2 建好的ER图->工具 有导出到sql ,有同步到数据库 1.3 建好的表,可 ...
- LED Holiday Light -Picking LED Christmas Lights, 4 Things
LED Christmas lights are not very cheap, but you should know that LED lights can be used for more th ...
- 后台异常 - Content is not allowed in prolog
问题原因 解析XML报的错,XML拼的不对
- linux异常 - 网卡故障
问题描述: 弹出界面eth0: 错误:没有找到合适的设备:没有找到可用于链接System eth0 的设备 解决方案: 排错步骤如下: 1:查看系统是否识别相应网卡(发现没有eth0网卡存在): 根据 ...
- Python记
在企业应用领域,Java或C#都是不错的选择.
- ISCC2018_leftleftrightright-Writeup
leftleftrightright(150) 这个题学到了不少东西,值得认真写一下 下载好文件后发现是upx的壳,upx -d直接脱掉后运行,发现是经典的check输入的题目(作为一个linuxer ...
- 算法导论2-4 O(nlgn)时间复杂度求逆序对
def mergesort(nums,le,ri): if le>ri-2: return 0 mi=le+(ri-le)//2 a=mergesort(nums,le,mi) b=merges ...
- input如何上传文件
1)绑定input[type='file']的change事件 <input @change="uploadPhoto($event)" type="file&qu ...