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.拓展:如果题目为比较两个字 ...
随机推荐
- 题解【Vijos1159】岳麓山上打水
题面 迭代加深搜索模板题. 注意开始时要先对桶的容量从小到大排序. 达到搜索层数时使用完全背包\(\text{check}\)即可. 具体实现参考代码. #include <bits/stdc+ ...
- Ansible:playbook-nagios
一.创建目录结构 cd /etc/ansible/roles/ mkdir nagios/{files,templates,vars,handlers,meta,default,tasks} -pv ...
- js清空子节点
删除全部子节点 function removeAllChild(){ var div = document.getElementById("div1"); while(div.ha ...
- Java开发新闻管理系统(前后端)+爬虫百度、新浪等新闻
ForFuture News 新闻管理系统 项目演示地址:http://www.ganquanzhong.top [注]:文档下 ...
- Microsonf visual c++ 14+ 离线内网安装
内网离线安装方法:先下载官方的visualcppbuildtools: <br href=http://go.microsoft.com/fwlink/?LinkId=691126 >& ...
- css 单位之px , em , rem
px : Pixel像素单位.像素是相对显示器分辨率而言.em : 相对长度单位,基准点为父节点字体的大小,如果自身定义了font-size按自身来计算(浏览器默认字体是16px).rem : 相对单 ...
- String.valueOf()和toString()的区别
1.String.valueOf(): Object obj=null; String str=""; str=String.valueOf(obj); //str=obj.toS ...
- python基于百度AI开发文字识别
很多场景都会用到文字识别,比如app或者网站里都会上传身份证等证件以及财务系统识别报销证件等等 第一步,你需要去百度AI里去注册一个账号,然后新建一个文字识别的应用 然后你将得到一个API Key 和 ...
- jQuery对象和语法
jQuery类型 引入jquery.js时,其实是向全局作用域中,添加了一个新的类型--jQuery. 构造函数:负责创建jQuery类型的对象. 原型对象:保存jQuery对象可用的所有简化版API ...
- STA之RC Corner再论
Q:RC-Corner跟PVT怎么组合? A:通常的组合: Q:通常说的ttcorner指的是啥? A:@孟时光 ttcorner是指管子在tt+RCtyp吧. Typesof corners W ...