原始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语言与汇编的嵌入式编程:统计字符串中各字符出现的次数的更多相关文章

  1. 统计字符串中每个字符出现的次数(Python)

    #统计字符串中每个字符出现的次数 以The quick brown fox jumps over the lazy dog为例 message='The quick brown fox jumps o ...

  2. Java基础知识强化之集合框架笔记61:Map集合之统计字符串中每个字符出现的次数的案例

    1. 首先我们看看统计字符串中每个字符出现的次数的案例图解: 2. 代码实现: (1)需求 :"aababcabcdabcde",获取字符串中每一个字母出现的次数要求结果:a(5) ...

  3. 使用Map,统计字符串中每个字符出现的次数

    package seday13; import java.util.HashMap; import java.util.Map; /** * @author xingsir * 统计字符串中每个字符出 ...

  4. Java中统计字符串中各个字符出现的次数

    import java.util.Iterator; import java.util.Set; import java.util.TreeMap; public class TreeMapDemo ...

  5. javascript 统计字符串中每个字符出现的次数

    var str = "abdcadfasfdbadfafdasdfasyweroweurowqrewqrwqrebwqrewqrejwq;;"; // console.log(nu ...

  6. Java案例——统计字符串中各种字符出现的次数

    /*案例:统计各种字符在字符串中出现的次数 分析:只考虑三种字符类型的情况下(大写字母,小写字母,数字) 1.使用Scanner 类获取字符串数据 2.遍历字符串得到每一个字符 3.判断每一个字符是那 ...

  7. C语言与汇编的嵌入式编程:main中模拟函数的调用(两数交换)

    编写一个两数交换函数swap,具体代码如下: #include<stdio.h> void swap(int *p1,int *p2) { int temp; temp = *p1; *p ...

  8. loadrunner统计字符串中指定字符出现的次数

    Action() { char *str="sdfas1,sdfsdf2,sdfsdfsdfdsf3,sdfsdfsdfsdfds4,fsdfdsf5,sdfdsfsd6,fsdfsd7sd ...

  9. 【面试题总结】1、统计字符串中某个字符出现的次数(2-Python实现)

    1.可以使用Python的字典实现,对于一个特定的字符串,使用for循环遍历其中的字符,并保存成字典形式.字典的key为字符,value为字符在整个字符串中出现的次数. 2.拓展:如果题目为比较两个字 ...

随机推荐

  1. 增删改查-删除(php)

    <!DOCTYPE html> <html><script type="text/javascript" src="jquery-1.11. ...

  2. linq和隐式类型var

    隐式类型 var 强类型,声明的时候必须给变量赋值,编译器会根据值来确定其类型.只能出现在局部变量或脚本代码中. 使用范围: 简单类型:如int string等 复杂类型:如数组.类等 逻辑语句:fo ...

  3. SQL With As的用法

    WITH AS,也叫子查询部分(subquery factoring),可以定义一个SQL片断,该SQL片断会被整个SQL语句用到.可以使SQL语句的可读性更高,也可以在UNION ALL的不同部分, ...

  4. codeforces 1283D. Christmas Trees(bfs)

    链接: https://codeforces.com/contest/1283/problem/D 题意:给定n个不同的整数点,让你找m个不同的整数点,使得这m个点到到这n个点最小距离之和最小. 思路 ...

  5. QT5.1+中文乱码问题

    原文连接:https://blog.csdn.net/liyuanbhu/article/details/72596952 QT中规定 QString 的 const char* 构造函数是调用 fr ...

  6. javaSE--基础02

    本章目标 一. 运算符★赋值运算符关系运算符逻辑运算符  三元运算符 二. 进制与位运算符[选学]   三. 流程控制结构 √ 四. 顺序结构 √  五. 分支结构★     六. 循环结构★ 七. ...

  7. python之路之反射

    这个是上两个的加强版

  8. Solr与JDK对应版本关系,Tomcat与JDK版本对应关系

    最新在部署solrCloud集群,由于自己机器上用的JDK都是JDK1.7的,然后我就从网上下载了最新下载了最先的solr6.6.0和最新的Tomcat9.0,部署了一下,开始报错,提示solr和JD ...

  9. PHP Apache/Nginx/IIS等各环境下的伪静态配置

    一.Apache的伪静态配置 1.网站根目录下需要有 .htaccess 文件,没有则自己创建一个,内容如下: <IfModule mod_rewrite.c> RewriteEngine ...

  10. 题解 【Codeforces387B】George and Round

    以下选自官方题解: 考虑困难的需求数量,我们将覆盖这些困难, 然后我们将提出新的问题,并准备新的问题来覆盖其他需求. 很明显,如果我们决定满足从n中抽取i的要求,那么最好采用那些复杂性最小的要求. 让 ...